diff --git a/libraries/cms/editor/editor.php b/libraries/cms/editor/editor.php index 07da515c5f6a4..60c5ed4c915d2 100644 --- a/libraries/cms/editor/editor.php +++ b/libraries/cms/editor/editor.php @@ -127,7 +127,7 @@ public function getState() /** * Attach an observer object * - * @param object $observer An observer object to attach + * @param object|array $observer An observer object or an array to attach * * @return void * @@ -135,46 +135,36 @@ public function getState() */ public function attach($observer) { - if (is_array($observer)) - { - if (!isset($observer['handler']) || !isset($observer['event']) || !is_callable($observer['handler'])) - { - return; - } - - // Make sure we haven't already attached this array as an observer - foreach ($this->_observers as $check) - { - if (is_array($check) && $check['event'] == $observer['event'] && $check['handler'] == $observer['handler']) - { - return; - } - } + $notValidArray = (!is_array($observer) || (!isset($observer['handler']) || !isset($observer['event']) || !is_callable($observer['handler']))); + $notValidObject = (!($observer instanceof JEditor)); - $this->_observers[] = $observer; - end($this->_observers); - $methods = array($observer['event']); + if ($notValidArray && $notValidObject) + { + return; } - else + + // Make sure we haven't already attached this observer + foreach ($this->_observers as $check) { - if (!($observer instanceof JEditor)) + $duplicateArray = (is_array($check) && $check['event'] == $observer['event'] && $check['handler'] == $observer['handler']); + if ($duplicateArray) { - return; + return null; } - // Make sure we haven't already attached this object as an observer $class = get_class($observer); - - foreach ($this->_observers as $check) + if ($check instanceof $class) { - if ($check instanceof $class) - { - return; - } + return null; } + } + + $this->_observers[] = $observer; - $this->_observers[] = $observer; - $methods = array_diff(get_class_methods($observer), get_class_methods('JPlugin')); + $methods = $this->getObserverEvents($observer); + if (is_null($methods)) + { + return; } $key = key($this->_observers); @@ -192,6 +182,23 @@ public function attach($observer) } } + /** + * Private method to get the methods/ events of an observer + * + * @param object|array $observer An observer object or array to attach + * + * @return array + */ + private function getObserverEvents($observer) + { + if (is_array($observer)) + { + end($this->_observers); + return array($observer['event']); + } + + return array_diff(get_class_methods($observer), get_class_methods('JPlugin')); + } /** * Detach an observer object *