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

4
use UnicaenApp\Exception;
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
    
    /**
     * @var string
     */
    protected $containerInnerTemplate = '%s';
46
47

    /**
48
     * Helper entry point.
49
     *
50
51
     * @param bool $importFlashMessages 
     * @return self
52
     */
53
    public function __invoke($importFlashMessages = false)
54
    {
55
56
        if ($importFlashMessages) {
            $this->importFlashMessages();
57
        }
58
        
59
60
        return $this;
    }
61
    
62
63
64
65
66
67
68
    /**
     * Retourne le code HTML généré par cette aide de vue.
     * 
     * @return string
     */
    public function __toString()
    {
69
        return $this->render();
70
71
72
    }

    /**
73
     * Génère le code HTML.
74
75
76
     * 
     * @return string
     */
77
    protected function render()
78
79
80
81
82
83
84
85
    {
        if (!$this->hasMessages()) {
            return '';
        }

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

86
87
88
89
//        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]);
//        }
90
        foreach ($messages as $key => $message) {
91
92
93
94
95
//            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]);
//                }
96
97
98
99
100
101
                foreach ($message as $s => $m) {
                    $out .= sprintf(
                            $this->getTemplate(is_string($key) ? $key : (is_string($s) ? $s : 'info')),
                            implode('<br />', (array)$m)
                    );
                }
102
103
104
105
106
107
108
//            }
//            else {
//                $s = is_string($key) ? $key : ($this->severity ? $this->severity : 'info');
////                if ($this->severity && $this->severity == $s) {
////                    $out .= sprintf($this->getTemplate($s), $message) . '<br />';
////                }
//            }
109
110
111
112
113
        }

        return $out;
    }

114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
    /**
     * Importe les messages du FlashMessenger.
     * 
     * @return self
     */
    protected function importFlashMessages()
    {
        /* @var $fm \Zend\View\Helper\FlashMessenger */
        $fm = $this->getView()->getHelperPluginManager()->get('flashMessenger');
        
        foreach ($fm->getInfoMessages() as $message) {
            $this->addMessage($message, self::INFO);
        }
        foreach ($fm->getErrorMessages() as $message) {
            $this->addMessage($message, self::ERROR);
        }
        foreach ($fm->getSuccessMessages() as $message) {
            $this->addMessage($message, self::SUCCESS);
        }
        
        return $this;
    }

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
177
178
179
180
181
182
183
184
185
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
    /**
     * 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) {
            if (is_numeric($severity)) {
                $severity = 'info';
            }
            foreach ((array)$message as $m) {
                $this->messages[$severity][] = $m;
            }
        }
        return $this;
    }
    
    /**
     * 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)
    {
        $this->messages[$severity][] = $message;
        return $this;
    }
    
    /**
     * 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;
    }

    /**
225
     * Retourne le motif utilisé pour générer le conteneur de chaque message à afficher.
226
227
     *
     * @param string $severity Ex: Messenger::INFO
228
     * @param string $containerId Dom id éventuel à utiliser pour la div englobante
229
230
     * @return string 
     */
231
    public function getTemplate($severity, $containerId = null)
232
233
    {
        if (!isset($this->uiClasses[$severity])) {
234
            throw new Exception("Sévérité inconnue: " . $severity);
235
236
        }
        
237
238
239
        $innerTemplate = $this->containerInnerTemplate ?: '%s';
        
        $containerId = $containerId ? sprintf('id="%s"', $containerId) : '';
240
241

        $template = <<<EOT
242
<p class="messenger alert alert-{$this->uiClasses[$severity][0]}" {$containerId}>
243
244
    <button type="button" class="close" data-dismiss="alert">&times;</button>
    <!--<i class="icon-{$this->uiClasses[$severity][1]}"></i>-->
245
    $innerTemplate
246
247
248
249
</p>
EOT;
        return $template . PHP_EOL;
    }
250
251
252
253
254
255
256
257
258
259
260
    
    /**
     * 
     * @param string $containerInnerTemplate 
     * @return self
     */
    public function setContainerInnerTemplate($containerInnerTemplate = '%s')
    {
        $this->containerInnerTemplate = $containerInnerTemplate;
        return $this;
    }
261
}