简体   繁体   English

Symfony2禁用HTML5表单验证

[英]Symfony2 disable HTML5 form validation

I want to validate my form using server side validation only. 我想仅使用服务器端验证来验证我的表单。 However, if the browser supports HTML5 it validates using the HTML5 attributes added to the form by symfony2 so I need to prevent HTML5 validation. 但是,如果浏览器支持HTML5,则使用symfony2添加到表单的HTML5属性进行验证,因此我需要阻止HTML5验证。

Just add novalidate to your <form> tag: 只需在<form>标记中添加novalidate

<form novalidate>

If you are rendering the form in TWIG, you can use following. 如果您在TWIG中呈现表单,则可以使用以下内容。

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

I know its old question but with SF2.6 in FormType, you can do: 我知道它的旧问题,但在FormType中使用SF2.6,你可以这样做:

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

While googling for a solution to this I found one, that seems the most elegant if you want to disable html5 validation in your whole app, so I thought i'd share it here. 在搜索解决方案的同时我找到了一个,如果你想在你的整个应用程序中禁用html5验证,这似乎是最优雅的,所以我想我会在这里分享它。 Credits go to the author of this blog article . 积分转到本博客文章的作者。

The idea is to create an extension for the "form" form type like this: 我们的想法是为“表单”表单类型创建一个扩展名,如下所示:

<?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';
    }
}
?>

Then you just register it in your services.yml like this: 然后你只需在services.yml中注册它,如下所示:

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

and you're done. 你完成了 All your forms automatically have a novalidate attribute now. 您的所有表单现在都自动具有novalidate属性。

Symfony 3.3 Symfony 3.3

As of Symfony 3.3 the configuration is slightly different, but still possible. 从Symfony 3.3开始,配置略有不同,但仍有可能。

Slight update to the getExtendedType method to return the FormType class. 稍微更新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;
    }
}

Plus some a minor addition of the extended_type tag, which is now required in your service declaration: 再添加一些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}

Alternatively if for some reason you don't want to do it in twig as in the answer above... 或者,如果由于某种原因你不想像在上面的答案中那样在树枝上做...

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

or you create your from manually with createFormBuilder then you could simply use createFormBuilder as a second parameter to define form attribute: 或者您使用createFormBuilder手动创建,然后您可以使用createFormBuilder作为第二个参数来定义表单属性:

//someAction
$form = $this->createFormBuilder(null, ['attr'=>['novalidate'=>'novalidate']])
->add(...)
->add(...)
->add(...)
->getFrom();

return $this->render("-----:----:----.html.twig", [
    'form'=>$form->createView()
]);

If you are using Symfony 3 (or 2) and want to turn off validation for a specific field only you can do this. 如果您使用Symfony 3(或2)并且想要关闭特定字段的验证,则只能执行此操作。

$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();

In this sample form notice the array('required' => false) , you can add this to any element that you want to disable validation for without disabling validation for the others. 在此示例表单中注意数组('required'=> false) ,您可以将其添加到要禁用验证的任何元素,而不禁用其他元素的验证。 Very useful if you want to temporarily disable only one element instead of the entire form. 如果要暂时禁用一个元素而不是整个表单,则非常有用。

Note this ONLY disables the HTML5 validation! 请注意,这仅禁用HTML5验证! This does not disable server side validation. 这不会禁用服务器端验证。

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

If you actually need to remove the validation attributes (if you are using a validation library want to keep all of your validation constraints in one place for example), you can overwrite the widget_attributes block in twig. 如果您确实需要删除验证属性(例如,如果您使用验证库希望将所有验证约束保留在一个位置),则可以覆盖twig中的widget_attributes块。

If you are already using custom form templates in app/Resources/views/form.html.twig for example (and have enabled it in your config.yml) you can just add a block for 如果您已经在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 %}

All I have done here is remove the attributes related to validation: 我在这里所做的就是删除与验证相关的属性:

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

要使用formType类禁用特定字段的正则表达式验证:

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

Use form theming : 使用表格主题

First create form theme template, eg app/Resources/views/form/fields.html.twig: 首先创建表单主题模板,例如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 %}

Then use that form theme in your template: 然后在模板中使用该表单主题:

{% form_theme form with 'form/fields.html.twig' %}

{{ form_start(form) }} <-- now renders with novalidate attribute
...
{{ form_end(form) }}

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM