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 :

[Symfony]Attacher une class à une erreur - formulaire


Sujet :

Symfony PHP

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut [Symfony]Attacher une class à une erreur - formulaire
    Bonjour,

    Je voudrais ajouter une class uniquement à input dont une erreur à été mentionné, cependant je ne trouve pas le moyen d'y parvenir.
    Mes tentatives en essayant de surcharger le block form_widget_simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {% block form_widget_simple -%}
        {% set type = type|default('text') -%}
        <input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %} {% if errors is defined %}class="error"{% endif %}/>
    {%- endblock form_widget_simple %}
    Le soucis réside dans le fait qu'a la moindre erreur la class est rattacher à TOUS les inputs ce que je ne veux pas...
    J'ai chercher dans les fichiers symfony si depuis la vue il y aurai une possibilité de faire : errors.value ou errors.name ce qui correspondrai à l'input dont l'erreur y est attaché..

    N'hésiter pas à me poser des questions si je n'ai pas été assez claire, j'attend vos retour même si pendant le mois d'août ces le désert ^^

    Bonne journée.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut
    Bonjour,

    Le principe est bon cependant tu peux plutôt recharger le block qui est contenu dans le même fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% block widget_attributes -%}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {% if errors|length > 0 %} 
            {% set errorClass = 'error' %} //error est le nom de ta class (modifie selon le nom de la tienne)
            {% if attr.class is defined %}
                {% set errorClass = errorClass ~ ' ' ~ attr.class %}
            {% endif %}
            {% set attr = attr|merge({'class': errorClass}) %}
        {% endif %}
    Bonne continuation.

  3. #3
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Hello,

    Voilà la partie de la doc qui explique comment personnaliser un seul widget : http://symfony.com/fr/doc/current/co...amp-individuel

    Globalement l'idée que tu as est la bonne, il suffit juste de surcharger le bon block : en l'occurence si tu veux modifier le rendu du widget du champs toto à l'intérieur du form plop (normalement tu dois trouver en name de ton champs plop[toto]), tu vas devoir surcharger ton block de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {% block _plop_toto_widget %}
        {# ... #}
    {% endblock %}
    ++

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut
    Bonjour merci pour vos réponses,

    Le code de booMan à fonctionner cependant ta méthode Nico_F m'intéresse par curiosité, modifier le rendu du widget Ok mais ta méthode permet-elle de modifier le rendu du widget en cas d'erreur ??
    ( Si une erreur est présente sur ce champ alors attacher la class error )

    Merci pour les informations complémentaires.

  5. #5
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Oui ça le permet de modifier aussi bien le form_widget, le form_error, le formulable ou n'importe quel block. À toi de définir à quel niveau tu veux que ce soit customisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    {# customiser la manière dont le label est rendu #}
    {% block _plop_toto_label %}
        {# ... #}
    {% endblock %}
     
    {# customiser la manière dont l'erreur s'affiche #}
    {% block _plop_toto_error %}
        {# ... #}
    {% endblock %}
     
    {# customiser la manière dont le widget (input, sélect etc.) est rendu #}
    {% block _plop_toto_widget %}
        {# ... #}
    {% endblock %}
    Ces trois blocs modifieront la manière d'afficher et le label, le widget, et la partie erreur. Si tu n'en définis que deux, le troisième restera par défaut.
    La disposition à l'intérieur du form_row n'est pas affectée là.

    Le découpage d'un form_row donne cet ordre là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div>
        {{ form_label(form.toto) }}
        {{ form_errors(form.toto) }}
        {{ form_widget(form.toto) }}
    </div>
    Si par contre tu as besoin d'intervertir le form_label et le form_error par exemple, alors c'est directement le block form_row qu'il faudra éditer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {# modification du rendu de form_row(form.toto) #}
    {% block _plop_toto_row %}
    {% spaceless %}
        <div>
            {{ form_errors(form) }}
            {{ form_label(form) }}
            {{ form_widget(form) }}
        </div>
    {% endspaceless %}
    {% endblock %}
    Tu peux t'appuyer sur les modèles originaux de blocks qui se trouvent dans Symfony/Bridge/Twig/Resouces/views/Form/form_div_layout.html.twig et les étendre pour la globalité de ton formulaire ou pour certains éléments uniquement.

    ++

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut
    Merci pour ces informations complémentaires, cependant prenons un exemple concret car surcharger les block ne me pose pas de problème mais comment dans le block même vous dîtes à Symfony " si une erreur est rattaché au input ".
    Exemple : Je voudrais rajouter une class au input comportant une erreur je me dirige donc vers le block suivant :

    {# customiser la manière dont le widget (input, sélect etc.) est rendu #}
    {% block _plop_toto_widget %}
    {# ... #}
    {# maintenant ici comment lui dire s'il y a une erreur ajouter la class à l'input... #}
    {% endblock %}
    N'hésiter pas à me dire si je ne suis pas assez claire, merci !

  7. #7
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Si si très clair : c'est moi qui n'avait pas bien lu ton besoin.

    C'est possible également : personnellement je fais de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {% block _plop_toto_widget %}
        {% if not form.vars.valid %}
            {# recréer tout l'input avec ta classe supplémentaire ... #}
        {% endif %}
    {% endblock %}
    À moins qu'il y ait une option particulière dans la configuration du form type pour ajouter une classe sur les widgets en cas d'erreur, je ne vois que cette solution.
    Je n'aime pas trop écrire l'input moi même, je préfère à la limite encadrer mon widget avec une div qui aurait cette classe et styler l'input à partir de la div en question.

    Quelque chose comme ça me plait d'avantage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {% block _plop_toto_widget %}
        {% if not form.vars.valid %}
            <div class="myClass">
                {{ form_widget(form) }}
            </div>
        {% endif %}
    {% endblock %}
    Et ne pas oublier la condition else, histoire que, si cette partie du formulaire est valide, on affiche quand même le champs ^^

Discussions similaires

  1. Ajouter une classe à une classe
    Par benooo dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 05/02/2014, 18h22
  2. Réponses: 3
    Dernier message: 08/03/2010, 07h32
  3. Réponses: 7
    Dernier message: 15/05/2009, 23h13
  4. [POO] Faire rendre invisible une classe dans un formulaire
    Par _Fabien dans le forum Général Dotnet
    Réponses: 11
    Dernier message: 17/03/2008, 15h49
  5. Membres statiques d'une classe et erreur de linkage
    Par Neilos dans le forum C++Builder
    Réponses: 10
    Dernier message: 09/02/2006, 23h06

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