在PRE_SUBMIT上向Symfony表单添加动态元素

时间:2015-03-02 20:50:04

标签: php forms symfony

我正在尝试使用Symfony Form Component和Silex框架。我在表单类型类的buildForm方法中添加了一些字段。用户也可以点击按钮,并在前端使用javascript添加无限textarea元素。现在,在PRE_SUBMIT事件中,我执行以下操作将这些字段添加到表单

        $data = $event->getData();
    $form = $event->getForm();
    foreach ($data as $key => $value) {
        if (stristr($key, '_tb_') !== false) {
            $id = str_ireplace('_tb_', '', $key);
            $form->add('_tb_' . $id, 'hidden');
            $form->add('_title_' . $id, 'text', [
                'required'    => false,
                'label'       => 'Title',
                'constraints' => [
                    new Length(['min' => 6]),
                ]
            ]);
            $form->add('_img_url_' . $id, 'text', [
                'required'    => false,
                'label'       => 'Image Url',
                'constraints' => [
                    new Url(),
                ]
            ]);
            $form->add('_img_alt_' . $id, 'text', [
                'required'    => false,
                'label'       => 'Image Alt',
                'constraints' => []
            ]);
            $form->add('_content_' . $id, 'textarea', [
                'required'    => true,
                'attr'        => [
                    'data-role' => '_richeditor'
                ],
                'constraints' => [
                    new Length(['min' => 100]),
                ]
            ]);
        }
    }

我可以看到这些字段被添加到表单中并在第一次提交表单后填充但由于某种原因,仅对这些新添加的字段忽略所有约束。有没有办法强制Form遵守新添加元素的约束?

1 个答案:

答案 0 :(得分:1)

表单组件和验证可能很棘手。一个简单的误解是表格类型选项"要求"将暗示NotBlank验证约束。事实并非如此,the docs explain that option是表面的,并且独立于验证"仅涉及表单元素呈现(HTML5需要attr,label等)。

为了使事情更棘手,您指定了最小长度约束,可以假设没有(或零)长度将被视为无效。情况也并非如此。长度验证器仅与non-null / non-empty values有关。 : - /

原来如此!修改文本区域字段以包含NotBlank()应该可以解决问题:

$form->add('_content_' . $id, 'textarea', [
    'required'    => true,
    'attr'        => [
        'data-role' => '_richeditor'
    ],
    'constraints' => [
        new NotBlank(),
        new Length(['min' => 100]),
    ]
]);