Event beim Speichern der Einstellungen eines Plugins?

Guten Morgen liebe Shopware Community, gibt es ein Event, das beim Speichern der Einstellungen eines Plugins gefeuert wird? Ich habe mir schon die Auflistung aller Events angeschaut, allerdings finde ich dort nichts passendes für mich. Edit: Um es einfacher zu sagen, ich möchte eine Funktion ausführen, nachdem ich die Einstellungen eines Plugins gespeichert habe.

Hallo Phillipp, ich bin zwar auch neu bei der Shopware Programmierung aber wir haben anscheinend das gleiche Problem. Ich selbst suche noch nach der Möglichkeit das Speichern an dieser Stelle abzubrechen wenn die zu implementierende Prüfung nicht OK war… Versuch doch mal folgendes: $this-\>subscribeEvent('Enlight\_Controller\_Action\_PostDispatch', 'onPostDispatch'); und dann in der onPostDispatch Methode: public function onPostDispatch(Enlight\_Event\_EventArgs $args) { $action = $args-\>getSubject(); $request = $action-\>Request(); $view = $action-\>View(); $this-\>log($request); // check for SavePlugin if ($request-\>getModuleName() == 'backend' and $request-\>getControllerName() == 'config' and $request-\>getActionName() == 'saveForm' ) { $post = $request-\>getPost(); $post = (isset($post[0]) ? $post[0] : $post); // check if the label is myown label if ($post['label'] === $this-\>getLabel()) { // $post['elements'] contains the plugin config data // implement checks ... } } } vermutlich geht das gleiche auch in Enlight_Controller_Action_PreDispatch

Für alle die interessehalber hier landen: In der Datei engine/Shopware/Controllers/Backend/Config.php und der Funktion saveFormAction() gibt es zwei Events die man dafür nutzen kann. $values = Shopware()-\>Events()-\>filter('Shopware\_Controllers\_Backend\_Config\_Before\_Save\_Config\_Element', $values, array( 'subject' =\> $this, 'element' =\> $element, 'shop' =\> $shop )); Shopware()-\>Events()-\>notify('Shopware\_Controllers\_Backend\_Config\_After\_Save\_Config\_Element', array( 'subject' =\> $this, 'element' =\> $element, 'shop' =\> $shop ));

Ich greif das nochmal auf, weil ich selber gerade darüber gestolpert bin.

Es werden grundsätzlich alle Plugineinstellungen über die Config gespeichert und die Events sind in der zentralen Klasse. Diese weiß Garnicht, ob die Dtaen von Modul A oder B kommen. Wenn man sich da in seinem Plugin in das Event reinhängt und mal in die Logs schreibt, dann wird man sehen, egal in welchen Plugin man speichert, es wird auch immer die eigene Funktion aufgerufen und gelogt.

Ich bin selber auf der Suche, weil ich nach dem Speichern von „meinem“ Plugin den Cache löschen möchte, aber hab noch nicht die Funktion gefunden. Vielleicht jemand eine Idee ?

Arbeite auf Shopware 5.2.21.

 

@daMardl schrieb:

Ich greif das nochmal auf, weil ich selber gerade darüber gestolpert bin.

Es werden grundsätzlich alle Plugineinstellungen über die Config gespeichert und die Events sind in der zentralen Klasse. Diese weiß Garnicht, ob die Dtaen von Modul A oder B kommen. Wenn man sich da in seinem Plugin in das Event reinhängt und mal in die Logs schreibt, dann wird man sehen, egal in welchen Plugin man speichert, es wird auch immer die eigene Funktion aufgerufen und gelogt.

Ich bin selber auf der Suche, weil ich nach dem Speichern von „meinem“ Plugin den Cache löschen möchte, aber hab noch nicht die Funktion gefunden. Vielleicht jemand eine Idee ?

Arbeite auf Shopware 5.2.21.

 

Du hast in dem Event Hook die ElementId, anhand welcher du die PluginId oder den Pluginnamen mit folgendem SQL auslesen kannst.

SELECT cp.name 
FROM s_core_plugins cp
JOIN s_core_config_forms cf ON cf.plugin_id = cp.id
JOIN s_core_config_elements ce ON ce.form_id = cf.id
WHERE ce.id = :element_id

Ich hoffe das hilft dir weiter.  Smile

1 Like

@mowlwurf schrieb:

SELECT cp.name
FROM s_core_plugins cp
JOIN s_core_config_forms cf ON cf.plugin_id = cp.id
JOIN s_core_config_elements ce ON ce.form_id = cf.id
WHERE ce.id = :element_id

Ich hoffe das hilft dir weiter.  Smile

Hallo mowlwurf,

 

vielen dank für das Statement. Das ist genau das, was ich gesucht habe. Anbei der komplette Code, falls jemad bei Speichern von Plugineinstellungen seinen Cache gleich aufräumen möchte.

class Shopware_Plugins_Frontend_meinPluginAlsFooBar_Bootstrap extends Shopware_Components_Plugin_Bootstrap {
    private $lastSave = false;

// Event registrieren
    private function subscribeEvents() {
        $this->subscribeEvent('Shopware_Controllers_Backend_Config_After_Save_Config_Element', 'afterSaveConfig');
    }

// und die Funktion für das Event. wird für jedes FormularFeld aufgerufen
    public function afterSaveConfig(Enlight_Event_EventArgs $data) {
        if (!$this->lastSave) {
            $select = "SELECT cp.name FROM s_core_plugins cp
                    JOIN s_core_config_forms cf ON cf.plugin_id = cp.id
                    JOIN s_core_config_elements ce ON ce.form_id = cf.id
                    WHERE ce.id = :element_id";

            /** @var $element Shopware/Models/Config/Element */
            $element = $data->get('element');
            $id = $element->getId();

            $result = Shopware()->Db()->fetchRow($select, [':element_id' => $id]);
            if ($result && $result['name'] == 'meinPluginAlsFooBar') {
                $cacheManager = Shopware()->Container()->get('shopware.cache_manager');
                $cacheManager->clearConfigCache();
                $cacheManager->clearHttpCache();
                $this->lastSave = true;
            }
        }
    }
}

Wenn das keinen Sinn macht, oder es da eine einfachere Lösung gibt, bitte Bescheid geben. Mich hat es nur genervt, das ich immer den Cache löschen bzw. das Theme neu kompilieren muss, wenn ich was an den Einstellungen (z.B. Farben die ans less übergeben werden) ändere.

Gruß
daMardl