我想仅使用服务器端验证来验证我的表单。但是,如果浏览器支持HTML5,则使用symfony2添加到表单的HTML5属性进行验证,因此我需要阻止HTML5验证。
答案 0 :(得分:75)
只需将novalidate
添加到您的<form>
代码:
<form novalidate>
如果您要在TWIG中呈现表单,则可以使用以下内容。
{{ form(form, {'attr': {'novalidate': 'novalidate'}}) }}
答案 1 :(得分:20)
我知道它的旧问题,但在FormType中使用SF2.6,你可以这样做:
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'attr'=>array('novalidate'=>'novalidate')
));
}
答案 2 :(得分:9)
在搜索解决方案时,我发现了一个,如果你想在你的整个应用程序中禁用html5验证,这似乎是最优雅的,所以我想我在这里分享它。致敬归this blog article的作者所有。
我们的想法是为&#34;表格&#34;创建一个扩展名。表单类型如下:
<?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开始,配置略有不同,但仍有可能。
轻微更新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}
答案 3 :(得分:4)
或者,如果由于某种原因你不想像在上面的答案那样在树枝上做...
{{form(form,{&#39; attr&#39;:{&#39; novalidate&#39;:&#39; novalidate&#39;}}}}}
或者您使用createFormBuilder手动创建,然后您可以使用createFormBuilder作为第二个参数来定义表单属性:
//someAction
$form = $this->createFormBuilder(null, ['attr'=>['novalidate'=>'novalidate']])
->add(...)
->add(...)
->add(...)
->getFrom();
return $this->render("-----:----:----.html.twig", [
'form'=>$form->createView()
]);
答案 4 :(得分: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();
在此示例表单中,请注意数组(&#39;必需&#39; =&gt; false),您可以将其添加到要禁用验证的任何元素,而不会禁用验证其他。如果您想暂时禁用一个元素而不是整个表单,则非常有用。
请注意,这只会禁用HTML5验证!这不会禁用服务器端验证。
参考:http://symfony.com/doc/current/book/forms.html#field-type-options
答案 5 :(得分: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}}”{%endif%}
答案 6 :(得分:0)
使用formType类禁用特定字段的正则表达式验证:
->add('foo',null,array=>('attr'=>('pattern'=>'/[^~,]/'))
答案 7 :(得分:0)
使用form theming:
首先创建表单主题模板,例如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'