Php 在Symfony2 form builder中允许选择字段类型的所有值

Php 在Symfony2 form builder中允许选择字段类型的所有值,php,forms,symfony,formbuilder,choicefield,Php,Forms,Symfony,Formbuilder,Choicefield,我有一段时间的问题,我读了很多关于这个主题的类似问题,但不能实现在我的情况下的答案 我有一个用Ajax填充的select字段。因此,在我的form builder中,我有以下代码: VilleType.php 但是我的表单从不验证,因为它们在这个选择字段中没有价值。但我不能在里面添加值,因为我事先不知道用户将输入什么值 所以我的问题是如何从Symfony禁用此字段的验证。或者允许它接受所有值 谢谢 编辑 在这里,我尝试了一种新的方法。我使用事件侦听器修改我的字段,其值大于用户提交的值 pu

我有一段时间的问题,我读了很多关于这个主题的类似问题,但不能实现在我的情况下的答案

我有一个用Ajax填充的select字段。因此,在我的form builder中,我有以下代码:

VilleType.php

但是我的表单从不验证,因为它们在这个选择字段中没有价值。但我不能在里面添加值,因为我事先不知道用户将输入什么值

所以我的问题是如何从Symfony禁用此字段的验证。或者允许它接受所有值

谢谢

编辑

在这里,我尝试了一种新的方法。我使用事件侦听器修改我的字段,其值大于用户提交的值

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

        $builder
                ->add('nomComplet', 'choice');


        $builder->get('nomComplet')->addEventListener(
                FormEvents::PRE_SUBMIT, function(FormEvent $event) /* use ($formModifier) */ {

                    $ville = $event->getData();
                    $event->getForm()->add('nomComplet', 'choice', array('choices' => $ville));
                    // $formModifier($event->getForm()->getParent(), $ville);
                }
        );
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'MDB\AdresseBundle\Entity\Ville'
        ));
    }

    /**
     * @return string
     */
    public function getName() {
        return 'mdb_adressebundle_ville';
    }

}
MDB\adresebundle\Entity\Ville.php

这应该行得通

演示此案例的整个项目:

删除/更改文件时的代码:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('choiceField', 'choice', array(
            'attr' => array(
                'class' => 'choiceField'
            )
        ))
    ;

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
        $form = $event->getForm();
        $data = $event->getData();
        $form->remove('choiceField');
        $form->add('choiceField', 'choice', array(
            'attr' => array(
                'class' => 'choiceField',
            ),
            'choices' => array(
                $data['choiceField'] => $data['choiceField'],
            )
        ));
    });

    $builder->add('save', 'submit');
}
所以我的问题是如何从Symfony禁用此字段的验证

根据,您可以使用POST_SUBMIT事件抑制表单验证,并防止调用ValidationListener

$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
    $event->stopPropagation();
}, 900); // Always set a higher priority than ValidationListener

请向我们提供有关NomComplett实体字段的更多详细信息:您实体中该字段的字段类型/ORM设置/该字段的值(实体、文本/整数)对不起,回复时间,您可以查看我的编辑。Thx:)我现在没有时间测试,但它看起来像我需要的,所以我让你的答案被接受,稍后会给出反馈:)谢谢,我试过了,效果很好,真的谢谢;)工作正常,但现在您可以手动添加更多选项,它们将是有效的选择,有什么方法可以防止这种情况发生吗?
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('choiceField', 'choice', array(
            'attr' => array(
                'class' => 'choiceField'
            )
        ))
    ;

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
        $form = $event->getForm();
        $data = $event->getData();
        $form->remove('choiceField');
        $form->add('choiceField', 'choice', array(
            'attr' => array(
                'class' => 'choiceField',
            ),
            'choices' => array(
                $data['choiceField'] => $data['choiceField'],
            )
        ));
    });

    $builder->add('save', 'submit');
}
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
    $event->stopPropagation();
}, 900); // Always set a higher priority than ValidationListener