diff --git a/e107_handlers/admin_log_class.php b/e107_handlers/admin_log_class.php index 9fbc285db..941bc9844 100644 --- a/e107_handlers/admin_log_class.php +++ b/e107_handlers/admin_log_class.php @@ -505,10 +505,10 @@ class e_admin_log * @param string $logTitle - title for log entry * @param int $logImportance - passed directly to admin log * @param string $logEventCode - passed directly to admin log - * + * @param string $mstack [optional] message stack passed to message handler * @return e_admin_log */ - public function flushMessages($logTitle, $logImportance = E_LOG_INFORMATIVE, $logEventCode = '') + public function flushMessages($logTitle, $logImportance = E_LOG_INFORMATIVE, $logEventCode = '', $mstack = false) { $mes = e107::getMessage(); @@ -531,7 +531,12 @@ class e_admin_log } if ($m['dislevel'] != LOG_MESSAGE_NODISPLAY) { - $mes->add($m['message'], $m['dislevel'], $m['session']); + if($mstack) + { + $mes->addStack($m['message'], $mstack, $m['dislevel'], $m['session']); + // move to main stack OUTSIDE if needed + } + else $mes->add($m['message'], $m['dislevel'], $m['session']); } } e107::getAdminLog()->log_event($logTitle, $logString, $logImportance, $logEventCode); diff --git a/e107_handlers/message_handler.php b/e107_handlers/message_handler.php index f05cf844f..1c373551b 100644 --- a/e107_handlers/message_handler.php +++ b/e107_handlers/message_handler.php @@ -59,6 +59,11 @@ class eMessage */ protected $_session_handler = null; + /** + * @var array + */ + protected $_unique = array(); + /** * Singleton instance * @@ -108,7 +113,7 @@ class eMessage /** * Set message session id * @param string $name - * @return object $this + * @return eMessage */ public function setSessionId($name = '') { @@ -128,7 +133,7 @@ class eMessage /** * Get session handler - * @return unknown_type + * @return eMessage */ public function getSessionHandler() { @@ -140,6 +145,22 @@ class eMessage } return $this->_session_handler; } + + + /** + * Set unique message stacks + * @param string $mstack message stack which should have only unique message values + * @return eMessage + */ + public function setUnique($mstack) + { + if(!in_array($mstack, $this->_unique)) + { + $this->_unique[] = $mstack; + } + return $this; + } + /** * Add message to a type stack and default message stack @@ -166,6 +187,8 @@ class eMessage if(!$session) { + // unique messages only + if(in_array($mstack, $this->_unique) && in_array($msg, $this->_sysmsg[$type][$mstack])) return $this; if($this->isType($type)) $this->_sysmsg[$type][$mstack][] = $msg; return $this; } @@ -287,6 +310,9 @@ class eMessage if($this->isType($type)) { + // unique messages only + if(in_array($mstack, $this->_unique) && in_array($msg, $SESSION[$type][$mstack])) return $this; + $SESSION[$type][$mstack][] = $message; $this->getSessionHandler()->set($this->_session_id, $SESSION); } @@ -477,7 +503,9 @@ class eMessage } elseif (is_array($message)) { - $message = array_unique($message); // quick fix for duplicates. + // XXX quick fix disabled because of various troubles - fix attempt made inside pref handler (the source of the problem) + // New feature added - setUnique($mstack) -> array_unique only for given message stacks + //$message = array_unique($message); // quick fix for duplicates. $message = "
".implode("
\n
", $message)."
"; } @@ -679,6 +707,14 @@ class eMessage { $this->_sysmsg[$_type][$to_stack] = array(); } + if(in_array($from_stack, $this->_unique)) + { + // check the destination stack messages, remove duplicates + foreach ($this->_sysmsg[$_type][$from_stack] as $i => $_m) + { + if(in_array($_m, $this->_sysmsg[$_type][$to_stack])) unset($this->_sysmsg[$_type][$from_stack][$i]); + } + } $this->_sysmsg[$_type][$to_stack] = array_merge($this->_sysmsg[$_type][$to_stack], $this->_sysmsg[$_type][$from_stack]); unset($this->_sysmsg[$_type][$from_stack]); } diff --git a/e107_handlers/pref_class.php b/e107_handlers/pref_class.php index a22a4efe2..6196a8e5d 100644 --- a/e107_handlers/pref_class.php +++ b/e107_handlers/pref_class.php @@ -78,6 +78,7 @@ class e_pref extends e_front_model require_once(e_HANDLER.'cache_handler.php'); $this->prefid = preg_replace('/[^\w\-]/', '', $prefid); + e107::getMessage()->setUnique($this->prefid); // attempt to fix if(empty($alias)) { $alias = $prefid; @@ -514,7 +515,7 @@ class e_pref extends e_front_model if(!$this->data_has_changed && !$force) { - e107::getMessage()->addInfo('Settings not saved as no changes were made.', 'default', $session_messages); + e107::getMessage()->addInfo('Settings not saved as no changes were made.', $this->prefid, $session_messages)->moveStack($this->prefid); return 0; } @@ -564,12 +565,13 @@ class e_pref extends e_front_model } $this->setPrefCache($this->toString(false), true); //reset pref cache - runtime & file - if(!$disallow_logs) $admin_log->logSuccess('Settings successfully saved.', true, $session_messages)->flushMessages('PREFS_01'); + if(!$disallow_logs) $admin_log->logSuccess('Settings successfully saved.', true, $session_messages)->flushMessages('PREFS_01', E_LOG_INFORMATIVE, '', $this->prefid); //BC if($this->alias === 'core') { $pref = $this->getPref(); } + e107::getMessage()->moveStack($this->prefid); return true; } elseif(e107::getDb()->getLastErrorNumber()) @@ -577,7 +579,9 @@ class e_pref extends e_front_model if(!$disallow_logs) $admin_log->logError('mySQL error #'.e107::getDb()->getLastErrorNumber().': '.e107::getDb()->getLastErrorText(), true, $session_messages) ->logError('Settings not saved.', true, $session_messages) - ->flushMessages('PREFS_03'); + ->flushMessages('PREFS_03', E_LOG_INFORMATIVE, '', $this->prefid); + + e107::getMessage()->moveStack($this->prefid); return false; } } @@ -588,13 +592,16 @@ class e_pref extends e_front_model //$this->setErrors(true, $session_messages); old - doesn't needed anymore if(!$disallow_logs) $admin_log->logError('Settings not saved.', true, $session_messages) - ->flushMessages('LAN_FIXME'); + ->flushMessages('LAN_FIXME', E_LOG_INFORMATIVE, '', $this->prefid); + + e107::getMessage()->moveStack($this->prefid); return false; } else { - e107::getMessage()->add('Settings not saved as no changes were made.', E_MESSAGE_INFO, $session_messages); - if(!$disallow_logs) $admin_log->flushMessages('LAN_FIXME'); + e107::getMessage()->addInfo('Settings not saved as no changes were made.', $this->prefid, $session_messages); + if(!$disallow_logs) $admin_log->flushMessages('LAN_FIXME', E_LOG_INFORMATIVE, '', $this->prefid); + e107::getMessage()->moveStack($this->prefid); return 0; } }