禁用 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 类型中选择字段的后端验证的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 2 - 如何删除日期字段类型的默认日期选择器?
Symfony 2 搜索表单呈现一个不需要的搜索字段。我可以禁用此行为吗?