Magento backend_model - 我是否需要为每个配置字段指定?

时间:2011-04-28 17:12:47

标签: magento

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

但是,如果我有几个字段,我想要这样做。我不希望行为是保存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>

感谢。

2 个答案:

答案 0 :(得分: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

你仍然需要使用一些智力猜测来确定你想要的事件,但是它们的直观命名足以让你通常可以找到你想要的东西。

答案 1 :(得分:-2)

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

网上有一个内置事件列表的pdf - google for it&amp;你会找到的。