Symfony: Faites passer le message

accessories-text-editor Petit retour sur Symfony pour débattre d’un sujet que je traine dans mes cartons depuis le début de ce blog quasiment mais dont je n’avais jamais vraiment eu le temps de parler: La communication entre l’application et l’utilisateur.

Je profite donc de n’avoir pas de sujets brûlants à vous faire part, pour attaquer ce billet.

En effet, c’est souvent un détail qu’on oublie très vite et il n’y a qu’à voir les maquettes qu’on reçoit pour nos devs, je pense que les bon élèves qui pensent à faire un petit mockup d’un message utilisateur sont pas forcément légions. Et pourtant, dans une optique purement IHM, l’application se doit de communiquer avec l’utilisateur pour montrer qu’il comprend bien la requête.

Difficilement d’imaginer d’appuyer sur un bouton et ne pas savoir si l’application a bien saisi et effectué notre demande. Et pourtant ce n’est pas rare de croiser encore de telles applications même si la tendance s’est inversée depuis l’avènement du deux point zéro.

Le souci, c’est que c’est souvent un peu fastidieux à mettre en place. Heureusement, nous on utilise Symfony et il va nous simplifier les choses pour peu qu’on pose les bonnes bases.

Je ne suis pas allé chercher midi à quatorze heures pour implémenter un système que je reproduis dans tous mes projets, je me suis simplement inspiré de l’admin generator.

Première phase, parmi toutes les possibilités de Symfony, laquelle utiliser pour ce genre de message?
Commençons par cerner nos besoins:

  • Il faut pouvoir passer un message à l’utilisateur après une requête de sa part
  • qu’elle que soit la page où il se retrouvera après
  • seulement sur cette page
  • pouvoir distinguer 2 types de messages au minimum: information et erreur

On se rend vite compte qu’il va falloir utiliser les sessions et en jetant un oeil à la classe qui gère ces dernières, sfUser, on découvre la méthode setFlash qui semble parfaitement correspondre à nos besoins et sans aucun effort, car maintenant le principe revient à afficher les messages, vu que le setFlash s’occupera de les faire disparaitre une fois qu’on les aura affichés.

Pour ce faire, et bien on va utiliser tout bêtement un partial qu’on va inclure dans notre layout.php! Ainsi, il sera appelé pour chacune de nos pages. En général on obtient donc quelque chose comme ceci dans notre layout:

<?php include_partial('global/messages') // global défini le répertoire ou se trouve le layout.php ?>
<?php echo $sf_content ?>

Et à l’intérieur de ce partial, voilà ce qu’il suffit de mettre:

<?php if ($sf_user->hasFlash('error') || $sf_user->hasFlash('notice')): ?>
  <div id="feedback">
    <?php if ($sf_user->hasFlash('error')): ?>
    	<p class="error-box">
    		<?php echo $sf_user->getFlash('error') ?>
    	</p>
    <?php endif; ?>
 
    <?php if ($sf_user->hasFlash('notice')): ?>
    	<p class="notice-box">
    		<?php echo $sf_user->getFlash('notice') ?>
    	</p>
    <?php endif; ?>
  </div>
<?php endif; ?>

Voilà, on teste la présence de flash de type ‘error’ et/ou ‘notice’ et les affiche le cas échéant.

Maintenant dans n’importe quelle action de notre application, un simple appel comme ci-dessous suffit:

$this->getUser()->setFlash('error','Une erreur est survenue'); // Pour les erreurs
$this->getUser()->setFlash('notice','Inscription prise en compte'); // Pour les messages

L’étape suivante pourrait être de découpler le type d’erreur de leur namespace utilisé, mais ça je vous laisse faire ;)

Tags: , , ,

A propos de l'auteur

Tim

Développeur web spécialisé Symfony, il est avant tout passionné de web tout simplement. Il aime les défis et farfouiller dans le code de Symfony ou Doctrine. Fondateur du blog, il exerce chez Autrement.

Vous avez aimé ce billet? Faites le savoir!

  • Delicious
  • Twitter
  • Technorati Favorites
  • FriendFeed
  • Google Bookmarks
  • Share/Bookmark

7 Réponses

  1. Sebastien 22 juillet 2009 à 17 h 22 min #

    Salut,

    Je profite de ton billet qui parle des utilisateurs pour te poser une question où je n’ai pas eu de réponse sur le forum de Symfony.

    http://forum.symfony-project.org/index.php/m/81502/#msg_81502

    Désolé pour l’anglais un peu « léger », si tu ne comprends pas ce que j’ai voulu dire dans le post n’hésite pas.

    Merci d’avance ! :)

  2. Tim 23 juillet 2009 à 13 h 59 min #

    Pas vraiment le temps de regarder en détail pour l’instant, mais je jetterai un oeil ;)

  3. Sebastien 23 juillet 2009 à 16 h 25 min #

    Salut,

    Ok merci, c’est pas un problème que j’ai, c’est plus un avis que je demande, puisque comme je le dis dans le post, ce que j’ai fait fonctionne mais je pense qu’il doit y avoir quelque chose de « plus propre » pour le faire.

    En tout cas merci. :)

  4. Guillaume 13 août 2009 à 8 h 55 min #

    Bonjour,

    J’ai utilisé la même méthode pour une application que j’ai développé sous Symfony et je pense que c’est le moyen le plus simple d’y parvenir.

    Pour ma part j’avais rajouté un peu de prototype qui permettait de fermer le message après la consultation, dans le plus beau des fondu :)

    Ça donne bien et je te conseille d’essayer si tu connais pas trop Prototype.

    PS : sympa ton blog continue à mettre des astuces pour Symfony.

  5. Tim 13 août 2009 à 9 h 17 min #

    Effectivement, j’ai déjà croisé ce genre d’effet, mais je le ferai plutôt en jquery :p
    Si tu te balades un peu sur mon blog, tu verras que je suis plutôt adepte de lui que de Prototype.

    Merci pour les encouragements ;)

  6. Arthur 25 septembre 2009 à 12 h 29 min #

    Bonjour,
    J’avais mis en place une solution comparable sur un projet mais le comportement de getFlash() m’est un peu obscur. Les erreurs s’affichent correctement, par contre elle s’affichent aussi sur la page suivante (quelle qu’elle soit).

  7. Tim 28 septembre 2009 à 21 h 15 min #

    Hello Arthur,

    Je n’ai jamais rencontré le problème que tu évoques. Tu as pu trouver quelques explications depuis?


Laisser un message