pwoerdehoffpwoerdehoff MitgliedKommentare: 59 Danke erhalten: 3 Mitglied seit: Oktober 2012 bearbeitet Juli 2015
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.

Kommentare

  • yogi70yogi70 MitgliedKommentare: 1 Danke erhalten: 0 Mitglied seit: November 2012
    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
  • mkxmkx MitgliedKommentare: 15 Danke erhalten: 1 Mitglied seit: Juli 2015
    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
    ));
    
  • daMardldaMardl MitgliedKommentare: 8 Danke erhalten: 0 Mitglied seit: November 2016

    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.

     

  • mowlwurfmowlwurf MitgliedKommentare: 8 Danke erhalten: 2 bearbeitet 24. April Mitglied seit: 14. April

    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

    Danke von 1daMardl
  • daMardldaMardl MitgliedKommentare: 8 Danke erhalten: 0 Mitglied seit: November 2016
    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

Anmelden oder Registrieren, um zu kommentieren.