這既是一個問題,一種答案的使用< args >。但我仍然希望找到一個更好的解決方案,並且您可能會對此有所瞭解。在Magento觀察員聲明
當在Magento中創建觀察者時,負責分派它並調用在模塊的config.xml文件中的觀察者聲明中配置的函數的方法是Mage_Core_Model_App::dispatchEvent
。
在該方法中,有這種碼位所採集觀察者信息:
foreach ($eventConfig->observers->children() as $obsName=>$obsConfig) {
$observers[$obsName] = array(
'type' => (string)$obsConfig->type,
'model' => $obsConfig->class ? (string)$obsConfig->class : $obsConfig->getClassName(),
'method'=> (string)$obsConfig->method,
'args' => (array)$obsConfig->args,
);
}
這碼位表示一個可以在這樣的一個觀察者聲明一個< ARGS>節點:
<events>
<event_to_observe>
<observers>
<observer_name>
<type>singleton</type>
<class>Namespace_Module_Model_ObserverClass</class>
<method>observerMethod</method>
<args>
<arg_name>arg_value</arg_name>
</args>
</observer_name>
</observers>
</event_to_observe>
</events>
後來在Mage_Core_Model_App::dispatchEvent
,我們可以發現一些代碼,負責調用觀察員的方法和傳遞$observer
對象作爲參數。
但是,如果我是正確的,則沒有代碼設置$observers[$obsName]['args']
值,也不會設置爲$event
對象,也不會設置爲$observer
對象。結果是:從觀察者聲明< ARGS>節點不是在觀察者的調用方法(在我前面的例子Namespace_Module_Model_ObserverClass::observerMethod
)訪問。
我的第一個賭注是,試圖得到< ARGS>使用這樣的節點:
$args = (array) Mage::getConfig()->getXpath('//events/' . $observer->getEvent()->getName() . '/observers/' . $observer->getName() . '/args');
但是,如何讓人失望,在$name
變量(這也是在Mage_Core_Model_App::dispatchEvent
用於探查)也不會傳遞到$observer
對象......所以$observer->getName()
沒有返回任何數據。
所以我結束了創建任何oberver方法,以獲取其< ARGS>節點調用一個輔助方法。 你可以找到這個幫手的要點以及如何在這裏使用它:
https://gist.github.com/3312869
這將是如此容易在Mage_Core_Model_App::dispatchEvent
是這樣的: $observer->setMethodArgs($obs['args'])
允許觀察者方法使用$observer->getMethodArgs()
..
或者我錯過了一些可以讓我們檢索< args> node的東西,但是我不確定,通過核心代碼搜索,我沒有發現任何< args>節點,這意味着Magento不會在其Core中使用此功能。
所以,現在的問題是...... 你有一個簡單而Magento的核心方法,從一個觀察者的聲明檢索< ARGS>?
我很想知道你爲什麼要將參數傳遞給一個事件構造函數 - 這是什麼用例? – benmarks 2012-08-10 10:19:19
用例是我想爲幾個事件使用相同的觀察者方法,因此代碼更輕。我沒有調用methodForEvent1,methodforEvent2,而是想調用methodForEvent($ args) – 2012-08-10 11:23:54