46

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

4

8 回答 8

80

只需添加novalidate到您的<form>标签:

<form novalidate>

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

{{ form(form, {'attr': {'novalidate': 'novalidate'}}) }}
于 2012-04-13T14:33:11.827 回答
21

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

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'attr'=>array('novalidate'=>'novalidate')
    ));
}
于 2015-03-30T19:47:04.590 回答
10

在谷歌搜索解决方案时,我找到了一个,如果你想在整个应用程序中禁用 html5 验证,这似乎是最优雅的,所以我想我会在这里分享。致谢这篇博客文章的作者。

这个想法是为“表单”表单类型创建一个扩展,如下所示:

<?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 开始,配置略有不同,但仍然可以。

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}
于 2015-11-20T13:26:45.153 回答
4

或者,如果由于某种原因你不想像上面的答案那样在树枝上做这件事......

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

或者您使用 createFormBuilder 手动创建 from 然后您可以简单地使用 createFormBuilder 作为第二个参数来定义表单属性:

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

return $this->render("-----:----:----.html.twig", [
    'form'=>$form->createView()
]);
于 2016-01-30T05:27:34.573 回答
2

如果您使用 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();

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

请注意,这只会禁用 HTML5 验证!这不会禁用服务器端验证。

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

于 2016-01-02T18:05:30.980 回答
1

如果您确实需要删除验证属性(例如,如果您使用验证库希望将所有验证约束保存在一个地方),则可以覆盖 twig 中的 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 %}

我在这里所做的就是删除与验证相关的属性:

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

于 2013-12-11T14:24:07.413 回答
0

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

->add('foo',null,array=>('attr'=>('pattern'=>'/[^~,]/'))
于 2016-04-11T13:39:49.273 回答
0

使用表单主题

首先创建表单主题模板,例如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'
于 2016-04-27T16:32:28.943 回答