46 votes

Symfony2 désactive la validation de formulaire HTML5

Je veux valider mon formulaire en utilisant uniquement la validation côté serveur. Cependant, si le navigateur supporte le HTML5, il valide en utilisant les attributs HTML5 ajoutés au formulaire par symfony2. J'ai donc besoin d'empêcher la validation HTML5.

79voto

Ondrej Slinták Points 9922

Il suffit d'ajouter novalidate à votre <form> étiquette :

<form novalidate>

Si vous rendez le formulaire en TWIG, vous pouvez utiliser ce qui suit.

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

1 votes

J'ai une autre question concernant ce problème : si je veux que la validation s'applique à certains champs et qu'elle soit désactivée pour d'autres, je peux utiliser la méthode suivante required" => false . Mais il y a beaucoup plus de champs où je veux qu'il soit désactivé. Alors, comment puis-je changer le comportement par défaut Rendre le champ obligatoire donc je peux ajouter required => true à certains champs.

0 votes

Voulez-vous dire la validation HTML5 ou la validation backend ?

0 votes

Oh désolé, je n'ai pas été assez clair. Je parle de la validation HTML5. Ou est-ce que je peux utiliser un @Assert pour dire "non obligatoire" qui désactive la validation HTML pour ce champ ?

21voto

d3uter Points 36

Je sais que c'est une vieille question mais avec SF2.6 dans FormType, vous pouvez le faire :

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

10voto

LorenzSchaef Points 1098

En cherchant une solution à ce problème, j'en ai trouvé une, qui semble la plus élégante si vous voulez désactiver la validation html5 dans toute votre application, alors j'ai pensé la partager ici. 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 "form" 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';
    }
}
?>

Il suffit ensuite de l'enregistrer 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 le tour est joué. Tous vos formulaires ont automatiquement un novalidate attribue maintenant.

Symfony 3.3

A partir de Symfony 3.3, la configuration est légèrement différente, mais toujours possible.

Légère mise à jour de la getExtendedType pour renvoyer le FormType classe.

// 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 un ajout mineur de l extended_type qui est maintenant nécessaire 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}

4voto

GlupiJas Points 196

Si, pour une raison quelconque, vous ne voulez pas le faire en twig comme dans la réponse ci-dessus...

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

ou si vous créez votre formulaire manuellement avec createFormBuilder, vous pouvez simplement utiliser createFormBuilder comme deuxième paramètre pour définir l'attribut du formulaire :

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

return $this->render("-----:----:----.html.twig", [
    'form'=>$form->createView()
]);

2voto

Joseph Astrahan Points 254

Si vous utilisez Symfony 3 (ou 2) et que vous souhaitez désactiver la validation pour un champ spécifique uniquement, 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 le array('required' => false) vous pouvez l'ajouter à tout élément pour lequel vous souhaitez désactiver la validation sans désactiver la validation pour les autres. Très utile si vous souhaitez désactiver temporairement un seul élément au lieu de l'ensemble du formulaire.

Notez que cela désactive UNIQUEMENT la validation HTML5 ! Cela ne désactive pas la validation côté serveur.

Référence : http://symfony.com/doc/current/book/forms.html#field-type-options

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X