FlashMessanger est à la base un action helper, donc confiné au contrôleur. Celui-ci permet de passer un message d’une page à l’autre via le mécanisme des sessions . Après un formulaire on doit souvent ajouter un message de confirmation, on peux par exemple utilisé le FlashMessenger pour le faire et ainsi au ré-affichage suivant afficher ce message! C’est tellement pratique qu’il est dommage de ne pas pouvoir l’utiliser a travers les vue (view) de manière automatique…
Je vous propose donc de l’utiliser via un view helper!
L’aide de vue
Voici l’aide de vue (view helper) FlashMessenger (du même nom que l’action helper). Il est à placer dans application/views/helpers/FlashMessenger.php
<?php /** * @see Zend_Controller_Action_Helper_FlashMessenger */ require_once 'Zend/Controller/Action/Helper/FlashMessenger.php'; /** * @author grummfy */ class Zend_View_Helper_FlashMessenger extends Zend_View_Helper_Abstract implements IteratorAggregate, Countable { protected $_fm; public function __construct() { $this->_fm = new Zend_Controller_Action_Helper_FlashMessenger(); } public function flashMessenger($cur = false) { if ($cur) return $this; else return $this->getMessages(); } /** * Return currents FlashMessegenr object * @return Zend_Controller_Action_Helper_FlashMessenger */ public function getFlasMessenger() { return $this->_fm; } /** * Return previous emmited messages * @return array */ public function getMessages() { return $this->_fm->getMessages(); } /** * Renvoi le nombre de messages passé * @return int */ public function hasMessages() { return count($this->_fm); } public function getIterator() { return $this->_fm->getIterator(); } public function count() { return $this->_fm->count(); } } # EOF |
Utilisation
Pour l’utiliser rien de plus simple, par exemple dans le layout :
<?php // flashmessage if ($this->flashMessenger(true)->hasMessages()): ?> <div id="flashMessengers"> <?php foreach($this->flashMessenger() as $msg) { echo '<div class="flashMessenger">'; if (is_array($msg)) echo implode('<br />', $msg); else echo $msg; echo '</div>'; } ?> </div> <?php endif; // fin flashmessage ?> |
Ceci peut très bien être utilisé dans votre vue (view) avec exactement le même code!
Pour envoyer le message il vous suffit de simplement faire, dans votre contrôleur :
$this->_helper->flashMessenger('Mise à jour du truc effectuées avec succès!'); |
Et c’est tout!
Similar Posts:
- None Found
Super intéressant comme article. Merci!
Je bosse actuellement sur une application basée sur ZF et j’essayais justement de comprendre comme accéder, depuis une aide de vue, à des éléments créés dans un « controller ».
J’ai donc essayé, en prenant comme test le « Messenger », et suis tomber sur cet article qui « contourne » mon soucis.
Avez-vous une idée sur la manière de procéder, dans mon cas :
– Imaginons : j’ai un objet crée par mon controlleur (par exemple des données sur un utilisateur)
– Dans ma vue, je souhaite afficher un bloc avec des données qui sont liées à cet utilisateur (en utilisant un View Helper, car réutilisation).
– La question : « Comment accéder à mon controller, depuis mon View Helper ? »
Merci d’avance.
Hello,
tu trouveras toutes une série de conseils sur ce site : http://www.z-f.fr/forum/index.php
Sinon pour accéder au controller :
$front = Zend_Controller_Front::getInstance();
$request = $front->getRequest();
Mais dans ton cas, tu prends le problème de travers (enfin je pense). Tu as plusieurs possibilités.
Si tu as un utilisateur il doit exister une session? si session, il y a donc un accès possible par là.
Sinon, on peux très bien imaginer utiliser un zend_registry.
Ou encore, simplement dans le contrôleur donnée les données à la vue avec un $this->view->madonnée
Merci,
Je me disais bien que ce n’était pas idéal.
Maintenant le cas de l’utilisateur etait un exemple.
J’aime bien l’idée du passage par la vue car cela me semble le plus logique, puisque l’aide de vue est lié à celle-ci.
Comme contournement, j’ai utilisé aussi l’aide de vue « Action » pour créer un bloc (DIV) avec un contenu spécifique. Mais ce n’est pas toujours adapter et je n’ai pas envie que l’on puisse y accéder en direct (par URL).
Je vais continuer à gratter. Merci.
Par contre, j’ai agrémenté un peu modifié ton exemple :
– En utilisant l’accesseur, plutot que la variable membre:
$this->getFlasMessenger()->...
Au lieu de :
$this->_fm->...
– En ajoutant une méthode : getHtml(); qui retourne directement un bloc DIV > UL > LI
Donc, voilà, à chacun son truc.