Produkt Parent im Listing

Leider ist es nicht möglich den Product Parent im Listing einfach per addAssociation zu laden:

public function handleProductListingCriteriaEvent(ProductListingCriteriaEvent $event): void
{
    $event->getCriteria()->addAssociation('parent');
}

Hier wird dieser Fehler ausgespuckt:

The given alias '`product.parent.translation`' is not unique in FROM and JOIN clause table. The currently registered aliases are: `product`, `product.parent`, `product.translation`, `product.translation.fallback_1`, `product.tax`, `product.cover`, `product.unit`, `product.deliveryTime`, `product.parent.translation`, `product.parent.translation.fallback_1`, `product.parent.parent`.

Gibt es eine alternative Möglichkeit im Listing an alle Varianten eines Produkts zu kommen? Ziel ist es, im Listing eine zufällige Variante auszugeben.

Bist Du fündig geworden? Lässt sich in einer Variante der Parent hinzufügen/laden oder im Parent eine Liste der Varianten?

 

Gruß Hannes

Hallo zusammen,

ist nun schon eine Weile her, aber ich hatte heute dasselbe Problem und vielleicht stolpert ja nochmal jemand hier drüber. Laut Shopware ist das Laden per Assoziation nicht erlaubt (bin mir nicht sicher warum). Daher habe ich es folgendermaßen gelöst:

Subscriber:

//namespace ...

use Shopware\Core\Content\Product\Events\ProductListingResultEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ProductSubscriber implements EventSubscriberInterface
{

    /**
     * @var SalesChannelRepositoryInterface
     */
    private $productRepository;

    public function __construct(
        SalesChannelRepositoryInterface $productRepository
    ) {
        $this->productRepository = $productRepository;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            ProductListingResultEvent::class => 'handleListingResult',
        ];
    }

    public function handleListingResult(ProductListingResultEvent $event): void
    {
        $entities = $event->getResult()->getElements();

        // Collect parent IDs
        $parentIds = array_filter(
            array_map(
                function($entity) {
                    $entity->getParentId();
                },
            $entities)
        );

        // Get parent entities
        $criteria = new Criteria($parentIds);
        $criteria->addAssociation('children');
        $parents = $this->productRepository->search($criteria, $event->getSalesChannelContext());

        // Assign parents to variants
        foreach ($entities as $entity) {
            if ($entity->getParentId() && $parents->has($entity->getParentId())) {
                $entity->setParent($parents->get($entity->getParentId()));
            }
        }

    }

}

 

services.xml:

...

    
		
		
    

...

 

Das „$criteria->addAssociation(‚children‘);“ ist natürlich optional und wird nicht benötigt, wenn man nur den Parent haben möchte.

2 Likes