Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

<form novalidate>

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

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

Ответ 2

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

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'attr'=>array('novalidate'=>'novalidate')
    ));
}

Ответ 3

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

Ответ 4

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

{{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()
]);

Ответ 5

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

Ответ 6

Если вам действительно нужно удалить атрибуты проверки (если вы используете библиотеку проверки, хотите сохранить все ограничения проверки в одном месте, например), вы можете перезаписать блок 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 %}

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

{% if required%} required = "required" {% endif%} {% if max_length%} maxlength = "{{max_length}}" {% endif%} {% if pattern%} pattern = "{{pattern}}" {% endif%}

Ответ 7

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

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

Ответ 8

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

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