Вызовите действие после нажатия кнопки "Сохранить конфигурацию" в администраторе


Как я могу вызвать действие моего контроллера в пользовательском модуле после нажатия кнопки "Сохранить конфигурацию" в Системе - > Конфигурация -> Каталог? ( изображение)

Настройки моего модуля находятся внутри этого раздела, и мне нужно запустить свое действие сразу после сохранения конфигурации. Мне нужно вызвать действие только в этом разделе панели администратора - если "Сохранить конфигурацию" было нажато в другом разделе администратора, действие не должно быть называемый.

ИЗМЕНИТЬ:

Действие должно проверять правильность сохраненных настроек модуля и выполнять некоторые другие вычисления каждый раз при сохранении конфигурации.

ПРАВКА 2:

Я попробовал решение, опубликованное Фабианом Блехшмидтом. Наблюдатель работает после нажатия кнопки "Сохранить конфигурацию" (я вижу текст в файле журнала):

Config.xml:

<config>
...
    <global>
        <events>
            <admin_system_config_changed_section_mysection>
                <observers>
                    <mymodule>
                        <type>singleton</type>
                        <class>mymodule/observer</class>
                        <method>handle_adminSystemConfigChangedSection</method>
                    </mymodule>
                </observers>
            </admin_system_config_changed_section_mysection>
        </events>
    </global>
...
</config>

Model/Observer.php:

class My_Module_Model_Observer
{
    public function handle_adminSystemConfigChangedSection()
    {
        Mage::log('Test: oberver is working!');

        //I tried this but it doesn't actually trigger the action:
        $url = Mage::getUrl('myrouter/adminhtml_test/validate');
        Mage::app()->getResponse()->setRedirect($url);
    }
}

Но теперь я застрял.

Я не знаю, как вызвать действие метод внутри этого наблюдателя. Контроллер выглядит так, и он отлично работает:

Config.xml:

<admin>
    <routers>
        <mymodule>
            <use>admin</use>
            <args>
                <module>My_Module</module>
                <frontName>myrouter</frontName>
            </args>
        </mymodule>
    </routers>
</admin>

Controllers/Adminhtml/TestController.php:

class My_Module_Adminhtml_TestController extends Mage_Adminhtml_Controller_Action
{   
    public function validateAction()
    {
        //validate config settings here
    }
}

ПРАВКА 3:

Решение для наблюдателя событий работает нормально, поэтому я создал отдельный вопрос о перенаправлении на действия: Перенаправление на модуль/контроллер/действие

Author: Community, 2013-04-15

4 answers

В чем именно заключается ваша проблема? Ваш путь:

  1. Зарегистрируйте наблюдателя, послушайте admin_system_config_changed_section_{$section}, /app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php:177
  2. делай все, что хочешь
 10
Author: Fabian Blechschmidt, 2013-04-15 17:52:07

Вы можете установить серверную модель в один из своих параметров конфигурации. В этой модели вы можете добавить такие методы, как _beforeSave и _afterSave, а также у вас есть доступ к POST vars. Таким образом, не имеет значения, где вы добавляете свои настройки, будут запущены методы модели.
Чтобы увидеть пример, проверьте, как Magento делает это в app/code/code/Mage/Core/etc/syste.xml, путь trans_email/ident_custom1/email.
У него есть внутренняя модель <backend_model>adminhtml/system_config_backend_email_address</backend_model>
И в Mage_Adminhtml_Model_System_Config_Backend_Email_Address метод _beforeSave проверяет введенный адрес электронной почты.

 6
Author: Marius, 2013-04-15 18:14:29

Это работает для меня, если я использую полное имя класса, а не синтаксис пространства имен/наблюдателя в config.xml . Попробуй это.

Config.xml

<config>
...
    <global>
        <events>
            <admin_system_config_changed_section_mysection>
                <observers>
                    <mymodule>
                        <type>singleton</type>
                        <class>Namespace_Mymodule_Model_Observer</class>
                        <method>handle_adminSystemConfigChangedSection</method>
                    </mymodule>
                </observers>
            </admin_system_config_changed_section_mysection>
        </events>
    </global>
...
</config>

Model/Observer.php

class Namespace_Mymodule_Model_Observer
{
    public function handle_adminSystemConfigChangedSection()
    {
        die('I have called the admin config changed observer');
        // Web browse to admin config section, change something, then save it
        // Program should die with above message
        // Then replace these lines with whatever you want it to do, eg

        // If option 1 is switched to false, then switch option 2 to false
        $switch1 = Mage::getStoreConfig('mysection/mytab/myoption1', Mage::app()->getStore());
        if (!$switch1) {
            Mage::getConfig()->saveConfig('mysection/mytab/myoption2', false);
            Mage::getConfig()->reinit();
            Mage::app()->reinitStores();
        }
    }
}
 1
Author: Silas Palmer, 2015-03-02 22:37:46

Я использовал событие controller_action_postdispatch_adminhtml_catalog_product_save, после использования некоторого временного входа в систему Mage.php отправка событий. Это было единственное событие, которое действительно было запущено в admin, но не во всех сохранениях продукта (например, оно не срабатывает при использовании сохранения продукта api).

Я смог использовать var_dump в своей функции наблюдателя, чтобы извлечь нужные мне данные.

В своем наблюдателе вы можете делать подобные вещи..... Есть способы углубиться в объекты и найдите практически любые данные, которые вы ищете, как только научитесь искать.

public function syncProducts($observer) {
   $event = $observer->getEvent();

   // After var_dump($event) i learned that params were available in the controller
   $controllerAction = $event->getControllerAction();

   // Then I saw that the original request was available
   $request = $controllerAction->getRequest()

   // Then i noticed that the params were available from the save event
   $params = $request->getParams();

   // From there, it was just a simple array
   $product = $params["product"];
   $sku = $product["sku"];
 0
Author: CarComp, 2015-03-06 21:40:00