Page.product um entitiy in extensions (addExtenions) erweitern geht nicht

Moin moin Zusammen,

ich habe ein Plugin geschrieben, der beim Laden des Produktes auf der Detailseite die extensions um eine zusätzliche entity erweitert. Also wenn ich {{ dump(page.product.extensions) }} aufrufe, soll dieser neue Eintrag dort zu finden sein aber nach langem hin und her setze ich mal auf eure Expertise. Hier meine Subscription:

<?php

namespace TestPlugin\Subscriber;

use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\Struct\ArrayEntity;

class ProductPageSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            ProductPageLoadedEvent::class => 'onProductPageLoaded',
        ];
    }

    public function onProductPageLoaded(ProductPageLoadedEvent $event): void
    {
        $product = $event->getPage()->getProduct();

        // Hinzufügen der Erweiterung zum Produkt mit einem statischen Wert
        $product->addExtension('isInCart', new ArrayEntity(['value' => 1]));
    }
}

Im Grunde geht es darum um zu schauen, ob der aufgerufene Artikel bereits im Warenkorb ist. Aber ich bekomme nicht mal die Variable isInCart in den extensions gesetzt. Woran könnte das liegen.

Vielen Dank im Voraus für eure Unterstützung

Captain Picard

Saludos Capitan,
geht es darum wirklich zu testen ob das Produkt im Warenkorb liegt, dann wäre das Vorgehen zumindest mal schräg. Hierzu gibt es ja defakto einen Weg.

Ansonsten fehlt nur ein return am Ende.

return $product;

Salut chamaw,

vielen Dank für deine Beteiligung. In erster Linie wollte ich ja eigentlich probieren, eine eigene Variable in die extensions zu schreiben, da komme ich bei einem anderen Projekt schon nicht weiter. Wie sähe denn der defacto Weg aus, um zu schauen, ob das Produkt bereits im Warenkorb aus?

Beste Grüße

Captain Picard

  • Shopware\Core\Checkout\Cart\SalesChannel\CartService injekten
  • getCart aufrufen mit einem SalesChannelContext
  • getLineItems
  • hier auf der Collection das Product mit der Product-ID abrufen
  • falls was != null kommt ist das Product im cart

(alles geschrieben ohne zu probieren)

funktioniert denn die Übergabe mit dem „return“ wie oben geschrieben ?

Moin moin chamaw,

vielen Dank aber die return Anweisung hat auch nicht geholfen. Versuche mal deinen Vorschlag umzusetzen. Unabhängig davon, warum wird trotzdem nichts in die product.extensions geschrieben? Habe da einiges ausprobiert aber ohne Erfolg.

Cheers

Ctp. Picard

hab gerade nochmal den Code geschaut, hab ich genauso drin. im Template müsste dann sowas stehen:

        {% set extension = page.product.extensions %}
        {% set isInCart = extension.isInCart %}

Mach mal ein dump(product)
Dann sollte dir das Problem auffallen.

Viele Grüße

Moin Zusammen,

komme jetzt erst zum Antworten.
Ich habe im Template den dump(page.product) dauerhaft drin. isInCart ist unter page.product.extensions nicht zu finden. Welches Problem sollte mir denn auffallen? Vielleicht bin ich schon Dump-Blind.
In dem anderen Fall versuche ich ähnliches. Da geht es darum die hinterlegten Tags für Bilder in die extensions des Media-Objekts zu laden aber auch ohne Erfolg. Ich werde noch wahnsinnig.

Cheers

Capt. Picard

Gehen wir nochmal kurz zurück. Deine ProductPageSubscriber Class wird geladen und auch das Event wird aufgerufen ? Wo arbeitest Du, lokal (mit dev) oder im Produktions-System ?

Moin chamaw,

ich arbeite lokal mit dev. Soweit ich weiß, wird die ProductPageSubscriber geladen. Ich kann gerne eine Debug-Ausgabe generieren. Das kann ich allerdings erst am Montag, weil ich das WE im Urlaub bin.

Cheers und ein schönes WE

Capt. Picard

Moin chamaw,

habe mal ein ein minimales Setup geschrieben aber ohne Erfolg. Es scheint so, dass tatsächlich der Subscriber nicht geladen wird. Die beiden Debug-Ausgaben sind nicht zu sehen.

<?php

namespace TestPlugin\Subscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;

class ProductPageSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            ProductPageLoadedEvent::class => 'onProductPageLoaded',
        ];
    }

    public function onProductPageLoaded(ProductPageLoadedEvent $event): void
    {
        // Ausgabe von Debug-Informationen in die Browser-Konsole
        echo "<script>console.log('ProductPageLoadedEvent triggered');</script>";
        
        // Ausgabe von Debug-Informationen direkt im HTML
        echo "<pre>ProductPageLoadedEvent triggered</pre>";
    }
}

Hier auch noch mal die services.xml:

<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.symfony.com/schema/dic/services
               http://www.symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="TestPlugin\Subscriber\ProductPageSubscriber"
                 class="TestPlugin\Subscriber\ProductPageSubscriber">
            <tag name="kernel.event_subscriber"/>
        </service>
    </services>
</container>

Habe das Plugin deinstalliert, plugin:refresh durchgeführt wieder installiert etc… Alles ohne Probleme aber auch ohne Funktion :see_no_evil:. Was übersehe ich hier?

Beste Grüße

Capt. Picard

wo genau liegt die services.xml schick mal kurz den kompletten pfad

und auf den ersten Blick sehe ich auch nichts. Vielleicht mal mit error_log in eine Datei schreiben. Die „echo’s“ werden evtl. mit dem output-buffer rausgefiltert.

Beim Service reicht das id-attribute. Die class=‚‘ braucht es nicht; aber vielleicht stört das ja ?

LG

Hey chawam,

die services.xml liegt im Plugin-Ordner unter Resources/config drin. Dein class-Eintrag hatte ich vorhin auch rausgenommen gehabt aber ohne Erfolg. In früheren SW6-Plugins hatte ich die debug-Ausgaben ähnlich z.B. mit print_r etc. ausgegeben. Das hatte auch funktioniert. Versuche die Debug-Ausgabe in die dev.log zu schreiben aber steht auch nichts drin. Das ist echt ein Fu…Up. Muss meine Birne mal neu sortieren.

Vielen Dank für deinen Support. Ich versuche es heute Abend einfach weiter.

Beste Grüße

Capt. Picard

Immer auch auf die richtige Schreibweise achten, also „Resources“ mit einem s vorne und einem hinten.
Ich hatte mal die Situation (war ähnlich) und dann war am Ende das Plugin einfach nicht aktiv :slight_smile: Vielleicht hilft das ja ?

LG

Jedoch hier nochmal der Hinweis, dass das hier im Moment der falsche Ansatz ist. Die Produkt-Pages liegen im Cache und alles was Hardcoded im Twig-Template steht, landet auch im Cache.

Moin Moorleiche,

vielen Dank für deine Beteiligung. Ich kann deine Antwort derzeit noch nicht ganz entschlüsseln. Ich möchte ja nur schauen ob meine Subscriber-Klasse überhaupt geladen wird. Wie würde denn ein anderer Ansatz aussehen?

Beste Grüße

Capt. Picard

Am besten wäre es als Widget und einem Controller, welches asynchron via JavaScript nachgeladen wird.

Moin Moorleiche,

Ich nehme Du beziehst dich auf den ursprünglichen Post, um zu schauen, ob das Produkt bereits im Warenkorb ist. Ich kann das gerne als Widget ausprobieren. Daran hatte ich nicht gedacht. Aber was mich immer noch wurmt, warum wird meine Subscriber-Klasse nicht geladen? Bin auch dank tatkräftiger Hilfe von chamaw hier nicht leider nicht voran gekommen.

Beste Grüße

Capt. Picard

Moin chamaw.

jetzt funzt es. Es war nicht die Schreibweise sondern die Verzeichnisstruktur. Hatte es 100 mal geprüft und lag 100 mal daneben. WTH. Jetzt klappt es auch mit den Debug-Ausgaben usw…

Merci noch mal.

Capt. Picard