derwunnerderwunner MitgliedKommentare: 172 Danke erhalten: 32 Mitglied seit: 2. Januar

Hallo Leute,

 

eine Frage: Gibt es ein Event, dass bei allen Artikel Änderungen (CRUD) getriggert wird? Ich brauche das für ein Plugin und denke, dass ich nun nach und nach alle backend und api Actions erwischt habe.

 

 

MFG

 

derwunner

Antworten

  • ahmadsaadahmadsaad MitgliedKommentare: 137 Danke erhalten: 32 Mitglied seit: September 2016

    Hallo,

    du darfst diese Controller hock  https://github.com/shopware/shopware/blob/5.2/engine/Shopware/Controllers/Backend/Article.php

    ich glaube du kannst diese event Enlight_Controller_Action_PostDispatch_Backend_Article  benutzen und dann überprüfen welche action ist die aktulle action.

    VG,

    Ahmad

  • Daniel NögelDaniel Nögel ModeratorKommentare: 1517 Danke erhalten: 357 Mitglied seit: September 2012

    Hi,

    du kannst auch die Lifecycle-Events des ORM benutzen. Entweder direkt die entsprechenden Doctrine-Events (siehe Doctrine Doku) oder die Events, die Shopware dazu feuert, vgl engine/Shopware/Components/Model/EventSubscriber.php

    Das greift zwar "nur" für Änderungen, die über das ORM geschehen, damit triffst du aber auf jeden Fall API-Änderungen und Backend-Änderungen durch das Artikelmodul.

    Besten Gruß,

    Daniel

  • derwunnerderwunner MitgliedKommentare: 172 Danke erhalten: 32 Mitglied seit: 2. Januar

    Prinzipiell geht es mir darum, dass ich im Frontend für das Listing einen Aggregat Query ausführe, den ich bereits schon gecacht habe. Ich müsste jetzt nur noch an den richtigen Stellen den Cache invalidieren.

    Mein Code dazu sieht bisher so aus:

    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PostDispatch_Backend_Article' => 'onArticleSave',
            'Enlight_Controller_Action_PostDispatch_Api_Article' => 'onArticleSave',
            'Enlight_Controller_Action_PostDispatch_Backend_Category' => 'onArticleSave'
        ];
    }
    
    public function onArticleSave(\Enlight_Event_EventArgs $args)
    {
        /**
         * @var \Zend_Cache_Core $cache
         */
        $cache = $this->container->get('cache');
        $cache->clean(\Zend_Cache::CLEANING_MODE_OLD);
    
        list($controller, $view, $request) = self::getEverythingFromArgs($args);
    
        $actionName = strtolower($request->getActionName());
    
        $invalidatingActions = array(
            'save', // api and backend
            'delete', // api and backend
            'deletevariants',
            'deletedetail',
            'post', // api and backend
            'put', // api and backend
            'removecategoryarticles',
            'addcategoryarticles'
        );
    
        if (in_array($actionName, $invalidatingActions)) {
            $cacheIds = $cache->getIdsMatchingTags(array(self::ART_CNT_CACHE_TAG));
    
            if (is_array($cacheIds) && count($cacheIds) <= 1) {
                foreach ($cacheIds as $cacheId) {
                    if (!$cache->remove($cacheId)) {
                        throw new \RuntimeException('Cache konnte nicht geleert werden. Artikel Anzahl in der Auflisting ist wahrscheinlich falsch.');
                    }
                }
            }
        }
    }

    Vielleicht gibt es auch eine andere Möglichkeit mein Problem zu lösen. Zusammenfassend lässt sich denke ich sagen, dass ich Doctrine, sArticle, Backend, Api, und Elasticsearch abfangen muss, oder?

Anmelden oder Registrieren, um zu kommentieren.