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 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?