Действие вызова после того, как «Сохранить конфигурацию» нажали в администрацию

magento.stackexchange https://magento.stackexchange.com/questions/3013

Вопрос

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

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

РЕДАКТИРОВАТЬ:

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

РЕДАКТИРОВАТЬ 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/stemver.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:

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

Это было полезно?

Решение

В чем именно ваша проблема? Твой путь:

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

Другие советы

Вы можете установить модель бэкэнд в одну из настроек конфигурации. В этой модели вы можете добавить такие методы, как _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 Метод подтверждает введенный адрес электронной почты.

Это работает для меня, если я использую полное имя класса, а не синтаксис пространства имен/наблюдателя в 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/stemver.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();
        }
    }
}

Я использовал событие CONTROLLER_ACTION_POSTDISPATCH_ADMINHTML_CATALOG_PRODUCT_SAVE, после использования некоторого временного ведения журнала в диспетчере события MAGE.PHP. Это было единственное событие, которое действительно было выпущено в администраторе, но не во всех сохранениях продуктов (например, оно не стреляет, когда используется сохранение продукта 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"];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top