Symfony2禁用HTML5表单validation

我只想使用服务器端validation来validation我的表单。 但是,如果浏览器支持HTML5,则使用symfony2添加到表单的HTML5属性进行validation,所以我需要阻止HTML5validation。

只需在您的<form>标签中添加novalidate

 <form novalidate> 

如果您在TWIG中渲染表单,则可以使用以下内容。

 {{ form(form, {'attr': {'novalidate': 'novalidate'}}) }} 

我知道它的老问题,但在FormType的SF2.6,你可以这样做:

 /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'attr'=>array('novalidate'=>'novalidate') )); } 

虽然谷歌search这个解决scheme,我发现,这似乎是最优雅的,如果你想在整个应用程序禁用HTML5validation,所以我想我会在这里分享。 积分转到本博客文章的作者。

这个想法是为这样的“表单”表单types创build一个扩展:

 <?php // src/AppBundle/Form/Extension/NoValidateExtension.php namespace AppBundle\Form\Extension; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; class NoValidateExtension extends AbstractTypeExtension { public function buildView(FormView $view, FormInterface $form, array $options) { $view->vars['attr'] = array_merge($view->vars['attr'], [ 'novalidate' => 'novalidate', ]); } public function getExtendedType() { return 'form'; } } ?> 

然后你只需要在你的services.yml中注册这个:

 app.no_validation_form_extension: class: AppBundle\Form\Extension\NoValidateExtension tags: - {name: form.type_extension, alias: form} 

你完成了。 现在,您的所有表单都自动具有novalidate属性。

Symfony 3.3

从Symfony 3.3开始,configuration稍有不同,但仍有可能。

稍微更新getExtendedType方法以返回FormType类。

 // src/AppBundle/Form/Extension/NoValidateExtension.php namespace AppBundle\Form\Extension; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; use Symfony\Component\Form\Extension\Core\Type\FormType; class NoValidateExtension extends AbstractTypeExtension { public function buildView(FormView $view, FormInterface $form, array $options) { $view->vars['attr'] = array_merge($view->vars['attr'], [ 'novalidate' => 'novalidate', ]); } public function getExtendedType() { return FormType::class; } } 

再加上一些extended_type标签,现在在你的服务声明中需要:

 app.no_validation_form_extension: class: AppBundle\Form\Extension\NoValidateExtension tags: - {name: form.type_extension, alias: form, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType} 

另外,如果由于某种原因,你不想像上面的答案那样在树枝上做…

{{form(form,{'attr':{'novalidate':'novalidate'}})}}

或者使用createFormBuilder手动创build,那么您可以简单地使用createFormBuilder作为第二个参数来定义表单属性:

 //someAction $form = $this->createFormBuilder(null, ['attr'=>['novalidate'=>'novalidate']]) ->add(...) ->add(...) ->add(...) ->getFrom(); return $this->render("-----:----:----.html.twig", [ 'form'=>$form->createView() ]); 

如果您正在使用Symfony 3(或2),并且只想closures特定字段的validation,则可以执行此操作。

 $form = $this->createFormBuilder($task) ->add('task', TextType::class, array('required' => false)) ->add('dueDate', DateType::class) ->add('save', SubmitType::class, array('label' => 'Create Task')) ->add('saveAndAdd', SubmitType::class, array('label' => 'Save and Add')) ->getForm(); 

在这个示例表单中注意到数组('required'=> false) ,您可以将其添加到您要禁用validation的任何元素,而不禁用其他validation。 如果要暂时禁用一个元素而不是整个表单,非常有用。

注意这只能禁用HTML5validation! 这不会禁用服务器端validation。

参考: http : //symfony.com/doc/current/book/forms.html#field-type-options

如果实际上需要删除validation属性(例如,如果您正在使用validation库,则希望将所有validation约束保留在一个位置),则可以在小节中覆盖widget_attributes块。

如果您已经在app / Resources / views / form.html.twig中使用自定义表单模板(并且已经在您的config.yml中启用了它),您可以添加一个块

 {% block widget_attributes %} {% spaceless %} id="{{ id }}" name="{{ full_name }}"{% if read_only %} readonly="readonly"{% endif %}{% if disabled %} disabled="disabled"{% endif %} {% for attrname, attrvalue in attr %}{% if attrname in ['placeholder', 'title'] %}{{ attrname }}="{{ attrvalue|trans({}, translation_domain) }}" {% else %}{{ attrname }}="{{ attrvalue }}" {% endif %}{% endfor %} {% endspaceless %} {% endblock widget_attributes %} 

我在这里所做的是删除与validation有关的属性:

{%if if required%} required =“required”{%endif%} {%if max_length%} maxlength =“{{max_length}}”{%endif%} {%if pattern%} pattern =“{{pattern}} “{% 万一 %}

要使用formType类禁用特定字段的正则expression式validation:

 ->add('foo',null,array=>('attr'=>('pattern'=>'/[^~,]/')) 

使用表单主题 :

首先创build表单主题模板,例如app / Resources / views / form / fields.html.twig:

 {% extends 'form_div_layout.html.twig' %}{# or some other base layout #} {% block form_start %} {% if attr.novalidate is not defined %} {% set attr = attr|merge({'novalidate':'novalidate'}) %} {% endif %} {{ parent() }} {% endblock %} 

然后在模板中使用该表单主题:

 {% form_theme form with 'form/fields.html.twig' %} {{ form_start(form) }} <-- now renders with novalidate attribute ... {{ form_end(form) }} 

或者,全局应用主题(app / config / config.yml):

 twig: form_themes: - ':form/fields.html.twig'