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

4
5
use UnicaenApp\Traits\MessageAwareInterface;
use UnicaenApp\Traits\MessageAwareTrait;
6
use UnicaenApp\Exception\LogicException;
7
8
9
10
11
12
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é). 
13
14
 * 
 * Possibilité d'importer les messages du FlashMessenger pour les mettre en forme de la même manière.
15
16
17
 *
 * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
 */
18
class Messenger extends AbstractHelper implements MessageAwareInterface
19
{
20
21
    use MessageAwareTrait;
    
22
    const INFO    = 'info';
23
    const SUCCESS = 'success';
24
    const WARNING = 'warning';
25
    const ERROR   = 'danger';
26
27
    
    protected $uiClasses = array( // CSS class, icon name
28
29
30
        self::INFO    => array('info',    'info-sign'),
        self::SUCCESS => array('success', 'ok-sign'),
        self::WARNING => array('warning', 'warning-sign'),
31
        self::ERROR   => array('danger',  'exclamation-sign'),
32
    );
33
    
34
35
36
37
38
    /**
     * Seule sévérité éventuelle à prendre en compte
     * @var string
     */
    protected $severity = null;
39
    
40
41
42
43
44
45
    /**
     * Activation ou non de l'affichage de l'icône
     * @var bool
     */
    protected $withIcon = true;
    
46
47
48
49
    /**
     * @var string
     */
    protected $containerInnerTemplate = '%s';
50
51

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

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

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

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

        return $out;
    }

118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
    /**
     * 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);
        }
134
135
136
        foreach ($fm->getInfoMessages() as $message) {
            $this->addMessage($message, self::INFO);
        }
137
138
139
        
        return $this;
    }
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
    
    /**
     * 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));
    }
156

157
158
159
160
161
162
163
164
165
166
167
168
    /**
     * Importe les messages courants du FlashMessenger (remplaçant les messages existants).
     * 
     * @return Messenger
     */
    public function setMessagesFromFlashMessenger()
    {
        $this->messages = array();
        $this->importFlashMessages();
        
        return $this;
    }
169
    
170
    /**
171
     * Ajoute les messages courants du FlashMessenger.
172
173
174
     * 
     * @return Messenger
     */
175
    public function addMessagesFromFlashMessenger()
176
    {
177
178
        $this->importFlashMessages();
        
179
180
181
        return $this;
    }
    
182
183
184
185
186
187
188
189
190
191
192
    /**
     * 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;
    }
193
194

    /**
195
     * Retourne le motif utilisé pour générer le conteneur de chaque message à afficher.
196
197
     *
     * @param string $severity Ex: Messenger::INFO
198
     * @param string $containerId Dom id éventuel à utiliser pour la div englobante
199
200
     * @return string 
     */
201
    public function getTemplate($severity, $containerId = null)
202
203
    {
        if (!isset($this->uiClasses[$severity])) {
204
            throw new LogicException("Sévérité inconnue: " . $severity);
205
206
        }
        
207
        $innerTemplate = $this->containerInnerTemplate ?: '%s';
208
209
        $iconMarkup    = $this->withIcon ? "<span class=\"glyphicon glyphicon-{$this->uiClasses[$severity][1]}\"></span> " : null;
        $containerId   = $containerId ? sprintf('id="%s"', $containerId) : '';
210
211

        $template = <<<EOT
212
<div class="messenger alert alert-{$this->uiClasses[$severity][0]}" {$containerId}>
213
214
    <button type="button" class="close" title="Fermer cette alerte" data-dismiss="alert">&times;</button>
    $iconMarkup 
215
    $innerTemplate
216
</div>
217
218
219
EOT;
        return $template . PHP_EOL;
    }
220
221
222
223
224
225
226
227
228
229
230
    
    /**
     * 
     * @param string $containerInnerTemplate 
     * @return self
     */
    public function setContainerInnerTemplate($containerInnerTemplate = '%s')
    {
        $this->containerInnerTemplate = $containerInnerTemplate;
        return $this;
    }
231
}