您試圖聆聽的事件不存在。這就是你想要做的事情,以及將來選擇正確事件的一些技巧。
首先,通過Mage::dispatchEvent
方法在Magento中觸發每個事件。搜索這些電話的核心代碼,你就會知道你想要聽的事件的名稱。
$ ack 'admin_system_config_changed_'
Adminhtml/controllers/System/ConfigController.php
136: Mage::dispatchEvent("admin_system_config_changed_section_{$section}",
從上面,你可以看到事件的名稱與您認爲這是
admin_system_config_changed_section_{$section}
admin_system_config_changed_mysection
因此,它看起來像你自己的節名之前缺少section
什麼。其次,在開發框中工作時,要找到要查找的事件的方法是在源處記錄事件。暫時添加一些調試代碼到dispatchEvent
函數。
#File: app/Mage.php
public static function dispatchEvent($name, array $data = array())
{
//either one of the lines below should do it. One uses Magento's
//built in logging, the other uses something more crude
#Mage::Log($name);
#file_put_contents('/tmp/test.log',"$name\n",FILE_APPEND);
Varien_Profiler::start('DISPATCH EVENT:'.$name);
$result = self::app()->dispatchEvent($name, $data);
#$result = self::registry('events')->dispatch($name, $data);
Varien_Profiler::stop('DISPATCH EVENT:'.$name);
return $result;
}
這會將大量事件名稱轉儲到日誌中。我通常使用OS X的Console.app
查看請求期間的日誌文件,複製這些行,排序和刪除重複,然後用這樣的
admin_system_config_changed_section_commercebug
admin_user_load_after
admin_user_load_before
adminhtml_block_html_before
adminhtml_controller_action_predispatch_start
application_clean_cache
controller_action_layout_generate_blocks_after
controller_action_layout_generate_blocks_before
controller_action_layout_generate_xml_before
controller_action_layout_load_before
controller_action_layout_render_before
controller_action_layout_render_before_adminhtml_system_config_edit
controller_action_postdispatch
controller_action_postdispatch_adminhtml
controller_action_postdispatch_adminhtml_system_config_edit
controller_action_postdispatch_adminhtml_system_config_save
controller_action_predispatch
controller_action_predispatch_adminhtml
controller_action_predispatch_adminhtml_system_config_edit
controller_action_predispatch_adminhtml_system_config_save
controller_front_init_before
controller_front_init_routers
controller_front_send_response_after
controller_front_send_response_before
core_abstract_load_after
core_abstract_load_before
core_block_abstract_prepare_layout_after
core_block_abstract_prepare_layout_before
core_block_abstract_to_html_after
core_block_abstract_to_html_before
core_collection_abstract_load_after
core_collection_abstract_load_before
core_config_data_load_after
core_config_data_save_after
core_config_data_save_before
core_config_data_save_commit_after
core_layout_block_create_after
core_locale_set_locale
core_session_abstract_add_message
core_session_abstract_clear_messages
http_response_send_before
model_load_after
model_load_before
model_save_after
model_save_before
model_save_commit_after
resource_get_tablename
store_load_after
store_load_before
您仍然需要使用一些智能猜測到列表結束找出你想要的事件,但他們直觀地命名,你通常可以找到你要找的東西。
謝謝。我有一個文件,這是我的grep for dispatchEvent的結果,但我錯誤鍵入了事件名稱,錯過了「部分」。感謝您的發現,併爲作爲一個白癡感到抱歉!也就是說,我做了改變,仍然沒有調用我的觀察者方法 - 所以我會給你的dispatchEvent調試建議去確保事件被我期望的名字解僱。令人驚訝的是這些事件沒有記錄(dbcn提到的doc非常差)。很難找到所有可以通過使用grep觸發的事件,因爲事件名稱通常不是字符串文字。 – user649650 2011-04-29 08:49:58
添加「部分」到事件名稱工作正常。我愚蠢地改變了config.xml中的xml佔位符,而不是事件名稱。我想我現在應該回家了! – user649650 2011-04-29 08:57:30