Embauchez-moi

Je suis freelance ! Besoin d'un professionnel du développement web ? Pourquoi ne pas me passer un coup de fil ?

Plus d'infos sur… http://thibault.jouannic.fr

mots-cles : Ingénieur web freelance Symfony eZ Publish Solr

Symfony, formulaires, validation, redirection et messages d’erreur

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 :

  1. Je me connecte sur l’URL http://example.com/page/show?id=10
  2. Le controleur appele l’action executeShow du module page
  3. Le template utilisé pour l’affichage est showSuccess.php du module page
  4. Mon template utilise l’instruction include_partial pour inclure le template qui affiche les commentaires sur ma page
  5. 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 :

  1. Mon formulaire est validé, supposons qu’il génère des erreurs
  2. Le contrôleur appelle la fonction handleErrorAdd du module commentaire
  3. 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′) ;
  4. 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

  1. Posté le 15/12/2008 à 14:26 | Permalien

    c’est cool que tu me(tes cette energie dans ton, blog ! j’adore

  2. Caweetarmeday
    Posté le 23/07/2009 à 13:12 | Permalien

    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

  3. Posté le 15/09/2009 à 18:21 | Permalien

    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 !

  4. Posté le 24/07/2010 à 23:47 | Permalien

    represent nice special site -

    ambien sleepwalking

    http://trailfire.com/adipex_online_f13?tab=Comments
    ambien amnesia

  5. Posté le 31/10/2010 à 19:29 | Permalien

    Merci, c’est ce que je cherchais

  6. Posté le 31/10/2010 à 20:43 | Permalien

    Enfaite c’est ce que je cherchais, mais chez moi ça ne fonctionne pas …

    tu fonctionnes avec quel version de symfony ?

  7. Posté le 26/05/2011 à 12:34 | Permalien

    hiya everyone,
    want to tell you «  hi  », wish to use some attractive time period surrounding this blog :>
    visit into mine www : schody