您试图聆听的事件不存在。这就是你想要做的事情,以及将来选择正确事件的一些技巧。
首先,通过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