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

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

This value is not valid  

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

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

【问题讨论】:

标签: validation symfony-forms symfony select2


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多