Utilisation de FlashMessenger via un view helper dans Zend Framework

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:

3 réflexions sur “Utilisation de FlashMessenger via un view helper dans Zend Framework

  1. 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

  2. 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.

Les commentaires sont fermés.