2011-04-28 48 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 - 谷歌它&你會找到它。

相關問題