Symfony3 + Select2 AJAX - 禁用选择验证

时间:2016-03-08 20:54:31

标签: validation symfony-forms symfony select2

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

This value is not valid  

我想这是因为通过AJAX选择的选择并不存在于'选择'键入表单类型。

我对Symfony来说比较新。有人能指出我正确的方向来禁用现场验证吗?

2 个答案:

答案 0 :(得分:3)

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

动态添加选项

您还可以查看此捆绑包:https://github.com/tetranz/select2entity-bundle

答案 1 :(得分: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,
    ),
));

默认情况下,您可能希望将choice数组中的每个键用作标签,并将每个选项值转换为字符串并用作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>

当选择数组中的某些模型选择值不是标量时(例如arrayobjectnull ...),会发生同样的情况。

然后,提交的数据应为"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将其映射回来。

任何未知值或&#34;额外&#34;值将以您的错误结束。

请参阅official doc