Ausgabe von einzelnen Eigenschaften in der Kategorieübersicht

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.

Hallo, wo habt Ihr denn den ganzen Code eingefügt das der bei euch läuft? Habt Ihr dafür extra ein Plugin erstellt?

Jap musst ein eigenes Plugin erstellen und hochladen.

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

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?

Hey,

vermutlich ist das schon hinfällig oder?

Hey, stecke gerade an der gleichen Stelle fest und bekomme die Fehlermeldung

Call to a member function groupByPropertyGroups() on null

Bin mit Shopware 6.4.1.1 unterwegs…

Hat da einer eine Lösungshilfe?

Leider noch keine Lösung gefunden.

Hat jemand mittlerweile einen Ansatz gefunden?

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… :frowning:

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.

Ich glaube, bei denen von euch, bei denen es nicht klappt, liegt es daran, dass ihr den Code aus einigen Antworten hier zusammen fügen müsst:

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

2 Likes