<?php
/**
* MessageStack类管理要显示的信息消息。
*显示的信息将自动从堆栈中删除。
*核心消息类型:信息,成功,警告,错误
*
* @since v3.0.0
*/
class MessageStack
{
/**
* 消息的存储处理程序
*
* @var array
* @since v3.0.0
*/
protected $_data = array();
/**
* 构造函数,注册关闭功能来存储剩余的消息
* in the session
*
* @since v3.0.0
*/
public function __construct()
{
register_shutdown_function(array($this, 'saveInSession'));
}
/**
* 将session中存储的消息加载到堆栈中
*
* @since v3.0.0
*/
public function loadFromSession()
{
if (isset($_SESSION['MessageStack_Data']) && !empty($_SESSION['MessageStack_Data'])) {
foreach ($_SESSION['MessageStack_Data'] as $group => $messages) {
foreach ($messages as $message) {
$this->_data[$group][] = $message;
}
}
unset($_SESSION['MessageStack_Data']);
}
}
/**
* 在session中存储剩余的消息
*
* @since v3.0.0
*/
public function saveInSession()
{
if (!empty($this->_data)) {
$_SESSION['MessageStack_Data'] = $this->_data;
}
}
/**
* 添加一条消息到堆栈
*
* @param string $group group消息所属的组
* @param string $message message消息信息文本
* @param string $type type消息类型:info,error,warning,success
* @since v3.0.0
*/
public function add($group, $message, $type = 'error')
{
$stack = array('text' => $message, 'type' => $type);
if (!$this->exists($group) || !in_array($stack, $this->_data[$group])) {
$this->_data[$group][] = $stack;
}
}
/**
* 重置消息堆栈
*
* @since v3.0.0
*/
public function reset()
{
$this->_data = array();
}
/**
* 检查堆栈中的组是否包含消息
*
* @param string $group group要检查的组的名称
* @since v3.0.0
*/
public function exists($group)
{
return array_key_exists($group, $this->_data);
}
/**
* 检查消息堆栈是否包含消息
*
* @since v3.0.0
*/
public function hasContent()
{
return !empty($this->_data);
}
/**
*获取属于一个组的消息。这些消息被放入一个
*用“messageStack”样式表封装在DIV元素中的未排序列表
*class。
*
* @param string $group group从中获取消息的组的名称
* @since v3.0.0
*/
public function get($group)
{
$result = false;
if ($this->exists($group)) {
$result = '<div class="messageStack"><ul>';
foreach ($this->_data[$group] as $message) {
switch ($message['type']) {
case 'error':
$bullet_image = 'error.gif';
break;
case 'warning':
$bullet_image = 'warning.gif';
break;
case 'success':
default:
$bullet_image = 'success.gif';
break;
}
$result .= '<li style="list-style-image: url(\'images'.$bullet_image . '\')">' . $this->output($message['text']) . '</li>';
}
$result .= '</ul></div>';
unset($this->_data[$group]);
}
return $result;
}
/**
* 获取属于一个组的消息。 消息由新行字符分隔。.
*
* @param string $group group从中获取消息的组的名称
* @since v3.0.0
*/
public function getRaw($group)
{
$result = false;
if ($this->exists($group)) {
$result = '';
foreach ($this->_data[$group] as $message) {
$result .= $this->output($message['text']) . "\n";
}
unset($this->_data[$group]);
}
return $result;
}
/**
* 获取消息堆栈数组数据集
*
* @since v3.0.0
*/
public function getAll()
{
return $this->_data;
}
/**
* 获取属于一个组的消息的数量
*
* @param string $group The name of the group to check
* @since v3.0.0
*/
public function size($group)
{
$size = 0;
if ($this->exists($group)) {
$size = count($this->_data[$group]);
}
return $size;
}
/**
* 解析用户提交的值
* @param $string
* @param null $translate
* @return string
*/
public function output($string, $translate = null) {
if ( !isset($translate) ) {
$translate = array('"' => '"');
}
return strtr(trim($string), $translate);
}
}
?>