temporäre Veränderung der Artikeldaten

Hallo,

ich versuche mich gerade daran Artikeldaten “während der Fahrt” zu verändern. Konkret muss ich das Feld sReleasedate modifizieren.

Überraschenderweise ist mir das relativ gut für Artikellistings gelungen indem ich deb shopware_storefront.list_product_service dekoriert habe.

Allerdings gilt das nicht für die Artikeldetailseite. Hier (so meine Annahme) subscribe ich wie folgt:

public static function getSubscribedEvents()
{
    return [
        'Enlight_Controller_Action_PostDispatch_Frontend_Detail' => 'onPostDispatchFrontendDetail'
    ];
}

public function onPostDispatchFrontendDetail(\Enlight_Controller_ActionEventArgs $args)
{
    /** @var \Enlight_Controller_Action $subject */
    $subject = $args->getSubject();
    $view = $subject->View();
    $productId = $subject->Request()->get('sArticle');

}

Aber mir fehlt jetzt der letzte Schritt wie ich an die Artikeldaten komme die nachher in $sArticle liegen…

Möglicherweise sollte ich aber einen anderen ganzheitlicheren Ansatz wählen, um sicherzustellen dass ich in allen Belangen auch wirklich die Artikeldaten “erwischt” habe?

Danke schon mal für jegliche Ideen!

Je nach dem was du vor hast, kommst du in der PostDispatch über die View sofort an die Artikeldaten

$view->getAssign('sArticle');

ansonsten per Model

// oder die detail, je nach dem was du brauchst
$repo = $this->container->get('models')->getRepository(\Shopware\Models\Article\Article::class);
$article = $repo->find($id);

desweiteren gibt es einige Shopware Services die für dich Produktdaten laden (ProductListingService, etc…).

Ein ganz klassischer Weg ist über die alten Shopware Module

Shopware()->Modules()->Articles()->sGetArticleById(...)

Um nun Daten auf der Detailseite zu ändern würde ich wie folgt vorgehen

$article = $view->getAssign('sArticle');
$article[...] = 'neuer wert';
$view->setAssign('sArticle', $article);

Diese Änderung beeinflussen aber nur die Detailseite, weder werden Sie im Basket, Order oder sonstwo berücksichtigt. Wenn du die Daten überall (oder an möglich vielen Stellen) auf die gleiche weise Ändern willst, dann solltest du wirklich über den Service und/oder über nen Hook/Filter Event das realisieren. Erste Auflaufstelle ListProductService für ListProducts dekorieren und ProductService für das normale Produkt dekorieren, wobei je nach dem um welche Daten es sich handelt, der ListProductService reicht, da der ProductService intern diesen nutzt

1 Like

Danke vielmals!

Du hast vollkommen recht, der parallel erstellte ListProductServiceDecorator dekoriert auch auf der Detailseite. Warum ich das am Anfang nicht verstanden habe, ist weil ich mal wieder verpennt habe, dass es bei Variantenartikeln natürlich den Hauptartikel und die Varianten gibt und ich habe den Wert der dann (wenn vorhanden) verändert wird nur auf der Hauptvariante gesetzt, die wird dann auch dekoriert im Listing. Im Detail aber wird die verfügbare Variante ausgewählt und da gab es mangels gesetztem Wert nix zu verändern. 

Again what learned …  Sticking-out-tongue