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'