MessageStack 类消息提示管理

<?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('"' => '&quot;');
		}
		return strtr(trim($string), $translate);
	}
}

?>