Alle Varianten eines Produktes laden (PHP)

Ich möchte alle Varianten eines Produktes laden.

Nachdem ich schon etwas gegooglet habe, habe ich diesen Code zusammen:

class ProductViewSubscriber implements EventSubscriberInterface
{
    private EntityRepositoryInterface $productRepository;

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

    public function getVariantsOfProduct(SalesChannelProductEntity $product, Context $context): EntitySearchResult
    {
        $parentProduct = $product->getParent();
        if ($parentProduct != null) {
            // Wir brauchen das Parent Product um die Varianten des Objektes herauszufinden
            $product = $parentProduct;
        }
        $criteria = new Criteria();
        $criteria->addFilter(new EqualsFilter('product.parentId',
            $product->getProductNumber()));
        return $this->productRepository->search(new Criteria(), $context);
    }

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

    public function addVariants(ProductPageLoadedEvent $pEvent)
    {
        $products = $this->getVariantsOfProduct($product = $pEvent->getPage()->getProduct(), $pEvent->getContext());
        $matchingVariants = $products->getElements();
    }
}

Anders als Online beschrieben enthält $matchingVariants aber nicht nur die Varianten sondern alle Produkte des Shops. Wie kann der Code geändert werden, dass nur die Produkte geladen werden, die Varianten des Produkts sind, für welches das ProductPageLoadedEvent ausgeführt wird?

return $this->productRepository->search(new Criteria(), $context);

ist der Fehler drin… du hast ja ein Criteria die Zeile darüber erstellt $criteria

Korrekt:

return $this->productRepository->search($criteria, $context);

Mit meinem verändertem code sagt er mir jetzt, dass gar keine Produkte existieren würden. Mache ich irgendetwas mit den Filtern falsch?

class ProductViewSubscriber implements EventSubscriberInterface
{
    private EntityRepositoryInterface $productRepository;

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

    public function getVariantsOfProduct(SalesChannelProductEntity $product, Context $context): EntitySearchResult
    {
        $parentProduct = $product->getParent();
        if ($parentProduct != null) {
            // Wir brauchen das Parent Product um die Varianten des Objektes herauszufinden
            $product = $parentProduct;
        }
        $criteria = new Criteria();
        $criteria->addFilter(new EqualsFilter('product.parentId',
            $product->getUniqueIdentifier()));
        return $this->productRepository->search($criteria, $context);
    }

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

    public function addVariants(ProductPageLoadedEvent $pEvent)
    {
        $products = $this->getVariantsOfProduct($product = $pEvent->getPage()->getProduct(), $pEvent->getContext());
        $matchingVariants = $products->getElements();
    }
}

Ohne die Datenbankstruktur im Kopf zu haben… du sucht product.parentId = $product->getUniqueIdentifier(). Sprich die id des Parent soll gleich der id des aufgerufenen Produkts sein… glaube nicht, dass das Sinn ergibt.

Kann aber auch gut sein, dass ich das gerade falsch lese. Müsste mich selbst erst einlesen, was mein Zeitlimit leider sprengen würde :laughing: Sorry.