Вызовите действие после нажатия кнопки "Сохранить конфигурацию" в администраторе
Как я могу вызвать действие моего контроллера в пользовательском модуле после нажатия кнопки "Сохранить конфигурацию" в Системе - > Конфигурация -> Каталог? ( изображение)
Настройки моего модуля находятся внутри этого раздела, и мне нужно запустить свое действие сразу после сохранения конфигурации. Мне нужно вызвать действие только в этом разделе панели администратора - если "Сохранить конфигурацию" было нажато в другом разделе администратора, действие не должно быть называемый.
ИЗМЕНИТЬ:
Действие должно проверять правильность сохраненных настроек модуля и выполнять некоторые другие вычисления каждый раз при сохранении конфигурации.
ПРАВКА 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:
Решение для наблюдателя событий работает нормально, поэтому я создал отдельный вопрос о перенаправлении на действия: Перенаправление на модуль/контроллер/действие
4 answers
В чем именно заключается ваша проблема? Ваш путь:
- Зарегистрируйте наблюдателя, послушайте
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/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();
}
}
}
Я использовал событие 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"];