如果我想保存我的自定义模块的特定配置字段(除了保存到Magento核心配置表之外),我还想做一些额外的事情,我可以在我的system.xml中为该字段指定一个backend_model,并拥有该后端model类扩展Mage_Core_Model_Config_Data,覆盖_afterSave,并将我的额外东西放在该方法中.
但是,如果我有几个字段,我想要这样做.我不希望行为是保存field1并为该字段调用我的afterSave,保存field2并为该字段调用我的afterSave等.我宁愿所有字段都保存到Magento核心配置表中,并且然后我做了额外的事情.
那可能吗?我以为我可以使用event/observer来实现它.所以在我的config.xml,
mymodule/adminhtml_system_config_backend_configSaveObserver myConfigSaved
但保存配置时不调用我的观察者方法.也许我有错误的活动名称?我猜测的事件名称末尾的"mysection"位必须与system.xml中的部分匹配:
... ...
谢谢.
您尝试收听的事件不存在.这是您想要做的事情,以及将来选择正确事件的一些提示.
首先,通过该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
您仍然需要使用一些智能猜测来确定您想要的事件,但是它们的直观命名足以让您通常可以找到您要查找的内容.