Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/04/2011, 13h26   #1
lr
Membre du Club
 
Inscription : octobre 2003
Messages : 329
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 329
Points : 69
Points : 69
Envoyer un message via ICQ à lr
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
lr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 23h11   #2
Membre du Club
 
Avatar de betadev
 
Homme
Développeur Web
Inscription : octobre 2008
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : Tunisie

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

Informations forums :
Inscription : octobre 2008
Messages : 80
Points : 56
Points : 56
Salut ,

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

Code :
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; ?>
betadev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 13h07   #3
lr
Membre du Club
 
Inscription : octobre 2003
Messages : 329
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 329
Points : 69
Points : 69
Envoyer un message via ICQ à lr
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.
lr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h04   #4
Futur Membre du Club
 
Homme Mickael
Étudiant
Inscription : novembre 2008
Messages : 66
Détails du profil
Informations personnelles :
Nom : Homme Mickael
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 66
Points : 15
Points : 15
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 :
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.
mixka13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h59   #5
lr
Membre du Club
 
Inscription : octobre 2003
Messages : 329
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 329
Points : 69
Points : 69
Envoyer un message via ICQ à lr
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 :
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 :
lr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 18h13   #6
Futur Membre du Club
 
Homme Mickael
Étudiant
Inscription : novembre 2008
Messages : 66
Détails du profil
Informations personnelles :
Nom : Homme Mickael
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 66
Points : 15
Points : 15
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.
mixka13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 19h36   #7
lr
Membre du Club
 
Inscription : octobre 2003
Messages : 329
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 329
Points : 69
Points : 69
Envoyer un message via ICQ à lr
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 :
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 :
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 :
1
2
<th><?php echo $form['prenom']->renderLabel() ?></th>
<td><?php echo $form['prenom'] ?></td>
Pour les erreurs, j'ai du faire ça :
Code :
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...
lr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 20h09   #8
lr
Membre du Club
 
Inscription : octobre 2003
Messages : 329
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 329
Points : 69
Points : 69
Envoyer un message via ICQ à lr
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 :
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 :
<?php echo $field->getWidget()->getLabel() ?>&nbsp;:&nbsp;<?php echo __( $field->getError() ) ?>
lr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 21h27   #9
Futur Membre du Club
 
Homme Mickael
Étudiant
Inscription : novembre 2008
Messages : 66
Détails du profil
Informations personnelles :
Nom : Homme Mickael
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 66
Points : 15
Points : 15
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 :
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 :
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 :
<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 :
$field->getWidget()->getLabel()
(idem pour les erreurs)
mixka13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h22.


 
 
 
 
Partenaires

Hébergement Web