Bonjour à tous,

L'aide d'action flashMessenger est bien pratique pour stocker un ou plusieurs message jusqu'à la prochaine requête, mais il lui manque une aide de vue et des méthodes pour une utilisation plus concrète.

En reprenant les travaux de l'article suivant ici

J'ai rajouté une méthode toString qui permet de générer le message au format Html, utile pour les réponses Ajax.
Et une méthode direct pour appeler l'aide d'action directement.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
 
<?php
 
class App_Controller_Action_Helper_Flash extends Zend_Controller_Action_Helper_FlashMessenger
{
	const ERROR	 = 'error';
	const WARNING   = 'warning';
	const NOTICE	= 'notice';
	const SUCCESS   = 'success';
 
	/**
	 * $_namespace - Instance namespace, default is 'default'
	 *
	 * @var string
	 */
	protected $_namespace = 'default';
 
 
	private $_types = array(
			self::ERROR,
			self::WARNING,
			self::NOTICE,
			self::SUCCESS
	);
 
	/**
	 * 
	 */
	public function error($message, $class = null, $method = null)
	{
		return $this->_addMessage($message, self::ERROR, $class, $method);
	}
 
 
	/**
	 * 
	 */
	public function success($message, $class = null, $method = null)
	{
		return $this->_addMessage($message, self::SUCCESS, $class, $method);;
	}
 
 
	/**
	 * 
	 */
	public function warning($message, $class = null, $method = null)
	{
		return $this->_addMessage($message, self::WARNING, $class, $method);;
	}
 
 
	/**
	 * 
	 */
	public function notice($message, $class = null, $method = null)
	{
		return $this->_addMessage($message, self::NOTICE, $class, $method);;
	}
 
 
	/**
	 * 
	 */
	protected function _addMessage($message, $type, $class = null, $method = null)
	{
		if (self::$_messageAdded === false) {
			self::$_session->setExpirationHops(1, null, true);
		}
		if (!is_array(self::$_session->{$this->_namespace})) {
			self::$_session->{$this->_namespace}[$type] = array();
		}
		self::$_session->{$this->_namespace}[$type][] = $this->_factory($message, $type, $class, $method);
		return $this;
	}
 
 
	/**
	 * 
	 */
	protected function _factory($message, $type, $class = null, $method = null)
	{
		$messg = new stdClass();
		$messg->message = $message;
		$messg->type = $type;
		$messg->class = $class;
		$messg->method = $method;
		return $messg;
	}
 
 
	/**
	 * getMessages() - Get messages from a specific namespace
	 *
	 * @param unknown_type $namespace
	 * @return array
	 */
	public function getMessages($type = null)
	{
		if($type === null){
			return parent::getMessages();
		}
		if (isset(self::$_messages[$this->_namespace][$type])) {
			return self::$_messages[$this->_namespace][$type];
		}
		return array();
	}
 
 
	/**
	 * getCurrentMessages() - get messages that have been added to the current
	 * namespace within this request
	 *
	 * @return array
	 */
	public function getCurrentMessages($type = null)
	{
		if($type === null){
			return parent::getCurrentMessages();
		}
		if (isset(self::$_session->{$this->_namespace}[$type])) {
			return self::$_session->{$this->_namespace}[$type];
		}
		return array();
	}
 
    /**
     * Strategy pattern: proxy to addMessage()
     *
     * @return void
     */
    public function direct()
    {
        return $this;
    }
 
 
    /**
     * 
     */
	public function toString () 
	{
 
		$flashMessenger = Zend_Controller_Action_HelperBroker::getStaticHelper('Flash');
 
		$html = '';
		foreach ($this->_types as $type) {
			$messages = $flashMessenger->getMessages($type);
			if (!$messages){
				$messages = $flashMessenger->getCurrentMessages($type);
			}
			if ($messages) {
				if ( !$html ) {
					$html .= '<ul class="messages">';
				}
				$html .= '<li class="' . $type . '-msg">';
				$html .= '<ul>';
				foreach ( $messages as $message ) {
					$html.= '<li>';
					$html.= $message->message;
					$html.= '</li>';
				}
				$html .= '</ul>';
				$html .= '</li>';
			}
		}
		if ( $html) {
			$html .= '</ul>';
		}
 
		return $html;
 
	}
 
}//Eof::class
?>
Pour utiliser cette nouvelle aide d'action depuis votre controller

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
// Cas en utilisant l'aide de vue flash ci après
$this->_helper->flash->success('mon_message');
 
// Cas d'une réponse JSON
$flash = $this->_helper->flash->success('message_reponse_json')->toString();
Et Maintenant une aide de vue.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
<?php
/**
 * Aide de vue qui récupère les messages des l'aide d'action flash 
 */
class App_View_Helper_Flash extends Zend_View_Helper_Abstract 
{
 
 
	private $_types = array(
			App_Controller_Action_Helper_Flash::ERROR,
			App_Controller_Action_Helper_Flash::WARNING,
			App_Controller_Action_Helper_Flash::NOTICE,
			App_Controller_Action_Helper_Flash::SUCCESS
	);
 
 
	/**
	 * 
	 */
	public function flash()
	{
 
		$flashMessenger = Zend_Controller_Action_HelperBroker::getStaticHelper('Flash');
 
		$html = '';
		foreach ($this->_types as $type) {
			$messages = $flashMessenger->getMessages($type);
			if (!$messages){
				$messages = $flashMessenger->getCurrentMessages($type);
			}
			if ($messages) {
				if ( !$html ) {
					$html .= '<ul class="messages">';
				}
				$html .= '<li class="' . $type . '-msg">';
				$html .= '<ul>';
				foreach ( $messages as $message ) {
					$html.= '<li>';
					$html.= $message->message;
					$html.= '</li>';
				}
				$html .= '</ul>';
				$html .= '</li>';
			}
		}
		if ( $html) {
			$html .= '</ul>';
		}
 
		return $html;
	}
 
}
?>
Pour utiliser l'aide de vue
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
// depuis une vue
<?php echo $this->flash(); ?>
N'oubliez pas la feuille de style et les icônes adequat de l'article suivant

Avant de tomber sur cette article, je ne voyais pas l'intérêt de flashMessenger mais désormais convaincu, je partage.