<?php declare(strict_types=1);
namespace StudioSolid\ProductVideos\Storefront\Page\Product\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProductPageLoadedSubscriber implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
private $productEmbeddedVideoMediaRepository;
public function __construct(
EntityRepositoryInterface $productEmbeddedVideoMediaRepository
) {
$this->productEmbeddedVideoMediaRepository = $productEmbeddedVideoMediaRepository;
}
public static function getSubscribedEvents()
{
return [
ProductPageLoadedEvent::class => 'onProductPageLoaded',
];
}
public function onProductPageLoaded(ProductPageLoadedEvent $event): void
{
$product = $event->getPage()->getProduct();
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('productId', $product->getId()));
$productEmbeddedVideoMediaResults = $this->productEmbeddedVideoMediaRepository->search($criteria, $event->getContext());
if (!$productEmbeddedVideoMediaResults->getTotal() && $product->getParentId()) {
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('productId', $product->getParentId()));
$productEmbeddedVideoMediaResults = $this->productEmbeddedVideoMediaRepository->search($criteria, $event->getContext());
}
$combinedProductMedia = array_merge($productEmbeddedVideoMediaResults->getElements(), $product->getMedia()->getElements());
usort($combinedProductMedia, function ($a, $b) {
return $a->getPosition() - $b->getPosition();
});
$product->addArrayExtension('solidPvCombinedMedia', ['combinedMedia' => $combinedProductMedia]);
}
}