在Symfony 2中验证动态加载的选项

Chr*_*ris 19 validation symfony symfony-2.1

我在我的表单中有一个名为*sub_choice*的选择字段类型,其选择将通过AJAX动态加载,具体取决于父选择字段的选定值,名为*parent_choice*.加载选项非常有效,但在提交时验证sub_choice的值时遇到问题.它给出了"此值无效"验证错误,因为提交的值在构建时不在sub_choice字段的选项中.那么有没有办法可以正确验证sub_choice字段的提交值?下面是构建表单的代码.我正在使用Symfony 2.1.

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('parent_choice', 'entity', array(
                    'label' => 'Parent Choice',
                    'class' => 'Acme\TestBundle\Entity\ParentChoice'
    ));

    $builder->add('sub_choice', 'choice', array(
                    'label' => 'Sub Choice',
                    'choices' => array(),
                    'virtual' => true
    ));
}
Run Code Online (Sandbox Code Playgroud)

小智 22

要做到这一点,您需要sub_choice在提交表单之前覆盖该字段:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    ...

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        $parentChoice = $event->getData();
        $subChoices = $this->getValidChoicesFor($parentChoice);

        $event->getForm()->add('sub_choice', 'choice', [
            'label'   => 'Sub Choice',
            'choices' => $subChoices,
        ]);
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案最完整,最直接地给出了问题所需:选项设置依赖于另一个选定的值,而不必乱七八糟地提供所有选项以通过验证,然后可能稍后重新设置选项.这让我觉得是"适当的Symfony 2"解决方案. (2认同)

小智 -6

假设对于子选择你有 id 的权利吗?创建并清空具有一定数量值的数组,并将其作为选择

$indexedArray = []; for ($i=0; $i<999; $i++){ $indexedArray[$i]= ''; }

然后'choices' => $indexedArray,:)