Действие вызова после того, как «Сохранить конфигурацию» нажали в администрацию
-
16-10-2019 - |
Вопрос
Как я могу вызвать действие моего контроллера в пользовательском модуле после того, как «Сохранить конфигурация» была нажата на систему -> Конфигурация -> Каталог? (изображение)
Настройки моего модуля находятся в этом разделе, и мне нужно запустить свое действие сразу после сохранения конфигурации. Мне нужно вызвать действие только в этом разделе панели администратора - если «Сохранить конфигурацию» нажимали в другом разделе администратора, действие не нужно вызывать.
РЕДАКТИРОВАТЬ:
Действие должно проверить, правильны ли сохраненные настройки модуля, и выполнять некоторые другие вычисления каждый раз, когда конфигурация сохраняется.
РЕДАКТИРОВАТЬ 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:
Решение о событиях-бортовых работах работает нормально, поэтому я создал отдельный вопрос о перенаправлении на действия:Перенаправить на модуль/контроллер/действие
Решение
В чем именно ваша проблема? Твой путь:
- Зарегистрировать наблюдателя, послушать
admin_system_config_changed_section_{$section}
,/app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php:177
- делай что хочешь
Другие советы
Вы можете установить модель бэкэнд в одну из настроек конфигурации. В этой модели вы можете добавить такие методы, как _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"];