首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Symfony 2中验证动态加载的选择

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

Stack Overflow用户
提问于 2012-10-18 11:05:19
回答 4查看 9.7K关注 0票数 19

在我的表单中有一个名为*sub_choice*的选择字段类型,它的选择将根据父选择字段*parent_choice*的选定值通过AJAX动态加载。加载选择非常有效,但在提交时验证sub_choice的值时遇到问题。它会给出一个"This value is not valid“验证错误,因为提交的值在构建时不在sub_choice字段的选项中。那么,有没有一种方法可以正确地验证sub_choice字段的提交值呢?下面是构建我的表单的代码。我使用的是Symfony 2.1。

代码语言:javascript
复制
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
    ));
}
EN

回答 4

Stack Overflow用户

发布于 2014-04-16 17:34:48

要执行此操作,您需要在提交表单之前覆盖sub_choice字段:

代码语言:javascript
复制
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,
        ]);
    });
}
票数 24
EN

Stack Overflow用户

发布于 2015-01-31 15:57:56

这可以接受任何值

代码语言:javascript
复制
 $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
    $data = $event->getData();
    if(is_array($data['tags']))$data=array_flip($data['tags']);
    else $data = array();
    $event->getForm()->add('tags', 'tag', [
        'label'   => 'Sub Choice',
        'choices' => $data,
        'mapped'=>false,
        'required'=>false,
        'multiple'=>true,
    ]);
});
票数 3
EN

Stack Overflow用户

发布于 2013-08-14 18:52:06

您不能构建sub_choice验证,因为在配置其验证器期间,您不知道哪些值是有效的(值取决于parent_choice的值)。

您可以做的是在控制器中创建新的YourFormType()之前将parent_choice解析为entity。然后,您可以获得新的所有可能的值,并通过表单构造函数- sub_choice YourFormType($subChoice)提供它们。

在YourFormType中,你必须像这样添加__construct方法:

代码语言:javascript
复制
/**
 * @var array
 */
protected $subChoice = array();

public function __construct(array $subChoice)
{
    $this->subChoice = $subChoice;
}

并使用表单add中提供的值:

代码语言:javascript
复制
$builder->add('sub_choice', 'choice', array(
                'label' => 'Sub Choice',
                'choices' => $this->subChoice,
                'virtual' => true
));
票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12946461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档