Commit 62662210 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Nouvelles aides de vue : Messenger et FlashMessenger

parent 4b804e51
<?php
namespace UnicaenApp\View\Helper;
use Zend\Mvc\Controller\PluginManager;
/**
* Aide de vue affichant les messages positionnés en session par le plugin de
* contrôleur 'FlashMessenger'.
*
* 2 formats possibles pour chaque message, exemples :
* - <code>array('warning'=>"La demande 12 est introuvable!")</code>
* - <code>"Ceci est un message d'information."</code>,
* équivalent à <code>array('info'=>"Ceci est un message d'information.")</code>
*
* @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
*/
class FlashMessenger extends Messenger
{
/**
* @var PluginManager
*/
protected $pm;
/**
* Constructeur.
*
* @param PluginManager $pm
*/
public function __construct(PluginManager $pm)
{
$this->pm = $pm;
}
/**
* Point d'entrée.
*
* @return FlashMessenger fluent interface, returns self
*/
public function __invoke()
{
/* @var $fm FlashMessenger */
$fm = $this->pm->get('flashMessenger');
$messages = array();
foreach ($fm->getMessages() as $value) {
if (is_array($value)) {
$messages += $value;
}
else {
$messages[] = $value;
}
}
$this->setMessages($messages);
return $this;
}
}
<?php
namespace UnicaenApp\View\Helper;
use Exception;
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é).
*
* @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
*/
class Messenger extends AbstractHelper
{
const INFO = 'info';
const OK = 'ok';
const WARNING = 'warning';
const ERROR = 'error';
protected $uiClasses = array( // CSS class, icon name
self::INFO => array('info', 'info-sign'),
self::OK => array('success', 'ok-sign'),
self::WARNING => array('warning', 'warning-sign'),
self::ERROR => array('error', 'exclamation-sign'),
);
/**
* Messages courants
* @var array
*/
protected $messages = array();
/**
* Seule sévérité éventuelle à prendre en compte
* @var string
*/
protected $severity = null;
/**
* Helper entry point
*
* @param string $severity Ex: Messenger::INFO
* @return Messenger fluent interface, returns self
*/
public function __invoke($severity = null)
{
if ($severity) {
$this->severity = $severity;
}
return $this;
}
/**
* Retourne le code HTML généré par cette aide de vue.
*
* @return string
*/
public function __toString()
{
try {
return $this->render();
}
catch (Exception $e) {
$msg = get_class($e) . ': ' . $e->getMessage();
trigger_error($msg, E_USER_ERROR);
return '';
}
}
/**
* Génère le code HTML
*
* @return string
*/
public function render()
{
if (!$this->hasMessages()) {
return '';
}
$messages = (array)$this->getMessages();
$out = '';
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]);
}
foreach ($messages as $key => $message) {
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]);
}
foreach ($message as $s => $m) {
$out .= sprintf(
$this->getTemplate(is_string($key) ? $key : (is_string($s) ? $s : 'info')),
implode('<br />', (array)$m)
);
}
}
else {
$s = is_string($key) ? $key : ($this->severity ? $this->severity : 'info');
if ($this->severity && $this->severity == $s)
$out .= sprintf($this->getTemplate($s), $message) . '<br />';
}
}
return $out;
}
/**
* 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;
}
/**
* Retourne le motif utilisé pour générer le conteneur des messages à afficher.
*
* @param string $severity Ex: Messenger::INFO
* @param string $divId Dom id éventuel à utiliser pour la div englobante
* @param string $innerContainerTemplate Template du container éventuel
* contenant le message.
* @return string
*/
public function getTemplate($severity, $divId = null, $innerContainerTemplate = '%s')
{
if (!isset($this->uiClasses[$severity])) {
throw new Unicaen_Exception ("Sévérité inconnue: " . $severity);
}
$divId = $divId ? sprintf('id="%s"', $divId) : '';
$template = <<<EOT
<p class="messenger {$this->uiClasses[$severity][0]} text-{$this->uiClasses[$severity][0]}" {$divId}>
<i class="icon-{$this->uiClasses[$severity][1]}"></i>
$innerContainerTemplate
</p>
EOT;
return $template . PHP_EOL;
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment