IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

SF4 + bootstrap 4 : pb messages d'erreur de validation de formulaire [4.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut SF4 + bootstrap 4 : pb messages d'erreur de validation de formulaire
    Bonjour à tous,

    J'ai des problèmes pour la gestion des messages d'erreur lors de la validation d'un formulaire.

    J'ai une entité 'monentite' qui contient 3 champs (nom, description, nombre) avec des asserts pour vérifier les valeurs saisies dans le formulaire.

    Dans ma base qui contient mon entité, j'ai déjà créé l'entité : 'a', 'a', 2.

    Dans ma page, je clique pour ouvrir mon formulaire. Je saisis 'a', 'a', 0, et je clique sur 'créer'.

    Comme voulu, je suis bloqué par mes asserts, mais j'ai 2 problèmes :

    1/ Pour le champ 'nom', le message d'erreur s'affiche 2 fois.
    J'ai cherché ce problème sur le web, d'après ce que j'ai compris, c'est un problème de compatibilité de SF4 avec Bootstrap 4 qui génère le message d'erreur dans le champ label.
    Mais je n'ai pas trouvé de solution pour n'avoir qu'un seul message.

    2/ Avec mon assert pour le champ 'nombre', la valeur 0 est interdite.
    J'ai bien un message d'erreur, mais il s'affiche en premier dans mon formulaire, et non au niveau du champ concerné. Et là, je ne vois pas pourquoi.

    Je vous mets mes morceaux de code qui me semblent utiles, j'espère que vous aurez des idées !

    Merci d'avance à tous.

    Nom : sf4..png
Affichages : 3351
Taille : 22,0 Ko

    Code dans mon entité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    /**
     * Monentite
     *
     * @ORM\Table(name="monentite")
     * @ORM\Entity(repositoryClass="App\Repository\MonentiteRepository")
     *
     * @UniqueEntity(fields={"nom"}, message="Ce nom est déjà enregistré")
     */
     
    class Monentite
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="nom", type="string", length=255, unique=true)
         * @Assert\NotBlank
         */
        private $nom;
     
        /**
         * @var string
         *
         * @ORM\Column(name="description", type="text")
         * @Assert\NotBlank
         */
        private $description;
     
        /**
         * @var int
         *
         * @ORM\Column(name="nombre", type="smallint")
         * @Assert\NotBlank
         * @Assert\NotNull
         * @Assert\Positive
         */
        private $nombre;
    Code dans mon contrôleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    $monentite = new Monentite();
    $form_monentite_builder = $this->createFormBuilder($monentite);
    $this->creer_form_monentite($form_monentite_builder);
    $form_monentite = $form_monentite_builder->getForm();
    $form_monentite->handleRequest($request);
     
    if ($form_monentite->isSubmitted() && $form_monentite->isValid()) {
    	// ...
    } else {
    	return $this->render('monentite_creer.html.twig', array(
    		'form_monentite' => $form_monentite->createView()
    	));
    }
     
    return $this->render('monentite_creer.html.twig', array(
    	'form_monentite' => $form_monentite->createView()
    ));
     
    public function creer_form_monentite($form)
        {
            $form
                ->add('nom', TextType::class, array(
                    'label' => 'Nom',
                    'attr' => array('style' => 'width: 500px')
                    ))
                ->add('description', TextareaType::class, array(
                    'label' => 'Description',
                    'attr' => array('style' => 'width: 500px')
                    ))
                ->add('nombre', IntegerType::class, array(
                    'label' => 'Nombre',
                    'attr' => array('style' => 'width: 100px')
                    ))
            ;
        }
    code dans ma vue Twig :

    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    {{ form_start(form_monentite, {'action': path('monentite_creer'), 'method':'POST'}) }}
    <div>
    	{{ form_widget(form_monentite) }}
    </div>
    <br>
    <div class="form-group">
    	<button type="submit" id="submit" value="Créer" name="submit" class="btn-default btn">Créer</button>
    	<button type="submit" id="submit" value="Annuler" name="submit" class="btn-default btn">Annuler</button>
    </div>
    {{ form_rest(form_monentite) }}
    {{ form_end(form_monentite) }}

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Points : 582
    Points
    582
    Par défaut
    Salut,

    Est-ce que tu peux nous montrer la totalité du code de ton contrôleur stp ?

    1/ Est-ce que tu peux nous donner un lien où il est expliqué que cela vient d'une compatibilité avec Bootstrap 4 stp ? (je n'ai rien trouvé de récente sur le GitHub de Symfony)

    2/ À mon avis form_rest() est de trop dans ton code, dans la doc il est précisé que form_end() appelle déjà implicitement form_rest() sauf si on demande explicitement ne pas le faire (https://symfony.com/doc/current/form...view-variables). Essaye d'enlever l'appel à form_rest() pour voir si ça résout certains de tes problèmes même si je n'y crois pas trop...

    Par ailleurs pour simplifier ton contrôleur, tu devrais peut-être créer une classe à part qui représente ton objet formulaire : https://symfony.com/doc/current/form...g-form-classes

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    Merci pour ta réponse et tes pistes !

    Alors, là, vite fait car la nuit tombe !!!

    1/ Le lien d'où je suis parti pour mon analyse :
    https://github.com/symfony/symfony/issues/28086

    2/ Je viens d'essayer en enlevant le form_rest de mon formulaire, et ça ne change rien du tout. Mais ça m'a permis d'apprendre que ce n'est pas obligatoire, merci !

    Merci pour le lien sur les form classes, j'étudierai ça demain...

    Bon, je vais me pencher sur tout ça, et je reviens demain. Merci encore pour ton aide !

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Points : 582
    Points
    582
    Par défaut
    La date de création m'avait semblé lointaine alors que la discussion s'est poursuivie jusqu'à récemment, my bad !

    Du coup dans ce message datant du mois d'avril 2019, il est précisé que l'implémentation actuelle (les <span> d'erreur sont dans la balise <label>) est volontaire pour des raisons d'accessibilité, et je ne pense pas que ton soucis vienne de là car dans ton cas le message se dédouble à deux endroits différents.

    Dans config/twig.yaml tu as définis quel(s) "form theme" à utiliser ?
    (sur un SF 4.2.11 avec Bootstrap 4.1.3 et le "form theme" bootstrap_4_layout.html.twig je n'ai aucun soucis... mais je ne peux pas tester @Assert\Positive car la contrainte a été ajoutée en 4.3)

    Sinon je ne vois pas vraiment ce qui cloche, la création du formulaire dans ton contrôleur me semble correcte (au passage il me semble que le "else" est superflu car le "return" suivant contient exactement le même code). À mon avis il faut creuser côté objet Form (donc essayer avec une classé dédiée, tu verras c'est très simple avec la commande make:form) et ensuite côté template Twig/form theme Bootstrap.

    Bon courage !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    Merci beaucoup pour ton aide, ça y est, ça marche !!!

    Nom : sf4b.png
Affichages : 1589
Taille : 16,7 Ko

    Voilà le problème : Suite à ton idée, je suis allé voir mon fichier config/packages/twig.yaml

    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    twig:
        default_path: '%kernel.project_dir%/templates'
        debug: '%kernel.debug%'
        strict_variables: '%kernel.debug%'
        form_themes:
            - 'bootstrap_4_layout.html.twig'
            - '_formTheme.html.twig'
        date:
            format: d.m.Y, H:i:s
            interval_format: '%%d days'
            timezone: Europe/Paris

    J'ai bien le form_themes bootstrap_4_layout.html.twig, mais aussi _formTheme.html.twig
    Ce dernier vient de mon projet sous SF3, je ne sais plus pourquoi. Il contient le code suivant :

    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    {% use "bootstrap_4_layout.html.twig" %}
    {% block form_row -%}
        {% set showErrorIcon = (not compound or force_error|default(false)) and not valid %}
        <div class="form-group {% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}{{ showErrorIcon ? ' has-feedback' : '' }}">
            {{- form_label(form) -}}
            {% if help|default %}
                {# set the aria-describedby attribute #}
                {%- set attr = attr|merge({'aria-describedby': 'help-block-'~id }) -%}
            {% endif %}
            {{- form_widget(form, {
                'attr': attr
            }) -}}
            {% if help|default %}
                <span class="help-block" id="help-block-{{ id }}">{{ help }}</span>
            {% endif %}
            {{- form_errors(form) -}}
        </div>
    {%- endblock form_row %}
    {% block form_widget_simple -%}
        {% set showErrorIcon = false %}
        {% if type is not defined or type not in ['file', 'hidden'] %}
            {# show error icon for these types #}
            {% set showErrorIcon = (not compound or force_error|default(false)) and not valid %}
        {% endif %}
        {{- parent() -}}
        {% if showErrorIcon %}
            <span id="error" class="glyphicon glyphicon-remove form-control-feedback" aria-hidden="true"></span>
        {% endif %}
    {%- endblock form_widget_simple %}

    J'avais trouvé à l'époque de SF3 ce code sur le web, et je débutais sur Symfony, je n'avais pas creusé à quoi sert ce code, mais ça avait dû corriger un de mes problèmes.
    Je vois qu'aujourd'hui je n'en ai plus besoin, je le vire de mon projet SF4.

    Merci à nouveau pour toute l'aide que tu m'as apporté !!!
    Bon week-end !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Message d'erreur avec Validation.Add
    Par Alain BENOIST dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 14/05/2009, 11h27
  2. Afficher les messages d'erreur de validator
    Par weed dans le forum Struts 1
    Réponses: 3
    Dernier message: 30/10/2008, 09h17
  3. Réponses: 0
    Dernier message: 19/06/2008, 15h44
  4. Messages d'erreurs en lançant les formulaires
    Par bok2000 dans le forum IHM
    Réponses: 11
    Dernier message: 14/11/2007, 18h33
  5. Réponses: 9
    Dernier message: 17/08/2006, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo