Symfony2 отключает проверку формы HTML5

Я хочу проверить свою форму, используя только проверку на стороне сервера. Однако, если браузер поддерживает HTML5, он проверяет использование атрибутов HTML5, добавленных в форму symfony2, поэтому мне нужно предотвратить проверку HTML5.

Related of "Symfony2 отключает проверку формы HTML5"

Просто добавьте novalidate в свой <form> :

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

В то время как поисковая система для решения этого вопроса я нашел один, который кажется самым элегантным, если вы хотите отключить проверку 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'; } } ?> 

Затем вы просто зарегистрируете его в своих сервисах. Например:

 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} 

Альтернативно, если по какой-то причине вы не хотите делать это в 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() ]); 

Если вы используете 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(); 

В этой форме образца обратите внимание на массив ('required' => false) , вы можете добавить его к любому элементу, для которого вы хотите отключить проверку, без отключения проверки для других. Очень полезно, если вы хотите временно отключить только один элемент вместо всей формы.

Обратите внимание, что это ТОЛЬКО отключает проверку HTML5! Это не отключает проверку на стороне сервера.

Ссылка: http://symfony.com/doc/current/book/forms.html#field-type-options

Если вам действительно нужно удалить атрибуты проверки (если вы используете библиотеку проверки, хотите сохранить все ограничения проверки в одном месте, например), вы можете перезаписать блок widget_attributes в веточке.

Если вы уже используете настраиваемые шаблоны форм в приложении / 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 %} 

Все, что я сделал, это удалить атрибуты, связанные с проверкой:

{%, если требуется%} required = "required" {% endif%} {% if max_length%} maxlength = "{{max_length}}" {% endif%} {% if pattern%} pattern = "{{pattern}} "{% endif%}

Чтобы отключить проверку Regex для определенного поля с помощью класса formType:

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

Используйте форму :

Сначала создайте шаблон темы формы, например 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'