Magento后端\u模型-是否需要为每个配置字段指定?

Magento后端\u模型-是否需要为每个配置字段指定?,magento,Magento,如果我想在保存自定义模块的特定配置字段时做些额外的事情(除了保存到Magento core config表之外),我可以在my system.xml中为该字段指定一个后端模型,并让该后端模型类扩展Mage_core_model_config_数据,覆盖_afterSave,把我多余的东西放在那个方法里 但是,如果我有几个字段要执行此操作,该怎么办。我不希望行为是保存字段1并为该字段调用我的afterSave,保存字段2并为该字段调用我的afterSave,等等。我希望所有字段都保存到Magent

如果我想在保存自定义模块的特定配置字段时做些额外的事情(除了保存到Magento core config表之外),我可以在my system.xml中为该字段指定一个后端模型,并让该后端模型类扩展Mage_core_model_config_数据,覆盖_afterSave,把我多余的东西放在那个方法里

但是,如果我有几个字段要执行此操作,该怎么办。我不希望行为是保存字段1并为该字段调用我的afterSave,保存字段2并为该字段调用我的afterSave,等等。我希望所有字段都保存到Magento core配置表中,然后我做额外的工作

可能吗?我想我可以使用事件/观察者来实现这一点。因此,在我的config.xml一节中,我添加了一个观察者,如下所示:

<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>

mymodule/adminhtml\系统\配置\后端\配置SaveObserver

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


网络上有一个内置事件列表的pdf文件-谷歌搜索&你会找到它。

你试图收听的事件不存在。以下是您想要做的事情,以及在未来选择正确活动的一些提示

首先,Magento中的每个事件都是通过
Mage::dispatchEvent
方法触发的。搜索这些调用的核心代码,您将始终知道要侦听的事件的名称

$ 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
因此,看起来您在自己的节名之前缺少了

其次,在开发框中工作时,找到您要查找的事件的最佳方法是在源代码处记录事件。将一些调试代码临时添加到
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;
}
这会将大量事件名称列表转储到日志中。我通常使用OSX的
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的结果,但我只是输入了错误的事件名称,遗漏了“section”。谢谢你发现了这一点,很抱歉你是个白痴!也就是说,我做了更改,但仍然没有调用我的observer方法,因此我将给出您的dispatchEvent调试建议,以确保使用我期望的名称触发事件。令人惊讶的是,这些事件没有被记录下来(dbcn提到的文档非常糟糕)。使用grep很难找到所有可以触发的事件,因为事件名称通常不是字符串文字。在事件名称中添加“section”效果很好。我愚蠢地更改了config.xml中的xml占位符,而不是事件名称。我想我现在应该回家了!
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