Geeignetes Event für das Kategorie Listing?

Irgendwie komme ich aktuell nciht so recht weiter. Im Kategorie Listing sollen noch zusätzliche Informationen über das Listing der Produkte gestellt werden. Jetzt verzweifel ich schon bei der Suche nach dem richtigen Event welches hier zusändig ist.

Bei „ProductListingResultEvent“ und „ProductListingCriteriaEvent“ bezieht sich das wohl nur auf die Produkte, jedoch nicht auf die Seite allgemein. Hier wäre die erste Frage, welches Event besser wäre?

Zweite Frage, wie ich eigene Variablen (im Subscriber irgendwie definiert) dann im Frontend Twig zugreiffen kann. Wie übergebe ich neue Variablen?

Vielleicht hat ja jemand einen Ansatzpunkt :slight_smile:

Mit den PageLoader-Events bist du dann wohl besser dran.

Ja habe dann doch über ProductListingResultEvent das gebaut. FooterPageletLoadedEvent wird immer geladen, was jedoch nicht nötig ist.

Globale Events:
‚sales_channel.product.process.criteria‘
‚sales_channel.product.loaded‘

Wahrscheinlich nicht die Lösung, aber wollte es nur mal erwähnt haben :smiley:

Mir reicht nur ein Event für das Listing, Global brauch ich nix :slight_smile:

Das ProductListing ist doch ein CmsElement…
Was wenn du den bestehenden ProductListingCmsElementResolver „dekorieren“ würdest? Das könnte durch einen Decorator ungefähr so aussehen (ist nur Beispiel Code der nicht zu 100% getestet ist):

namespace DeinPlugin\Decorator;


use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
use Shopware\Core\Content\Cms\DataResolver\CriteriaCollection;
use Shopware\Core\Content\Cms\DataResolver\Element\CmsElementResolverInterface;
use Shopware\Core\Content\Cms\DataResolver\Element\ElementDataCollection;
use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
use Shopware\Core\Framework\Struct\ArrayStruct;


class ProductListingCmsElementResolver implements CmsElementResolverInterface
{

    public function __construct(private readonly CmsElementResolverInterface $originalResolver)
    {
    }

    public function getType(): string
    {
        return $this->originalResolver->getType();
    }

    public function collect(CmsSlotEntity $slot, ResolverContext $resolverContext): ?CriteriaCollection
    {
        return $this->originalResolver->collect($slot, $resolverContext);
    }

    public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
    {
        $this->originalResolver->enrich($slot, $resolverContext, $result);

        $arrayStruct = new ArrayStruct();
        $arrayStruct->set('error', ['Tschüs Welt']);
        $arrayStruct->set('success', ['Hallo Welt']);

        $slot->addExtension('messages', $arrayStruct);
    }
}

dann kannst du im Twig das Twig File
DeinPlugin/src/Resources/views/storefront/component/product/listing.html.twig
überschreiben:

{% sw_extends '@Storefront/storefront/component/product/listing.html.twig' %}


{% block product_listing %}
    {% set errorMessages = element.extensions.messages.error %}
    {% set successMessages = element.extensions.messages.success %}


    {% if errorMessages and errorMessages | length > 0 %}
        {% for message in errorMessages %}
            <div role="alert" class="alert alert-danger">
                <div class="alert-content-container">
                    <div class="alert-content"> {{ message }}</div>
                </div>
            </div>
        {% endfor %}
    {% endif %}

    {% if successMessages and successMessages | length > 0 %}
        {% for message in successMessages %}
            <div role="alert" class="alert alert-success">
                <div class="alert-content-container">
                    <div class="alert-content"> {{ message }}</div>
                </div>
            </div>
        {% endfor %}
    {% endif %}

    {{ parent() }}
{% endblock %}

drauf zugreifen.

In der services.xml müsste das dann so in etwa aussehen:

        <service
                id="DeinPlugin\Decorator\ProductListingCmsElementResolver"
                class="DeinPlugin\Decorator\ProductListingCmsElementResolver"
                decorates="Shopware\Core\Content\Product\Cms\ProductListingCmsElementResolver"
        >
            <argument type="service" id="DeinPlugin\Decorator\ProductListingCmsElementResolver.inner"/>
        </service>

Ist nur eine Idee!

Erst mal Danke für die Indee. Werde ich mal so im Hinterkopf behalten. Ich habe jetzt mein Vorhaben doch über ProductListingResultEvent gelöst. Und meine zusätzlichen Variablen übergeben ich mittels Context und Extension. Alles klappt wie gedacht :slight_smile:

Super, wenn es klappt. :+1: Gibt bekanntlich immer mehrere Wege zum Ziel :slight_smile:

1 „Gefällt mir“

Es ist durchaus möglich per if das Event abzufragen und nur dann zu reagieren, wenn der richtige PageLoader melden wurde.