我希望只使用服务器端验证来验证我的表单,但是如果浏览器支持HTML5,则会使用Symfony2添加到表单中的HTML5属性进行验证,因此我需要禁止HTML5验证。
只需在您的<form>
标签中添加novalidate
即可:
<form novalidate>
如果你正在使用TWIG渲染表单,可以使用以下代码。
{{ form(form, {'attr': {'novalidate': 'novalidate'}}) }}
我知道这是一个老问题,但在SF2.6中的FormType中,您可以这样做:
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'attr'=>array('novalidate'=>'novalidate')
));
}
public function configureOptions(OptionsResolver $resolver)
方法来替代@PawełBrzoski和setDefaultOptions
方法。 - Ivan YarychsetDefaultOptions(OptionsResolver $resolver)
同样有效! - goulashsoup<?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}
如果你不想使用上面回答中的twig,或者由于某些原因无法使用twig...
{{ form(form, {'attr': {'novalidate': 'novalidate'}}) }}
或者你可以手动创建createFormBuilder表单,然后使用createFormBuilder作为第二个参数来定义表单属性:
//someAction
$form = $this->createFormBuilder(null, ['attr'=>['novalidate'=>'novalidate']])
->add(...)
->add(...)
->add(...)
->getFrom();
return $this->render("-----:----:----.html.twig", [
'form'=>$form->createView()
]);
$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();
{% 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 %}
使用表单主题:
首先创建表单主题模板,例如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'
使用formType类禁用特定字段的Regex验证:
->add('foo',null,array=>('attr'=>('pattern'=>'/[^~,]/'))