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 :

Comment afficher les erreurs de validation d'un formulaire dans une liste en haut de la page ?


Sujet :

Symfony PHP

  1. #1
    lr
    lr est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Points : 114
    Points
    114
    Par défaut Comment afficher les erreurs de validation d'un formulaire dans une liste en haut de la page ?
    Salut,

    Actuellement, mes formulaires sont validés et les erreurs affichées au-dessus des champs, par ex. "Le champs est obligatoire".

    Mais ça fait bouger le design et je ne trouve pas ça très propre. Je préférerai voir une liste en haut du formulaire avec tous les messages d'erreur du genre :
    - Le champs Nom est obligatoire
    - Le champs Prénom est obligatoire
    - La date de début doit être antérieure à la date de fin etc.

    Quelle est la meilleure façon de faire ça avec Symfony 1.4 (si possible sans avoir à personnaliser chaque message d'erreur) ?

    Merci d'avance

  2. #2
    Membre régulier Avatar de betadev
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Salut ,

    voici un exemple , peut être que ça va t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php if ($form->hasGlobalErrors()): ?>
      <tr>
        <td colspan="4">
          <ul class="error_list">
            <?php foreach ($form->getGlobalErrors() as $name => $error): ?>
              <li><?php echo $name.': '.$error ?></li>
            <?php endforeach; ?>
          </ul>
        </td>
      </tr>
    <?php endif; ?>

  3. #3
    lr
    lr est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Points : 114
    Points
    114
    Par défaut
    Merci mais non, ça ne fonctionne pas. Il s'agit des global errors uniquement, pas des erreurs sur les champs. Donc si je poste le formulaire sans rien remplir, ça ne passe pas car il y a des champs obligatoires mais ton code n'affiche rien car il n'y a pas de global error.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2008
    Messages : 71
    Points : 49
    Points
    49
    Par défaut
    Il te suffit en haut de ta page de faire une itération sur ton objet $form et d'effectuer un renderError sur chaque éléments du champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <div id="toutesLesErreurs">
        <?php foreach($tonForm as $field): ?>
            <span>Le champs <?php echo $field->renderLabel(); ?>contient le(s) erreur(s) suivante(s):</span>
            <?php echo $field->renderError(); ?>
            <br />
       <?php endforeach; ?>
    </div>
    Je n'ai pas testé ce bout de code écrit à la volé, mais dans l'idée c'est surement ça que tu souhaite obtenir si j'ai bien compris.

  5. #5
    lr
    lr est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par mixka13 Voir le message
    Il te suffit en haut de ta page de faire une itération sur ton objet $form et d'effectuer un renderError sur chaque éléments du champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <div id="toutesLesErreurs">
        <?php foreach($tonForm as $field): ?>
            <span>Le champs <?php echo $field->renderLabel(); ?>contient le(s) erreur(s) suivante(s):</span>
            <?php echo $field->renderError(); ?>
            <br />
       <?php endforeach; ?>
    </div>
    Je n'ai pas testé ce bout de code écrit à la volé, mais dans l'idée c'est surement ça que tu souhaite obtenir si j'ai bien compris.
    Merci, j'ai essayé mais ça affiche les noms de tous les champs, même lorsqu'ils ne contiennent pas d'erreur... Ex.

    - Le champs Id contient l'erreur suivante :
    - Le champs Nom contient l'erreur suivante : Champs obligatoire
    - Le champs Prénom contient l'erreur suivante : Champs obligatoire
    - Le champs Naissance contient l'erreur suivante :

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2008
    Messages : 71
    Points : 49
    Points
    49
    Par défaut
    Oui, comme je le disais j'ai écris ça à la volée, maintenant ce n'est pas bien compliqué, un petit test à chaque itération pour savoir si le champs comporte bien des erreurs, le cas échéant, tu affiches le nom du label et les erreurs qu'il contient.

  7. #7
    lr
    lr est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Points : 114
    Points
    114
    Par défaut
    Mon problème, c'est que j'ai défini des labels personnalisés, pour que, par ex., le label du champs "prenom" soit "Prénom" et pas "Prenom".

    Je les avais défini dans le template _form.php comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <th><?php echo $form['prenom']->renderLabel( "Prénom" ) ?></th>
    <td><?php echo $form['prenom'] ?></td>
    mais du coup, lors de l'affichage des erreurs, j'avais "Prenom : Champs obligatoire". De plus, renderError provoque la génération de code html de mise en page dont je ne voulais pas.

    Alors j'ai du commencer par définir mes labels personnalisés au niveau de ClientForm::configure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $this->setWidget( 'prenom', new sfWidgetFormInputText( array("label" => "Prénom")) );
    $this->setWidget( 'naissance', new sfWidgetFormDate( array(
    											'label' => "Né(e) le",
    											'format' => '%day%/%month%/%year%') ) );
    Comme ça, dans mon template, je peux me contenter de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <th><?php echo $form['prenom']->renderLabel() ?></th>
    <td><?php echo $form['prenom'] ?></td>
    Pour les erreurs, j'ai du faire ça :
    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
    <thead>
    			<tr>
    				<td colspan="4">
    					<ul class="error_list">
    						<?php foreach ($form as $field): ?>
    							<?php if ( $field->hasError() ) : ?>
    								<?php if ( $field->getWidget()->getLabel() ) : ?>
    									<?php echo $field->getWidget()->getLabel() ?>&nbsp;:&nbsp;<?php echo __( $field->getError() ) ?>
    								<?php else : ?>
    									<?php echo ucfirst( $field->getName() ) ?>&nbsp;:&nbsp;<?php echo __( $field->getError() ) ?>
    								<?php endif ?>
    							    <li> 
    							    	<span></span>
    							    </li>
    							<?php endif ?>
    						<?php endforeach; ?>
    					</ul>
    				</td>
    			</tr>
    		</thead>
    car getLabel ne renvoie rien lorsque le label n'a pas été personnalisé dans le formulaire...

    Ca marche mais c'est un peu compliqué, si qqun a mieux...

  8. #8
    lr
    lr est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Points : 114
    Points
    114
    Par défaut
    Arg ça pose un nouveau problème... Les messages d'erreur ne sont plus traduits

    Là, le message est bien traduit en fonction de ce que j'ai mis dans messages.fr.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <th><?php echo $form['detenteurno']->renderLabel() ?></th>
    <td><?php echo $form['detenteurno'] ?> <?php echo $form['detenteurno']->renderError() ?></td>
    Mais là, il m'affiche le message en anglais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $field->getWidget()->getLabel() ?>&nbsp;:&nbsp;<?php echo __( $field->getError() ) ?>

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2008
    Messages : 71
    Points : 49
    Points
    49
    Par défaut
    Oula, on va faire ça dans l'ordre :
    1) pour les labels il est en effet bien mieux de les configurer à partir de la méthode configure() du formulaire en question, que ce soit à chaque setWidget comme tu as fait, ou par le biais de setLabels pour tous les renommer en un seul appel.

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php if ( $field->hasError() ) : ?>
        <?php if ( $field->getWidget()->getLabel() ) : ?>
             <?php echo $field->getWidget()->getLabel() ?>&nbsp;:&nbsp;<?php echo __( $field->getError() ) ?>
        <?php else : ?>
    	 <?php echo ucfirst( $field->getName() ) ?>&nbsp;:&nbsp;<?php echo __( $field->getError() ) ?>
        <?php endif ?>
        <li> 
    	 <span></span>
        </li>
    <?php endif ?>
    Alors pour le test de présence d'erreurs ok, par contre le test suivant n'est-il pas complètement inutile ? d'Autant plus qu'il débouche sur la modification de la casse d'une seule lettre, ce problème d'ordre visual peut être résolue en modifiant directement tous tes labels par l'appel de configure() de ton form et ensuite tu allèges et rend plus lisible ton code comme si dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php if ( $field->hasError() ) : ?>
        <?php echo $field->renderLabel() . "  " . $field->renderError(); ?>
    <?php endif ?>
    (on est dans un template, autant que possible évitons le php à outrance, de 1 test et 4 echo tu ne fais, au final, plus qu'un seul echo, lui même plus digeste)

    3) pour ton dernier problème d'I18N :
    Là sf va chercher la valeur du champs en vérifiant si une traduction est dispo pour la culture employée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <th><?php echo $form['detenteurno']->renderLabel() ?></th>

    Mais là sf va directement chercher la valeur enregistrer dans ton form donc forcement dans la langue utilisée dans l'écriture de la classe incriminée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $field->getWidget()->getLabel()
    (idem pour les erreurs)

Discussions similaires

  1. [1.x] Afficher les erreurs de validation d'un form dans une modalbox
    Par phpestpuissant dans le forum Symfony
    Réponses: 1
    Dernier message: 12/12/2012, 12h44
  2. [MySQL] Comment afficher les erreurs MySQL en local ?
    Par Alcius dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 19/11/2010, 20h10
  3. [DEBUTANT] Comment afficher les erreurs ?
    Par ionix dans le forum Langage
    Réponses: 2
    Dernier message: 20/10/2006, 16h13
  4. Réponses: 2
    Dernier message: 27/09/2006, 11h35
  5. [web] comment afficher les erreur d'un cgi
    Par chtiboss dans le forum Web
    Réponses: 6
    Dernier message: 24/12/2003, 11h22

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