2011-04-28 50 views
2

如果我想在我的自定义模块的特定配置字段被保存时(除了保存到Magento核心配置表以外)做一些额外的事情,我可以在我的system.xml中为该字段指定一个backend_model,并且后端模型类扩展Mage_Core_Model_Config_Data,覆盖_afterSave,并把我的额外的东西在该方法。Magento backend_model - 我需要为每个配置字段指定吗?

但是,如果我有几个领域,我想这样做。我不希望行为是保存field1并为该字段调用afterSave,保存field2并为该字段调用afterSave等。我宁愿所有字段都保存到Magento核心配置表中,并且然后我做我的额外的东西。

这可能吗?我认为我可以用事件/观察者来实现这一点。所以在我的config.xml中,<adminhtml>部分,我添加了一个观察者如下:

<events> 
    <admin_system_config_changed_mysection> 
     <observers> 
      <mypfx_admin_system_config_changed_mysection> 
       <class>mymodule/adminhtml_system_config_backend_configSaveObserver</class> 
       <method>myConfigSaved</method 
      </mypfx_admin_system_config_changed_mysection> 
     </observers> 
    </admin_system_config_changed_mysection>  
</events> 

但当配置保存不叫我的观察方法。也许我有错误的事件名称?事件名称末尾的“mysection”位我猜测必须与system.xml中的部分匹配:

<sections>  
    <mysection translate="label" module="mymodule"> 
     ... 
     <groups> 
      ... 
     </groups> 
    </mysection> 
</sections> 

谢谢。

回答

5

您试图聆听的事件不存在。这就是你想要做的事情,以及将来选择正确事件的一些技巧。

首先,通过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 

您仍然需要使用一些智能猜测到列表结束找出你想要的事件,但他们直观地命名,你通常可以找到你要找的东西。

+0

谢谢。我有一个文件,这是我的grep for dispatchEvent的结果,但我错误键入了事件名称,错过了“部分”。感谢您的发现,并为作为一个白痴感到抱歉!也就是说,我做了改变,仍然没有调用我的观察者方法 - 所以我会给你的dispatchEvent调试建议去确保事件被我期望的名字解雇。令人惊讶的是这些事件没有记录(dbcn提到的doc非常差)。很难找到所有可以通过使用grep触发的事件,因为事件名称通常不是字符串文字。 – user649650 2011-04-29 08:49:58

+0

添加“部分”到事件名称工作正常。我愚蠢地改变了config.xml中的xml占位符,而不是事件名称。我想我现在应该回家了! – user649650 2011-04-29 08:57:30

-2

您需要将您的观察者方法绑定到特定的Magento事件(您可以添加自己的事件,但需要找到何时想要它被触发并添加您自己的dispatchEvent调用)。如果Magento内置了事件,请在配置中使用该事件名称。

有一个内置的事件列表在网络上的PDF - 谷歌它&你会找到它。

相关问题