【问题标题】:EventListener adds new fields but Controller doesn't recognize themEventListener 添加了新字段,但 Controller 无法识别它们
【发布时间】:2020-01-17 08:52:52
【问题描述】:

我正在尝试根据从列表中选择的值将新字段添加到我的表单中。我的问题是在点击“提交”时,代码运行eventListener方法(其中添加了新字段)后,控制器得到了没有新字段的表单!我很难理解问题出在哪里。

这是我的表单生成器:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('DataTypeList', ChoiceType::class, [
        'required' => false,
        'mapped'   => false,
        'choices'  => [
            "String Type"   => "DataTypeString",
            "Monetary Type" => "DataTypeMonetaryNumber"
        ],
        'attr'     => ['style' => 'width: 50vw'],
    ]);

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        $form = $event->getForm();
        $data = $event->getData();

        if ($data['DataTypeList'] === "DataTypeString") {
            $form->add("DataTypeString", TextType::class, [
                'required'       => true,
                'mapped'         => false,
                'error_bubbling' => true,
                'attr'           => [
                    'placeholder' => 'This is an example',
                    'style'       => 'width: 50vw'
                ]
            ]);
        }
    });
}

这是我的控制器:

$form = $this->createForm('data\AddType', $data, array(
    'action' => $this->generateUrl('data_add', [
        'dataKey_id' => $data->getDataAccessKey()->getId(),
        'returnRoute' => $returnRoute
    ]),
    'method' => 'POST',
));

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
    //Here I make a dump() on $request that shows that my form only contains 'DataTypeList'
}

提前感谢您的帮助!

【问题讨论】:

    标签: forms symfony symfony-3.4


    【解决方案1】:

    这对我有用:

        if ($form->isSubmitted() && $form->isValid()) {
            dump($form->get('DataTypeString')->getData()); //return null;
        }
    

    返回null,因为你在PRE_SUBMIT中添加了你的字段,并且你没有设置数据,但是没有异常,所以DataTypeString字段存在。

    更新

    PRE_SUBMIT 事件在 PHP 中的提交操作之前执行。

    这是过程

    1. 创建表单并构建
    2. 给表单设置数据(这个数据是你控制器中createForm方法的第二个参数)
    3. 构建表单视图并在浏览器上显示表单
    4. 您在浏览器上填写表单并提交数据
    5. 当您在控制器中处理请求时,他查看 $_POST 变量并看到您单击表单的“提交”按钮,他执行 PRE_SUBMIT 事件 HERE,然后执行 $form- >提交和 POST_SUBMIT 事件
    6. 在 POST_SUBMIT 中,他验证表单并在表单字段上设置错误
    7. 如果您的表单无效,请不要输入if($form->isValid()) 并构建表单视图。这一次您的表单中有 DataTypeString 字段,因为 PRE_SUBMIT 添加了该字段

    为什么要在PRE_SUBMIT 中添加这个字段?

    【讨论】:

    • 我也得到了 null 但是 DataTypeString 位于哪里?我的转储只扔给我 DataTypeList: +request: ParameterBag {#10 ▼ #parameters: array:1 [▼ "add" => array:2 [▼ "DataTypeList" => "DataTypeString" "_token" => "8bI1iK1r- LDlMI" ] ] }
    • IMO 这不是直接从表单“提交”,因此数据不在 $_POST 变量中,因此不在请求中。在侦听器将表单项添加到表单后发送表单,但不在请求中。
    • 感谢您的解释,他们让我意识到我的错误(检查 $request 变量而不是 $form)。我在 pre_submit 期间添加了该字段,因为我不希望表单将其视为有效,因此使用新的表单字段刷新页面。
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2015-07-07
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    相关资源
    最近更新 更多