Aufrufaktion, nachdem im Administrator auf "Konfiguration speichern" geklickt wurde

7

Wie kann ich eine Aktion meines Controllers in einem benutzerdefinierten Modul aufrufen, nachdem unter System -> Konfiguration -> Katalog auf "Konfiguration speichern" geklickt wurde? ( Bild )

Die Einstellungen meines Moduls befinden sich in diesem Abschnitt, und ich muss meine Aktion direkt nach dem Speichern der Konfiguration auslösen. Ich muss die Aktion nur in diesem Abschnitt des Administrationsbereichs aufrufen. Wenn in einem anderen Bereich des Administrators auf "Konfiguration speichern" geklickt wurde, muss die Aktion nicht aufgerufen werden.

BEARBEITEN:

Die Aktion muss überprüfen, ob die gespeicherten Einstellungen des Moduls korrekt sind, und bei jedem Speichern der Konfiguration einige andere Berechnungen durchführen.

EDIT 2:

Ich habe eine Lösung von Fabian Blechschmidt ausprobiert. Der Beobachter arbeitet, nachdem auf "Konfiguration speichern" geklickt wurde (ich sehe Text in der Protokolldatei):

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);
    }
}

Aber jetzt stecke ich fest.

Ich weiß nicht, wie ich eine Aktionsmethode in diesem Beobachter auslösen soll. Der Controller sieht so aus und funktioniert einwandfrei:

config.xml:

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

controller / Adminhtml / TestController.php:

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

EDIT 3:

Die Event-Observer-Lösung funktioniert einwandfrei, daher habe ich eine separate Frage zur Umleitung zu Aktionen erstellt: Umleitung zu Modul / Controller / Aktion

zitix
quelle

Antworten:

10

Was genau ist dein Problem? Dein Weg:

  1. Registrieren Sie einen Beobachter, hören Sie zu admin_system_config_changed_section_{$section},/app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php:177
  2. mach was du willst
Fabian Blechschmidt
quelle
Vielen Dank. 1) Muss sich der <events>Abschnitt <global>in config.xml oder irgendwo anders befinden? 2) Ich weiß nicht, wie ich meine Handlung innerhalb des Beobachters nennen soll. Können Sie mich in die richtige Richtung weisen? @ Fabian
Zitix
Es gibt drei Optionen zum Hinzufügen von Ereignissen: global, frontend und adminhtml. Global wird jedes Mal aufgerufen, Frontend nur im Frontend, adminhtml nur im Backend. Also sollte adminhtml gut sein
Fabian Blechschmidt
Und wie leite ich in der Beobachtermethode zur Steuerung / Aktion um?
Zitix
Mage :: app () -> getRequest () -> setRedirect ('checkout / index')
Fabian Blechschmidt
6

Sie können ein Backend-Modell auf eine Ihrer Konfigurationseinstellungen festlegen. In diesem Modell können Sie Methoden wie _beforeSaveund hinzufügen _afterSaveund Sie haben auch Zugriff auf die POST-Variablen. Auf diese Weise spielt es keine Rolle, wo Sie Ihre Einstellungen hinzufügen, die Modellmethoden werden ausgelöst.
Um ein Beispiel zu sehen, überprüfen Sie, wie Magento es macht app/code/code/Mage/Core/etc/syste.xml, Pfad trans_email/ident_custom1/email.
Es hat das Backend-Modell <backend_model>adminhtml/system_config_backend_email_address</backend_model>
und überprüft in Mage_Adminhtml_Model_System_Config_Backend_Email_Addressder _beforeSaveMethode die eingegebene E-Mail-Adresse.

Marius
quelle
1

Es funktioniert für mich, wenn ich den vollständigen Klassennamen anstelle der Namespace- / Beobachter-Syntax in config.xml verwende. Versuche dies.

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();
        }
    }
}
Silas Palmer
quelle
0

Ich habe das Ereignis controller_action_postdispatch_adminhtml_catalog_product_save verwendet, nachdem ich eine temporäre Protokollierung im Mage.php-Ereignisversand verwendet hatte. Es war das einzige Ereignis, das wirklich in admin ausgelöst wurde, jedoch nicht bei allen Produktspeichern (z. B. wird es nicht ausgelöst, wenn das Speichern von API-Produkten verwendet wird).

Ich konnte var_dump in meiner Beobachterfunktion verwenden, um die gewünschten Daten auszugraben.

In Ihrem Beobachter können Sie solche Dinge tun ... Es gibt Möglichkeiten, in die Objekte zu graben und fast alle Daten zu finden, nach denen Sie suchen, sobald Sie gelernt haben, wie man aussieht.

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"];
CarComp
quelle