禁用 Symfony 2 类型中选择字段的后端验证

Posted

技术标签:

【中文标题】禁用 Symfony 2 类型中选择字段的后端验证【英文标题】:Disable backend validation for choice field in Symfony 2 Type 【发布时间】:2015-02-26 16:37:55 【问题描述】:

是否可以禁用指定字段的后端(服务器端)验证?

我尝试发送带有动态加载选项的表单时收到错误“错误:此值无效。”

我认为 symfony 正在检查我的值是否在默认声明的列表中(在我的例子中是空列表),如果不是则返回 false。

【问题讨论】:

添加一些代码来说明你的问题。 是的一些代码请,错误来自 if ($form->isValid()) ? 类似:***.com/questions/18207476/… 【参考方案1】:

我找到了解决办法

Symfony2.4 form 'This form should not contain extra fields' error

更多详情:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-dynamic-form-modification-suppressing-form-validation

【讨论】:

【参考方案2】:

这很令人困惑,但这种行为与验证并不真正相关,因为它是由“ChoiceToValueTransformer”引起的,它确实在您预先声明的列表中搜索条目。如果您的列表为空或者您想禁用转换器,您可以简单地重置它。

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

    $builder->add('yourField', 'choice', array('required'=>false));

    //more fields...

    $builder->get('yourField')->resetViewTransformers();

然后您的自定义验证将介入(如果存在)。

【讨论】:

您的解决方案在 symfony 2.8 中对我没有影响。但这有所帮助:***.com/questions/12946461/… 如果我使用 resetViewTransformers 选项它可以工作,只有当表单被重新加载时,因为其他字段出错,选择值会丢失。你知道如何解决这个问题吗? 经过几个小时的搜索,这在 symfony 4.2 中救了我这么多。完美运行。在我的情况下,我在form type template 的树枝中渲染字段,这不等于我传入的内容。我无法强制isValid(),并不断得到invalid value【参考方案3】:

在表单类型类的buildForm 方法中添加这个,这样您就可以验证输入字段值,而不是从选择字段值中进行选择;

$builder->addEventListener(
    FormEvents::PRE_SUBMIT,

    function (FormEvent $event) 
        $form = $event->getForm();

        if ($form->has('field')) 
            $form->remove('field');
            $form->add(
                'field', 
                'text', 
                ['required' => false]
            )
        
    
);

【讨论】:

remove() 调用不是必需的。 add() 替换现有字段。

以上是关于禁用 Symfony 2 类型中选择字段的后端验证的主要内容,如果未能解决你的问题,请参考以下文章

需要指导:前端用户动态选择字段的后端 SQL 逻辑

Symfony 2 - 如何删除日期字段类型的默认日期选择器?

Django - 禁用表单选择字段验证

Symfony 2 搜索表单呈现一个不需要的搜索字段。我可以禁用此行为吗?

从 Symfony3 中经过身份验证的用户 (HWIOAuth) 获取 Angular2 中的 JWT 令牌

在选择类型 Symfony 5 中显示相关实体中的特定字段