Je souhaite valider mon formulaire à l'aide de la validation côté serveur uniquement. Cependant, si le navigateur prend en charge HTML5, il valide en utilisant les attributs HTML5 ajoutés au formulaire par symfony2. Par conséquent, je dois empêcher la validation HTML5.
Ajoutez simplement novalidate
à votre balise <form>
:
<form novalidate>
Si vous rendez le formulaire dans TWIG, vous pouvez utiliser ce qui suit.
{{ form(form, {'attr': {'novalidate': 'novalidate'}}) }}
Je connais sa vieille question mais avec SF2.6 dans FormType, vous pouvez faire:
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'attr'=>array('novalidate'=>'novalidate')
));
}
Alors que je cherchais une solution à ce problème, j’en ai trouvé une, c’est le plus élégant des cas si vous souhaitez désactiver la validation HTML 5 dans l’ensemble de votre application. Les crédits vont à l'auteur de cet article de blog .
L'idée est de créer une extension pour le type de formulaire "formulaire" comme ceci:
<?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';
}
}
?>
Ensuite, il vous suffit de l’inscrire dans votre fichier services.yml comme ceci:
app.no_validation_form_extension:
class: AppBundle\Form\Extension\NoValidateExtension
tags:
- {name: form.type_extension, alias: form}
et tu as fini. Tous vos formulaires ont automatiquement un attribut novalidate
maintenant.
Depuis Symfony 3.3, la configuration est légèrement différente, mais toujours possible.
Mise à jour légère de la méthode getExtendedType
pour renvoyer la classe 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;
}
}
Plus quelques ajouts mineurs de la balise extended_type
, qui est maintenant requise dans votre déclaration de service:
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}
Sinon, si pour une raison quelconque vous ne voulez pas le faire en brindille comme dans la réponse ci-dessus ...
{{formulaire (formulaire, {'attr': {'novalidate': 'novalidate'}})}}
ou vous créez manuellement votre avec createFormBuilder, vous pouvez simplement utiliser createFormBuilder comme second paramètre pour définir l'attribut de formulaire:
//someAction
$form = $this->createFormBuilder(null, ['attr'=>['novalidate'=>'novalidate']])
->add(...)
->add(...)
->add(...)
->getFrom();
return $this->render("-----:----:----.html.twig", [
'form'=>$form->createView()
]);
Si vous utilisez Symfony 3 (ou 2) et souhaitez désactiver la validation pour un champ spécifique, vous pouvez le faire.
$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();
Dans cet exemple de formulaire, notez array ('required' => false), vous pouvez l'ajouter à tout élément pour lequel vous souhaitez désactiver la validation sans désactiver la validation des autres. Très utile si vous souhaitez désactiver temporairement un seul élément au lieu de l’ensemble du formulaire.
Notez que ceci désactive UNIQUEMENT la validation HTML5! Ceci ne désactive pas la validation côté serveur.
Référence: http://symfony.com/doc/current/book/forms.html#field-type-options
Si vous devez réellement supprimer les attributs de validation (par exemple, si vous utilisez une bibliothèque de validation pour conserver toutes vos contraintes de validation au même endroit), vous pouvez écraser le bloc widget_attributes dans twig.
Si vous utilisez déjà des modèles de formulaire personnalisés dans app/Resources/views/form.html.twig par exemple (et que vous l'avez activé dans votre config.yml), vous pouvez simplement ajouter un bloc pour
{% 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 %}
Tout ce que j'ai fait ici est de supprimer les attributs liés à la validation:
{% si nécessaire%} required = "required" {% endif%} {% if max_length%} maxlength = "{{max_length}}" {% endif%} {% si pattern%} pattern = "{{pattern}} "{% fin si %}
Pour désactiver la validation Regex pour un champ spécifique à l'aide de la classe formType:
->add('foo',null,array=>('attr'=>('pattern'=>'/[^~,]/'))
Utilisez forme theming :
Commencez par créer un modèle de thème de formulaire, par exemple app/Ressources/vues/formulaire/champs.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 %}
Ensuite, utilisez ce thème de formulaire dans votre modèle:
{% form_theme form with 'form/fields.html.twig' %}
{{ form_start(form) }} <-- now renders with novalidate attribute
...
{{ form_end(form) }}
Ou, appliquez le thème globalement (app/config/config.yml):
twig:
form_themes:
- ':form/fields.html.twig'