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


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

Author: Jon Winstanley, 2012-04-13

8 answers

Просто добавьте novalidate к вашему тегу <form>:

<form novalidate>

Если вы визуализируете форму в TWIG, вы можете использовать следующее.

{{ form(form, {'attr': {'novalidate': 'novalidate'}}) }}
 72
Author: Ondrej Slinták, 2014-06-12 10:56:38

Я знаю его старый вопрос, но с SF2.6 в FormType вы можете сделать:

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'attr'=>array('novalidate'=>'novalidate')
    ));
}
 18
Author: d3uter, 2015-03-30 19:47:04

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

Затем вы просто регистрируете его в своих сервисах.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}
 8
Author: LorenzSchaef, 2017-07-03 10:01:26

В качестве альтернативы, если по какой-то причине вы не хотите делать это в twig, как в ответе выше...

{{форма(форма, {'attr': {'новалидат': 'новалидат'}}) }}

Или вы создаете свой из вручную с помощью createFormBuilder, тогда вы можете просто использовать createFormBuilder в качестве второго параметра для определения атрибута формы:

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

return $this->render("-----:----:----.html.twig", [
    'form'=>$form->createView()
]);
 4
Author: DevWL, 2017-10-31 18:08:46

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

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

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

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

 2
Author: Joseph Astrahan, 2016-01-02 18:13:19

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

Если вы уже используете пользовательские шаблоны форм в приложении/Ресурсах/представлениях/form.html.twig, например (и включили его в свой файл конфигурации.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 %}

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

{% если требуется%} требуется="требуется"{% endif%}{% если max_length%} maxlength="{{max_length}}"{%endif%}{% если шаблон%} шаблон="{{шаблон}}"{% endif %}

 1
Author: Jon Winstanley, 2013-12-11 14:24:07

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

->add('foo',null,array=>('attr'=>('pattern'=>'/[^~,]/'))
 0
Author: Saman Mohamadi, 2016-04-11 14:20:07

Используйте формирование тематики:

Сначала создайте шаблон темы формы, например, приложение/Ресурсы/представления/форма/поля.html.ветка:

{% 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'
 0
Author: JohnSmith, 2016-04-27 16:32:28