use Shopware\Core\Content\Product\ProductEvents;
use Shopware\Core\Content\Product\SalesChannelProductEntity;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
Ich glaube, das sollte ausreichen. Bei mir funktioniert das oben genannte Script tadellos.
Hi Alex, wäre es dir möglich uns ein funktionierendes Plugin hier zur Verfügung zu stellen bzw. nur die Party die essentiell sind? z.B. den kompletten Subscriber? Ich steh ein bisschen auf dem Schlauch und bräuchte Starthilfe
Auf Shopware 6.4 scheint das so nichtmehr zu funktionieren. Das Object $productEntity ist zwar gefüllt, die Methode getProperties() scheint aber nicht mehr zu existieren. Gibt es hier irgendwelche Updates?
Ich frage vorsichtig noch einmal nach, ob es hier nicht irgendeine Lösung mittlerweile gibt. Stecke noch an der gleichen Stelle fest wie vor einen Monat…
Habe leider aktuell noch SW 6.3., kann euch leider nicht helfen. Ich befürchte leider, dass viele meiner eigenen Plugins unter SW 6.4. auch nicht mehr laufen werden^^
Also bei mir funktioniert unter 6.4.5.0 das Beispiel per Copy & Past ohne Fehler.
Dein Fehler ist klar… null. Du hast keine Eigenschaften angelegt, deswegen bekommt es keine Eigenschaft geliefert sondern null. Mit null weiter zu arbeiten ist nicht möglich.
Und dann (für neuere Shopware-Versionen?) noch etwas ergänzen müsst.
Hier eine vollständige Subscriber-Klasse, wie sie für mich unter 6.4.14.0 funktioniert:
<?php
declare(strict_types=1);
namespace LimeSodaDeinPluginName\Subscriber;
use Shopware\Core\Content\Product\ProductEvents;
use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;
use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
use Shopware\Core\Framework\Api\Context\SalesChannelApiSource;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProductListingSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
ProductEvents::PRODUCT_LOADED_EVENT => 'onProductsLoaded',
ProductListingCriteriaEvent::class => 'handleRequest',
];
}
public function handleRequest(ProductListingCriteriaEvent $event)
{
$event->getCriteria()->addAssociation('properties');
$event->getCriteria()->addAssociation('properties.group');
}
public function onProductsLoaded(EntityLoadedEvent $event)
{
if (!($event->getContext()->getSource() instanceof SalesChannelApiSource)) {
return;
}
foreach ($event->getEntities() as $productEntity) {
/** @var SalesChannelProductEntity $productEntity */
$properties = $productEntity->getProperties();
if ($properties) {
$grouped = $properties->groupByPropertyGroups();
$grouped->sortByPositions();
$grouped->sortByConfig();
$productEntity->setSortedProperties($grouped);
}
}
}
}
Ein paar Erläuterungen aus dem Thread hier zusammengefasst:
Wir müssen uns an zwei Events dranhängen: zuerst müssen wir dafür sorgen, dass die Properties in das Produkt geladen werden (passiert in der Methode handleRequest()), und dann müssen wir die Properties sortieren und im Produkt ablegen (onProductsLoaded()).
In handleRequest() müssen wir, zumindest in aktuelleren SW6-Versionen(?), nicht nur die Properties dazu laden, sondern auch die Property-Gruppen.
In onProductsLoaded() sichern wir ab, falls im Produkt keine Properties vorhanden sind. Außerdem können wir nun die Properties gruppieren, weil wir die properties.group auch hinzugefügt haben.
Und mit dem Code kann man nun im Twig-Template die Eigenschaften ausgeben:
{# @var product \Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity #}
{% for group in product.sortedProperties %}
<p>{{ group.translated.name|e }}:</p>
{% apply spaceless %}
{% for option in group.options %}
{% set i = ( i | default(0) ) + 1 %}
<p>{% if i > 1 %}, {% endif %}{{ option.translated.name|e }}</p>
{% endfor %}
{% endapply %}
{% endfor %}
Ich hoffe, das hilft euch etwas weiter. Und vielen Dank an alle, die die Vorarbeit geleistet haben