Les redirections dans Symfony font s’arracher les cheveux aux développeurs
Mon problème est le suivant : j’ai un formulaire classique, et je veux qu’il affiche les messages qui vont bien en cas d’erreurs de validation. Jusque là, rien de trés difficile, n’est-ce pas ? Le problème, c’est qu’après validation du formulaire, j’ai une redirection qui me fait perdre les messages d’erreur.
La version 1.1 de Symfony, actuellement en version release candidate, propose un framework complet de gestion de formulaire. Par conséquent, l’astuce que je vous propose aujourd’hui ne sera peut-être pas valable, ni même utile, pour cette version (c’est à vérifier). Je suppose donc que vous utilisez la version stable 1.0.x.
Pour mieux comprendre, voici le fonctionnement de mon appli.
Quand j’affiche ma page, on a ce déroulement :
- Je me connecte sur l’URL http://example.com/page/show?id=10
- Le controleur appele l’action executeShow du module page
- Le template utilisé pour l’affichage est showSuccess.php du module page
- Mon template utilise l’instruction include_partial pour inclure le template qui affiche les commentaires sur ma page
- Ce template affiche également un formulaire qui permet d’ajouter un commentaire
Quand j’ajoute un commentaire et valide mon formulaire, on a le déroulement suivant :
- Mon formulaire est validé, supposons qu’il génère des erreurs
- Le contrôleur appelle la fonction handleErrorAdd du module commentaire
- Comme on veut réafficher le formulaire, on redirige vers la page d’origine (http://example.com/page/show?id=10) :
$this->redirect(‘page/show?id=10′) ; - On redéroule l’affichage depuis le début, dans le module page. Problème : mon formulaire n’affiche rien :
la redirection a perdu les messages d’erreur.
Avec la méthode normale, on aurait ceci :
// app/frontend/modules/pages/template/showSuccess.php ... // Affiche des trucs ... // Affichage du formulaire <?php echo form_tag('@action') ?> <?php // Affiche le message d'erreur de validation ?> <?php echo form_error('champ1') ?> <label for="champ1">Champ 1 :</label> <?php echo input_tag('champ1', $sf_params->get('champ1')) ?> <?php echo form_error('champ2') ?> <label for="champ2">Champ 2 :</label> <?php echo input_tag('champ2', $sf_params->get('champ2')) ?> <?php echo submit_tag('Valider') ?> </form>
// app/frontend/modules/pages/actions/actions.class.php function executeAdd() { // Valide le formulaire // ... return sfView::SUCCESS; } public function handleErrorAdd() { // En cas d'erreur, affiche le formulaire avec les messages d'erreurs return sfView::SUCCESS; }
Pour parvenir à ce fonctionnement en cas de redirections, nous allons utiliser les attributs flash.
// app/frontend/modules/page/actions/actions.class.php function executeShow() { // récupère les erreurs en cas de redirection // Lors d'un affichage normal, on ne récupère rien $errors = $this->getFlash('errors'); if(!empty($errors)) $this->getRequest()->setErrors($errors); $this->xxx = ... // Fonctionnement classique }
// app/frontend/modules/page/templates/showSuccess.php // ... // Affiche la page // Affiche les commentaires <?php include_partial('commentaire/list', array(...)) ?>
// app/frontend/modules/commentaire/templates/_list.php // Affiche les commentaires sur la page // ... // Affichage du formulaire // Notez la cible du formulaire <?php echo form_tag('commentaire/add') ?> // Affiche le message d'erreur de validation <?php echo form_error('champ1') ?> <label for="champ1">Champ 1 :</label> <?php echo input_tag('champ1', $sf_params->get('champ1')) ?> <?php echo form_error('champ2') ?> <label for="champ2">Champ 2 :</label> <?php echo input_tag('champ2', $sf_params->get('champ2')) ?> <?php echo submit_tag('Valider') ?> </form>
// app/frontend/modules/commentaire/actions/actions.class.php // La validation s'est bien passée public function executeAdd() { // Créé le commentaire // ... $this->comment->save(); // et REDIRIGE vers l'affichage de la page $this->redirect('/page/show/?id='.$this->getRequestParameter('id')); } // Gère les erreur de validation public function handleErrorAdd() { // Toute l'astuce est ici : $this->setFlash('errors', $this->getRequest()->getErrors()); $this->redirect('/page/show?id='.$this->getRequestParameter('id')); return sfView::SUCCESS; }
Et voilà. Maintenant, vous devriez voir les messages d’erreur de validation.
7 Commentaires
c’est cool que tu me(tes cette energie dans ton, blog ! j’adore
Urinal screens are an striking way to mind restroom urinal drains free flowing. The urinal select acts as a boundary-line to the exhaustion clay pipe attached to the urinal. These screens feign like nets that get on debris such as cigarettes, weekly, and other permit and abort them from clogging drains which can agent in flowing in restrooms.
x-cite aphrodisiac
function of prostate gland
prostate cancer cure
womans libido enhancers
premature ejaculation handjob
You better stay your fridge as a replacement for pork ! This swine flu outbreak is geting grim-faced ! My neighbor came shy away from from Meixo city and is geting disgusted ! Neighbourly of her to alert everyone in the neighborhood !
represent nice special site -
ambien sleepwalking
http://trailfire.com/adipex_online_f13?tab=Comments
ambien amnesia
Merci, c’est ce que je cherchais
Enfaite c’est ce que je cherchais, mais chez moi ça ne fonctionne pas …
tu fonctionnes avec quel version de symfony ?
hiya everyone,
want to tell you « hi », wish to use some attractive time period surrounding this blog :>
visit into mine www : schody