Symfony3 + Select2 AJAX - 禁用选择验证

Posted

技术标签:

【中文标题】Symfony3 + Select2 AJAX - 禁用选择验证【英文标题】:Symfony3 + Select2 AJAX - disable validation of choices 【发布时间】:2016-06-23 00:21:15 【问题描述】:

我有一个带有 ChoiceType 字段的 Symfony3 表单。它使用带有 AJAX 数据源的 Select2。这一点工作正常。然而,当表单提交时,Symfony 验证启动并抱怨:

This value is not valid  

我猜这是因为通过 AJAX 选择的选项不存在于表单类型的“选择”键中。

我对 Symfony 比较陌生。有人可以指出我正确的方向来禁用现场验证吗?

【问题讨论】:

我用新的表单类型解决了这个问题:***.com/questions/57638447/… 【参考方案1】:

您不应该禁用验证。使用 Form Events - http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html 动态添加选项

你也可以看看这个捆绑包:https://github.com/tetranz/select2entity-bundle

【讨论】:

感谢两位的回复。我结束了使用表单事件,因为它在我正在做的其他事情上也派上了用场。【参考方案2】:

您必须始终使用字符串值将数据提交到ChoiceType

考虑以下ChoiceType配置:

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

$builder->add('some_choice', ChoiceType::class, array(
    'choices' => array(
        'Choose 1' => 1,
        'Choose A' => 'A',
        'Choose True' => true,
    ),
));

默认情况下,您可能希望选择数组中的每个键都用作标签,并且每个选择值都将转换为字符串并用作 html 值:

<option value="1">Choose 1</option>
<option value="A">Choose A</option>
<option value="1">Choose True</option>

上面这个例子是错误的。

如您所见,将true 转换为字符串会得到"1",并且它已用于整数1 选择。

所有选择值必须始终是唯一的,因此默认情况下,ChoiceType 使用数字增量:

<option value="0">Choose 1</option>
<option value="1">Choose A</option>
<option value="2">Choose True</option>

相同的情况发生在选择阵列中的某些型号选择值不是标量时(例如,array,@ 987654331,null ...)。

那么提交的数据应该是"0""1"或者"2"。每个都将通过ChoiceType 映射到相应的选择。

要完全控制要用于每个选项的字符串值,您可以使用选项choice_value 作为闭包,它将每个选项作为唯一参数传递,并且必须返回其字符串值。

如果您选择的是对象或数组,您可以将其设置为属性路径:

'choice_value' => 'property'

// will be equivalent to

'choice_value' => function ($choice) 
    if (is_array($choice)) 
        return $choice['property'];
    

    if (is_object($choice)) 
        return $choice->getProperty();
        // or even $choice->isProperty()
    

    throw new UnexpectedTypeException();

结论:

默认行为与:

$builder->add('some_choice', ChoiceType::class, array(
    'choices' => array(
        'Choose 1' => 1,
        'Choose A' => 'A',
        'Choose True' => true,
    ),
    'choice_value' => function ($choice) 
        if (!is_scalar($choice) 
            return null;
        

        return false === $choice ? '0' : (string) $choice;
    ,
));

如果返回null 或两个相同的值,则将使用递增的整数。

您始终必须提交字符串选择值才能将其映射回ChoiceType

任何未知值或“额外”值都会导致您的错误。

见official doc

【讨论】:

以上是关于Symfony3 + Select2 AJAX - 禁用选择验证的主要内容,如果未能解决你的问题,请参考以下文章

Select2 未通过 AJAX 获取数据

Select2 ajax:在编辑模式下预选数据

Select2:使用 AJAX 未显示结果

Select2 - 通过 ajax 调用传回附加数据

使用 AJAX 插入后在 Select2 中设置数据

select2 更改 ajax 网址