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