Magento backend_model - мне нужно указать для каждого поля конфигурации? - PullRequest
2 голосов
/ 28 апреля 2011

Если я хочу сделать что-то дополнительное, когда определенное поле конфигурации для моего пользовательского модуля сохранено (сверх сохранения в конфигурационную таблицу ядра Magento), я могу просто указать backend_model для этого поля в моем system.xml, ипусть этот внутренний класс модели расширит Mage_Core_Model_Config_Data, переопределит _afterSave и добавит в этот метод свои дополнительные материалы.

Но что, если у меня есть несколько полей, для которых я хочу это сделать.Я не хочу, чтобы поведение состояло в том, чтобы сохранять field1 и вызывать мой afterSave для этого поля, сохранять field2 и вызывать мой afterSave для этого поля и т. Д. Я бы предпочел, чтобы все поля были сохранены в таблице конфигурации ядра Magento, итогда я делаю свои дополнительные вещи.

Возможно ли это?Я думал, что смогу достичь этого, используя событие / наблюдателя.Поэтому в моем разделе 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>

, но мой метод наблюдателя не вызывается при сохранении конфигурации.Может у меня неправильное название события?Бит «mysection» в конце имени события, которое, как я догадывался, должен совпадать с разделом из system.xml:

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

Спасибо.

Ответы [ 2 ]

5 голосов
/ 28 апреля 2011

Событие, которое вы пытаетесь прослушать, не существует.Вот что вы хотите сделать, и несколько советов для выбора правильного события в будущем.

Во-первых, каждое событие запускается в 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

Так что, похоже, вы пропустили <em>section</em> перед своим собственным именем раздела.

Во-вторых, при работе над блоком разработки, лучший способ найти искомое событие - это записать что-то в источнике.Временно добавьте код отладки в функцию 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 голосов
/ 28 апреля 2011

Вам необходимо привязать ваш метод наблюдателя к определенному событию Magento (вы можете добавить свой собственный, но нужно найти, когда вы хотите, чтобы он был запущен, и добавить свой собственный вызов dispatchEvent). Если в Magento встроено событие, используйте это имя в конфигурации.

В Интернете есть PDF-файл встроенных списков событий - поищите его в Google, и вы найдете его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...