Messenger.php 9.48 KB
Newer Older
1
2
3
<?php
namespace UnicaenApp\View\Helper;

4
use UnicaenApp\Exception\LogicException;
5
6
7
8
9
10
use UnicaenApp\View\Helper\Messenger;
use Zend\View\Helper\AbstractHelper;

/**
 * Aide de vue permettant de stocker une liste de messages d'information de différentes sévérités 
 * et de générer le code HTML pour les afficher (affublés d'un icône correspondant à leur sévérité). 
11
12
 * 
 * Possibilité d'importer les messages du FlashMessenger pour les mettre en forme de la même manière.
13
14
15
16
17
18
 *
 * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
 */
class Messenger extends AbstractHelper
{
    const INFO    = 'info';
19
    const SUCCESS = 'success';
20
    const WARNING = 'warning';
21
    const ERROR   = 'danger';
22
23
    
    protected $uiClasses = array( // CSS class, icon name
24
25
26
        self::INFO    => array('info',    'info-sign'),
        self::SUCCESS => array('success', 'ok-sign'),
        self::WARNING => array('warning', 'warning-sign'),
27
        self::ERROR   => array('danger',  'exclamation-sign'),
28
    );
29
    
30
31
32
33
34
35
36
37
38
39
40
    /**
     * Messages courants
     * @var array
     */
    protected $messages = array();
    
    /**
     * Seule sévérité éventuelle à prendre en compte
     * @var string
     */
    protected $severity = null;
41
    
42
43
44
45
46
47
    /**
     * Activation ou non de l'affichage de l'icône
     * @var bool
     */
    protected $withIcon = true;
    
48
49
50
51
    /**
     * @var string
     */
    protected $containerInnerTemplate = '%s';
52
53

    /**
54
     * Helper entry point.
55
     *
56
     * @return self
57
     */
58
    public function __invoke()
59
60
61
    {
        return $this;
    }
62
    
63
64
65
66
67
68
69
    /**
     * Retourne le code HTML généré par cette aide de vue.
     * 
     * @return string
     */
    public function __toString()
    {
70
71
72
73
        try {
            return $this->render();
        }
        catch (\Exception $exc) {
74
            var_dump($exc->getMessage(), \UnicaenApp\Util::formatTraceString($exc->getTraceAsString()));die;
75
        }
76
    }
77
78

    /**
79
     * Génère le code HTML.
80
81
82
     * 
     * @return string
     */
83
    protected function render()
84
85
86
87
88
89
90
91
    {
        if (!$this->hasMessages()) {
            return '';
        }

        $messages = (array)$this->getMessages();
        $out = '';

92
93
94
95
//        if ($this->severity && isset($messages[$this->severity])) {
//            // on ne conserve que la sévérité éventuellement demandée
//            $messages = array($this->severity => $messages[$this->severity]);
//        }
96
        foreach ($messages as $key => $message) {
97
98
99
100
101
//            if (is_array($message)) {
//                if ($this->severity && isset($message[$this->severity])) {
//                    // on ne conserve que la sévérité éventuellement demandée
//                    $message = array($this->severity => $message[$this->severity]);
//                }
102
103
104
105
106
107
                foreach ($message as $s => $m) {
                    $out .= sprintf(
                            $this->getTemplate(is_string($key) ? $key : (is_string($s) ? $s : 'info')),
                            implode('<br />', (array)$m)
                    );
                }
108
109
110
111
112
113
114
//            }
//            else {
//                $s = is_string($key) ? $key : ($this->severity ? $this->severity : 'info');
////                if ($this->severity && $this->severity == $s) {
////                    $out .= sprintf($this->getTemplate($s), $message) . '<br />';
////                }
//            }
115
116
117
118
119
        }

        return $out;
    }

120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
    /**
     * Importe les messages du FlashMessenger.
     * 
     * @return self
     */
    protected function importFlashMessages()
    {
        /* @var $fm \Zend\View\Helper\FlashMessenger */
        $fm = $this->getView()->getHelperPluginManager()->get('flashMessenger');
        
        foreach ($fm->getErrorMessages() as $message) {
            $this->addMessage($message, self::ERROR);
        }
        foreach ($fm->getSuccessMessages() as $message) {
            $this->addMessage($message, self::SUCCESS);
        }
136
137
138
        foreach ($fm->getInfoMessages() as $message) {
            $this->addMessage($message, self::INFO);
        }
139
140
141
        
        return $this;
    }
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
    
    /**
     * Spécifie l'unique message courant au format Exception.
     * 
     * @param \Exception $exception Exception
     * @param string $severity Ex: Messenger::INFO
     * @return Messenger
     */
    public function setException(\Exception $exception, $severity = self::ERROR)
    {
        $message = sprintf("<p><strong>%s</strong></p>", $exception->getMessage());
        if (($previous = $exception->getPrevious())) {
            $message .= sprintf("<p>Cause :<br />%s</p>", $previous->getMessage());
        }
        return $this->setMessages(array($severity => $message));
    }
158

159
160
161
162
163
164
165
166
167
168
    /**
     * Spécifie les messages courants (remplaçant les messages existants).
     * 
     * @param string|array $messages
     * @return Messenger
     */
    public function setMessages($messages)
    {
        $this->messages = array();
        foreach ((array)$messages as $severity => $message) {
169
            $this->addMessage($message, $severity);
170
171
172
        }
        return $this;
    }
173
174
175
176
177
178
179
180
181
182
183
184
185

    /**
     * Importe les messages courants du FlashMessenger (remplaçant les messages existants).
     * 
     * @return Messenger
     */
    public function setMessagesFromFlashMessenger()
    {
        $this->messages = array();
        $this->importFlashMessages();
        
        return $this;
    }
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
    
    /**
     * Spécifie l'unique message courant.
     * 
     * @param string $message Message
     * @param string $severity Ex: Messenger::INFO
     * @return Messenger
     */
    public function setMessage($message, $severity = self::INFO)
    {
        return $this->setMessages(array($severity => $message));
    }
    
    /**
     * Indique si cette aide de vue contient des messages actuellement.
     * 
     * @param string $severity Seule sévérité éventuelle à prendre en compte, ex: Messenger::INFO
     * @return bool
     */
    public function hasMessages($severity = null)
    {
        return (boolean)$this->getMessages($severity);
    }
    
    /**
     * Retourne les messages courants.
     * 
     * @param string $severity Seule sévérité éventuelle à prendre en compte, ex: Messenger::INFO
     * @return array
     */
    public function getMessages($severity = null)
    {
        if ($severity && array_key_exists($severity, $this->messages)) {
            return $this->messages[$severity];
        }
        return $this->messages;
    }
    
    /**
     * Ajoute un message.
     * 
     * @param string $message Message
     * @param string $severity Sévérité, ex: Messenger::INFO
     * @return Messenger
     */
    public function addMessage($message, $severity = self::INFO)
    {
233
234
235
        if (!$severity || !is_string($severity)) {
            $severity = self::INFO;
        }
236
237
238
239
        $this->messages[$severity][] = $message;
        return $this;
    }
    
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
    /**
     * Ajoute plusieurs messages.
     * 
     * @param array $messages [Sévérité => Message]
     * @return Messenger
     */
    public function addMessages($messages)
    {
        foreach ($messages as $severity => $message) {
            $this->addMessage($message, $severity);
        }
        
        return $this;
    }
    
255
    /**
256
     * Ajoute les messages courants du FlashMessenger.
257
258
259
     * 
     * @return Messenger
     */
260
    public function addMessagesFromFlashMessenger()
261
    {
262
263
        $this->importFlashMessages();
        
264
265
266
        return $this;
    }
    
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
    /**
     * Supprime tous les messages courants.
     * 
     * @param string $severity Seule sévérité éventuelle à prendre en compte, ex: Messenger::INFO
     * @return Messenger
     */
    public function clearMessages($severity = null)
    {
        if ($severity && array_key_exists($severity, $this->getMessages())) {
            $this->messages[$severity] = array();
        }
        else {
            $this->messages = array();
        }
        return $this;
    }
283
284
285
286
287
288
289
290
291
292
293
294
    
    /**
     * Active ou non l'affichage de l'icône.
     * 
     * @param bool $withIcon <tt>true</tt> pour activer l'affichage de l'icône.
     * @return Messenger
     */
    public function withIcon($withIcon = true)
    {
        $this->withIcon = (bool) $withIcon;
        return $this;
    }
295
296

    /**
297
     * Retourne le motif utilisé pour générer le conteneur de chaque message à afficher.
298
299
     *
     * @param string $severity Ex: Messenger::INFO
300
     * @param string $containerId Dom id éventuel à utiliser pour la div englobante
301
302
     * @return string 
     */
303
    public function getTemplate($severity, $containerId = null)
304
305
    {
        if (!isset($this->uiClasses[$severity])) {
306
            throw new LogicException("Sévérité inconnue: " . $severity);
307
308
        }
        
309
        $innerTemplate = $this->containerInnerTemplate ?: '%s';
310
311
        $iconMarkup    = $this->withIcon ? "<span class=\"glyphicon glyphicon-{$this->uiClasses[$severity][1]}\"></span> " : null;
        $containerId   = $containerId ? sprintf('id="%s"', $containerId) : '';
312
313

        $template = <<<EOT
314
<div class="messenger alert alert-{$this->uiClasses[$severity][0]}" {$containerId}>
315
316
    <button type="button" class="close" title="Fermer cette alerte" data-dismiss="alert">&times;</button>
    $iconMarkup 
317
    $innerTemplate
318
</div>
319
320
321
EOT;
        return $template . PHP_EOL;
    }
322
323
324
325
326
327
328
329
330
331
332
    
    /**
     * 
     * @param string $containerInnerTemplate 
     * @return self
     */
    public function setContainerInnerTemplate($containerInnerTemplate = '%s')
    {
        $this->containerInnerTemplate = $containerInnerTemplate;
        return $this;
    }
333
}