Event dass bei allen Artikel Änderung getriggert wird

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

Hallo,

du darfst diese Controller hock  shopware/Article.php at 5.2 · shopware/shopware · GitHub

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

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

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?