mirror of
https://github.com/e107inc/e107.git
synced 2025-08-06 14:46:56 +02:00
Message handler improvements: PHP4 support dropped, new functionality 'message stack' added
This commit is contained in:
@@ -9,8 +9,8 @@
|
|||||||
* Message Handler
|
* Message Handler
|
||||||
*
|
*
|
||||||
* $Source: /cvs_backup/e107_0.8/e107_handlers/message_handler.php,v $
|
* $Source: /cvs_backup/e107_0.8/e107_handlers/message_handler.php,v $
|
||||||
* $Revision: 1.12 $
|
* $Revision: 1.13 $
|
||||||
* $Date: 2009-04-20 15:07:00 $
|
* $Date: 2009-07-31 16:11:35 $
|
||||||
* $Author: secretr $
|
* $Author: secretr $
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -28,74 +28,104 @@ define('E_MESSAGE_DEBUG', 'debug');
|
|||||||
|
|
||||||
//FIXME - language file! new?
|
//FIXME - language file! new?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle system messages
|
||||||
|
*
|
||||||
|
* @package e107
|
||||||
|
* @category e107_handlers
|
||||||
|
* @version 1.1
|
||||||
|
* @author SecretR
|
||||||
|
* @copyright Copyright (c) 2009, e107 Inc.
|
||||||
|
*/
|
||||||
class eMessage
|
class eMessage
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* System Message Array
|
* System Message Array
|
||||||
|
* in format [type][message_stack] = array(message[, ...])
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
* @access private
|
|
||||||
*/
|
*/
|
||||||
var $_sysmsg = array();
|
protected $_sysmsg = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Session key for storing session messages
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $_session_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Singleton instance
|
||||||
|
*
|
||||||
|
* @var eMessage
|
||||||
|
*/
|
||||||
|
protected static $_instance = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
*
|
||||||
|
* Use {@link getInstance()}, direct instantiating
|
||||||
|
* is not possible for signleton objects
|
||||||
*
|
*
|
||||||
* @param string $php4_check PHP4 singleton fix
|
* @return void
|
||||||
* @return eMessage
|
|
||||||
*
|
|
||||||
* @access protected
|
|
||||||
*/
|
*/
|
||||||
function eMessage($php4_check)
|
protected function __construct()
|
||||||
{
|
{
|
||||||
if($php4_check !== 'e107_emessage_php4_very_long_hard_to_remember_check')
|
|
||||||
{
|
|
||||||
exit('Fatal error! You are not allowed to direct instantinate an object for singleton class! Please use eMessage::getInstance()');
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!session_id()) session_start();
|
if(!session_id()) session_start();
|
||||||
|
|
||||||
if(isset($_SESSION['e107_system_messages']) && is_array($_SESSION['e107_system_messages']))
|
require_once(e_HANDLER.'e107_class.php');
|
||||||
{
|
$this->_session_id = e107::getPref('cookie_name', 'e107').'_system_messages';
|
||||||
$this->_sysmsg = $_SESSION['e107_system_messages'];
|
|
||||||
return $this->resetSession();
|
$this->reset()->_mergeSession();
|
||||||
}
|
|
||||||
|
|
||||||
return $this->reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get singleton instance
|
* Cloning is not allowed
|
||||||
*
|
*
|
||||||
* @return object eMessage instance
|
|
||||||
* @access public static
|
|
||||||
*/
|
*/
|
||||||
function &getInstance()
|
private function __clone()
|
||||||
{
|
{
|
||||||
static $instance = array();
|
}
|
||||||
|
|
||||||
if(empty($instance))
|
/**
|
||||||
{
|
* Get singleton instance (php4 no more supported)
|
||||||
$instance[0] = new eMessage('e107_emessage_php4_very_long_hard_to_remember_check');
|
*
|
||||||
}
|
* @return e107
|
||||||
return $instance[0];
|
*/
|
||||||
|
public static function getInstance()
|
||||||
|
{
|
||||||
|
if(null == self::$_instance)
|
||||||
|
{
|
||||||
|
self::$_instance = new self();
|
||||||
|
}
|
||||||
|
return self::$_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add message to a type stack
|
* Add message to a type stack and default message stack
|
||||||
|
* If $message is array, $message[0] will be the message stack and
|
||||||
|
* $message[1] the message itself
|
||||||
*
|
*
|
||||||
* @param string $message
|
* @param string|array $message
|
||||||
* @param string $type
|
* @param string $type
|
||||||
* @param bool $session
|
* @param boolean $session
|
||||||
* @return eMessage
|
* @return eMessage
|
||||||
*/
|
*/
|
||||||
function add($message, $type = E_MESSAGE_INFO, $session = false)
|
public function add($message, $type = E_MESSAGE_INFO, $session = false)
|
||||||
{
|
{
|
||||||
if(empty($message)) return $this;
|
if(empty($message)) return $this;
|
||||||
|
|
||||||
|
$mstack = 'default';
|
||||||
|
$msg = $message;
|
||||||
|
if(is_array($message))
|
||||||
|
{
|
||||||
|
$mstack = $message[0];
|
||||||
|
$msg = $message[1];
|
||||||
|
}
|
||||||
|
|
||||||
if(!$session)
|
if(!$session)
|
||||||
{
|
{
|
||||||
if($this->isType($type)) $this->_sysmsg[$type][] = $message;
|
if($this->isType($type)) $this->_sysmsg[$type][$mstack][] = $msg;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
return $this->addSession($message, $type);
|
return $this->addSession($message, $type);
|
||||||
@@ -103,16 +133,25 @@ class eMessage
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add message to a _SESSION type stack
|
* Add message to a _SESSION type stack
|
||||||
*
|
* If $message is array, $message[0] will be the message stack and
|
||||||
* @param string $message
|
* $message[1] the message itself
|
||||||
|
*
|
||||||
|
* @param string|array $message
|
||||||
* @param string $type
|
* @param string $type
|
||||||
* @return eMessage
|
* @return eMessage
|
||||||
*/
|
*/
|
||||||
function addSession($message, $type = E_MESSAGE_INFO)
|
public function addSession($message, $type = E_MESSAGE_INFO)
|
||||||
{
|
{
|
||||||
if(empty($message)) return $this;
|
if(empty($message)) return $this;
|
||||||
|
|
||||||
|
$mstack = 'default';
|
||||||
|
if(is_array($message))
|
||||||
|
{
|
||||||
|
$mstack = $message[0];
|
||||||
|
$message = $message[1];
|
||||||
|
}
|
||||||
|
|
||||||
if($this->isType($type)) $_SESSION['e107_system_messages'][$type][] = $message;
|
if($this->isType($type)) $_SESSION[$this->_session_id][$type][$mstack][] = $message;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,12 +159,15 @@ class eMessage
|
|||||||
* Get type title (multi-language)
|
* Get type title (multi-language)
|
||||||
*
|
*
|
||||||
* @param string $type
|
* @param string $type
|
||||||
|
* @param string $message_stack
|
||||||
* @return string title
|
* @return string title
|
||||||
*
|
|
||||||
* @access public static
|
|
||||||
*/
|
*/
|
||||||
function getTitle($type)
|
public static function getTitle($type, $message_stack = 'default')
|
||||||
{
|
{
|
||||||
|
if($message_stack && $message_stack != 'default' && defined('EMESSLAN_TITLE_'.strtoupper($type.'_'.$message_stack)))
|
||||||
|
{
|
||||||
|
return constant('EMESSLAN_TITLE_'.strtoupper($type.'_'.$message_stack));
|
||||||
|
}
|
||||||
return defsettrue('EMESSLAN_TITLE_'.strtoupper($type), '');
|
return defsettrue('EMESSLAN_TITLE_'.strtoupper($type), '');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,60 +175,63 @@ class eMessage
|
|||||||
* Message getter
|
* Message getter
|
||||||
*
|
*
|
||||||
* @param string $type valid type
|
* @param string $type valid type
|
||||||
|
* @param string $mstack message stack name
|
||||||
* @param bool $raw force array return
|
* @param bool $raw force array return
|
||||||
* @param bool $reset reset message type stack
|
* @param bool $reset reset message type stack
|
||||||
* @return string|array message
|
* @return string|array message
|
||||||
*/
|
*/
|
||||||
function get($type, $raw = false, $reset = true)
|
public function get($type, $mstack = 'default', $raw = false, $reset = true)
|
||||||
{
|
{
|
||||||
$message = varsettrue($this->_sysmsg[$type], array());
|
$message = isset($this->_sysmsg[$type][$mstack]) ? $this->_sysmsg[$type][$mstack] : '';
|
||||||
if($reset) $this->reset($type);
|
if($reset) $this->reset($type, $mstack, false);
|
||||||
|
|
||||||
return (true === $raw ? $message : eMessage::formatMessage($type, $message));
|
return (true === $raw ? $message : self::formatMessage($mstack, $type, $message));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Session message getter
|
* Session message getter
|
||||||
*
|
*
|
||||||
* @param string $type valid type
|
* @param string $type valid type
|
||||||
|
* @param string $mstack message stack
|
||||||
* @param bool $raw force array return
|
* @param bool $raw force array return
|
||||||
* @param bool $reset reset session message type stack
|
* @param bool $reset reset session message type stack
|
||||||
* @return string|array session message
|
* @return string|array session message
|
||||||
*/
|
*/
|
||||||
function getSession($type, $raw = false, $reset = true)
|
public function getSession($type, $mstack = 'default', $raw = false, $reset = true)
|
||||||
{
|
{
|
||||||
$message = varsettrue($_SESSION['e107_system_messages'][$type], array());
|
$message = isset($_SESSION[$this->_session_id][$type][$mstack]) ? $_SESSION[$this->_session_id][$type][$mstack] : '';
|
||||||
if($reset) $this->resetSession($type);
|
if($reset) $this->resetSession($type, $mstack);
|
||||||
|
|
||||||
return (true === $raw ? $message : eMessage::formatMessage($type, $message));
|
return (true === $raw ? $message : self::formatMessage($mstack, $type, $message));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Output all accumulated messages
|
* Output all accumulated messages
|
||||||
*
|
*
|
||||||
|
* @param string $mstack message stack name
|
||||||
* @param bool $raw force return type array
|
* @param bool $raw force return type array
|
||||||
* @param bool $reset reset all messages
|
* @param bool $reset reset all messages
|
||||||
* @param bool $session merge with session messages
|
* @param bool $session merge with session messages
|
||||||
* @return array|string messages
|
* @return array|string messages
|
||||||
*/
|
*/
|
||||||
function render($raw = false, $reset = true, $session = false)
|
public function render($mstack = 'default', $raw = false, $reset = true, $session = false)
|
||||||
{
|
{
|
||||||
if($session)
|
if($session)
|
||||||
{
|
{
|
||||||
$this->_merge();
|
$this->_mergeSession(true, $mstack);
|
||||||
}
|
}
|
||||||
$ret = array();
|
$ret = array();
|
||||||
|
|
||||||
foreach ($this->_get_types() as $type)
|
foreach ($this->_get_types() as $type)
|
||||||
{
|
{
|
||||||
$message = $this->get($type, $raw);
|
$message = $this->get($type, $mstack, $raw);
|
||||||
if(!empty($message))
|
if(!empty($message))
|
||||||
{
|
{
|
||||||
$ret[$type] = $message;
|
$ret[$type] = $message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($reset) $this->reset(false);
|
if($reset) $this->reset(false, $mstack);
|
||||||
if(true === $raw || empty($ret)) return ($raw ? $ret : '');
|
if(true === $raw || empty($ret)) return ($raw ? $ret : '');
|
||||||
|
|
||||||
//changed to class
|
//changed to class
|
||||||
@@ -200,13 +245,12 @@ class eMessage
|
|||||||
/**
|
/**
|
||||||
* Create message block markup based on its type.
|
* Create message block markup based on its type.
|
||||||
*
|
*
|
||||||
|
* @param string $mstack
|
||||||
* @param string $type
|
* @param string $type
|
||||||
* @param array|string $message
|
* @param array|string $message
|
||||||
* @return string formated message
|
* @return string
|
||||||
*
|
|
||||||
* @access public static
|
|
||||||
*/
|
*/
|
||||||
function formatMessage($type, $message)
|
public static function formatMessage($mstack, $type, $message)
|
||||||
{
|
{
|
||||||
if (empty($message)) return '';
|
if (empty($message)) return '';
|
||||||
elseif (is_array($message))
|
elseif (is_array($message))
|
||||||
@@ -215,7 +259,7 @@ class eMessage
|
|||||||
}
|
}
|
||||||
return "
|
return "
|
||||||
<div class='{$type}'>
|
<div class='{$type}'>
|
||||||
<div class='s-message-title'>".eMessage::getTitle($type)."</div>
|
<div class='s-message-title'>".self::getTitle($type, $mstack)."</div>
|
||||||
<div class='s-message-body'>
|
<div class='s-message-body'>
|
||||||
{$message}
|
{$message}
|
||||||
</div>
|
</div>
|
||||||
@@ -226,16 +270,43 @@ class eMessage
|
|||||||
/**
|
/**
|
||||||
* Reset message array
|
* Reset message array
|
||||||
*
|
*
|
||||||
* @param mixed $type false for reset all, or type constant
|
* @param mixed $type false for reset all or type string
|
||||||
* @param bool $session reset session messages as well
|
* @param mixed $mstack false for reset all or stack name string
|
||||||
|
* @param boolean $session reset session messages as well
|
||||||
* @return eMessage
|
* @return eMessage
|
||||||
*/
|
*/
|
||||||
function reset($type = false, $session = false)
|
public function reset($type = false, $mstack = false, $session = false)
|
||||||
{
|
{
|
||||||
if(false === $type) $this->_sysmsg = $this->_type_map();
|
if(false === $type)
|
||||||
elseif(isset($this->_sysmsg[$type])) $this->_sysmsg[$type] = array();
|
{
|
||||||
|
if(false === $mstack)
|
||||||
|
{
|
||||||
|
$this->_sysmsg = $this->_type_map();
|
||||||
|
}
|
||||||
|
elseif(is_array($this->_sysmsg))
|
||||||
|
{
|
||||||
|
foreach ($this->_sysmsg as $t => $_mstack)
|
||||||
|
{
|
||||||
|
if(is_array($_mstack))
|
||||||
|
{
|
||||||
|
unset($this->_sysmsg[$t][$mstack]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif(isset($this->_sysmsg[$type]))
|
||||||
|
{
|
||||||
|
if(false === $mstack)
|
||||||
|
{
|
||||||
|
$this->_sysmsg[$type] = array();
|
||||||
|
}
|
||||||
|
elseif(is_array($this->_sysmsg[$type]))
|
||||||
|
{
|
||||||
|
unset($this->_sysmsg[$type][$mstack]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if($session) $this->resetSession($type);
|
if($session) $this->resetSession($type, $mstack);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -244,12 +315,39 @@ class eMessage
|
|||||||
* Reset _SESSION message array
|
* Reset _SESSION message array
|
||||||
*
|
*
|
||||||
* @param mixed $type false for reset all, or valid type constant
|
* @param mixed $type false for reset all, or valid type constant
|
||||||
|
* @param mixed $mstack false for reset all or stack name string
|
||||||
* @return eMessage
|
* @return eMessage
|
||||||
*/
|
*/
|
||||||
function resetSession($type = false)
|
public function resetSession($type = false, $mstack = false)
|
||||||
{
|
{
|
||||||
if(!$type) $_SESSION['e107_system_messages'] = $this->_type_map();
|
if(false === $type)
|
||||||
elseif(isset($_SESSION['e107_system_messages'][$type])) $_SESSION['e107_system_messages'][$type] = array();
|
{
|
||||||
|
if(false === $mstack)
|
||||||
|
{
|
||||||
|
$_SESSION[$this->_session_id] = $this->_type_map();
|
||||||
|
}
|
||||||
|
elseif($_SESSION[$this->_session_id])
|
||||||
|
{
|
||||||
|
foreach ($_SESSION[$this->_session_id] as $t => $_mstack)
|
||||||
|
{
|
||||||
|
if(is_array($_mstack))
|
||||||
|
{
|
||||||
|
unset($_SESSION[$this->_session_id][$t][$mstack]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif(isset($_SESSION[$this->_session_id][$type]))
|
||||||
|
{
|
||||||
|
if(false === $mstack)
|
||||||
|
{
|
||||||
|
$_SESSION[$this->_session_id][$type] = array();
|
||||||
|
}
|
||||||
|
elseif(is_array($_SESSION[$this->_session_id][$type]))
|
||||||
|
{
|
||||||
|
unset($_SESSION[$this->_session_id][$type][$mstack]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -257,18 +355,34 @@ class eMessage
|
|||||||
/**
|
/**
|
||||||
* Merge _SESSION message array with the current messages
|
* Merge _SESSION message array with the current messages
|
||||||
*
|
*
|
||||||
* @param bool $reset
|
* @param boolean $reset
|
||||||
* @return eMessage
|
* @return eMessage
|
||||||
*/
|
*/
|
||||||
function _merge($reset = true)
|
protected function _mergeSession($reset = true, $mstack = false)
|
||||||
{
|
{
|
||||||
foreach (array_keys($_SESSION['e107_system_messages']) as $type)
|
if(is_array($_SESSION[$this->_session_id]))
|
||||||
{
|
{
|
||||||
if(!$this->isType($type)) continue;
|
foreach (array_keys($_SESSION[$this->_session_id]) as $type)
|
||||||
$this->_sysmsg[$type] = array_merge($this->_sysmsg[$type], $_SESSION['e107_system_messages'][$type]);
|
{
|
||||||
|
if(!$this->isType($type))
|
||||||
|
{
|
||||||
|
unset($_SESSION[$this->_session_id][$type]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(false === $mstack)
|
||||||
|
{
|
||||||
|
$this->_sysmsg[$type] = array_merge_recursive($this->_sysmsg[$type], $_SESSION[$this->_session_id][$type]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($_SESSION[$this->_session_id][$type][$mstack]))
|
||||||
|
{
|
||||||
|
$this->_sysmsg[$type][$mstack] = $_SESSION[$this->_session_id][$type][$mstack];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if($reset) $this->resetSession(false, $mstack);
|
||||||
if($reset) $this->resetSession();
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,9 +390,9 @@ class eMessage
|
|||||||
* Check passed type against the type map
|
* Check passed type against the type map
|
||||||
*
|
*
|
||||||
* @param mixed $type
|
* @param mixed $type
|
||||||
* @return bool
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
function isType($type)
|
public function isType($type)
|
||||||
{
|
{
|
||||||
return (array_key_exists($type, $this->_type_map()));
|
return (array_key_exists($type, $this->_type_map()));
|
||||||
}
|
}
|
||||||
@@ -287,22 +401,24 @@ class eMessage
|
|||||||
* Check for messages
|
* Check for messages
|
||||||
*
|
*
|
||||||
* @param mixed $type
|
* @param mixed $type
|
||||||
* @param bool $session
|
* @param boolean $session
|
||||||
* @return bool
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
function hasMessage($type = false, $session = true)
|
public function hasMessage($type = false, $mstack = false, $session = true)
|
||||||
{
|
{
|
||||||
|
if(!$mstack) $mstack = 'default';
|
||||||
|
|
||||||
if(false === $type)
|
if(false === $type)
|
||||||
{
|
{
|
||||||
foreach ($this->_get_types() as $_type)
|
foreach ($this->_get_types() as $_type)
|
||||||
{
|
{
|
||||||
if($this->get($_type, true, false) || ($session && $this->getSession($_type, true, false)))
|
if($this->get($_type, $mstack, true, false) || ($session && $this->getSession($_type, $mstack, true, false)))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ($this->get($type, true, false) || ($session && $this->getSession($type, true, false)));
|
return ($this->get($type, $mstack, true, false) || ($session && $this->getSession($type, $mstack, true, false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -310,7 +426,7 @@ class eMessage
|
|||||||
*
|
*
|
||||||
* @return array type map
|
* @return array type map
|
||||||
*/
|
*/
|
||||||
function _type_map()
|
protected function _type_map()
|
||||||
{
|
{
|
||||||
//show them in this order!
|
//show them in this order!
|
||||||
return array(
|
return array(
|
||||||
@@ -327,7 +443,7 @@ class eMessage
|
|||||||
*
|
*
|
||||||
* @return array valid message types
|
* @return array valid message types
|
||||||
*/
|
*/
|
||||||
function _get_types()
|
protected function _get_types()
|
||||||
{
|
{
|
||||||
return array_keys($this->_type_map());
|
return array_keys($this->_type_map());
|
||||||
}
|
}
|
||||||
@@ -414,4 +530,4 @@ function show_emessage($mode, $message, $line = 0, $file = "") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
Reference in New Issue
Block a user