Created
August 10, 2012 09:24
-
-
Save herveguetin/3312869 to your computer and use it in GitHub Desktop.
Pass arguments to observer method using <args> node in Magento's observer design pattern
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Namespace_Module_Helper_Data extends Mage_Core_Helper_Abstract { | |
/** | |
* Retrieve args node of observer config | |
* | |
* @param Varien_Event_Observer $observer | |
* @return array $observerArgs | |
*/ | |
public function getObserverArgs(Varien_Event_Observer $observer, $callingClass, $callingMethod) { | |
/** | |
* Define vars | |
*/ | |
$usedObservers = array(); | |
$observerArgs = array(); | |
$eventObservers = array(); | |
/** | |
* Load Magento config | |
*/ | |
$config = Mage::getConfig(); | |
/** | |
* Retrieve all observers attached to the current observer's event | |
*/ | |
$eventObservers = (array) $config->getXpath('//events/' . $observer->getEvent()->getName() . '/observers/*'); | |
/** | |
* Retrieve all XML nodes of the current observer (including <args>!) | |
* and populate $usedObservers with observers that: | |
* - call the same class and method than the $observer passed as arguments for this function | |
* - have an <args> node declared in config | |
*/ | |
foreach($eventObservers as $eventObserver) { | |
$className = $config->getModelClassName($eventObserver->class); | |
$method = $eventObserver->method; | |
$args = (bool) $eventObserver->args; | |
if($className == $callingClass && $method == $callingMethod && $args) { | |
$usedObservers[] = $eventObserver; | |
} | |
} | |
/** | |
* Create array of args | |
*/ | |
foreach($usedObservers as $usedObserver) { | |
$args = (array) $usedObserver->args; | |
foreach($args as $name => $value) { | |
$observerArgs[$name] = $value; | |
} | |
} | |
$args = new Varien_Object; | |
$args->setData($observerArgs); | |
return $args; | |
} | |
} |
Quick correction on the above comment:
$args = Mage::helper('ecmessenger')->getObserverArgs($observer, get_class($this), FUNCTION);
is
$args = Mage::helper('module')->getObserverArgs($observer, get_class($this), FUNCTION);
Grrr... Sorry...
$args = Mage::helper('module')->getObserverArgs($observer, get_class($this), __FUNCTION__);
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The observer is declared as shown below:
The helper method in the Gist is called as shown below from the observer method: