<?php
declare(strict_types=1);
namespace EsmComputer\Storefront\Subscriber;
use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
use Shopware\Storefront\Page\Product\Review\ProductReviewsLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use function array_key_exists;
class OtherProductVotesSubscriber implements EventSubscriberInterface
{
protected EntityRepository $productReviewRepository;
protected SalesChannelRepositoryInterface $salesChannelProductRepository;
public function __construct(
EntityRepository $productReviewRepository,
SalesChannelRepositoryInterface $salesChannelProductRepository
)
{
$this->productReviewRepository = $productReviewRepository;
$this->salesChannelProductRepository = $salesChannelProductRepository;
}
public static function getSubscribedEvents()
{
return [
ProductReviewsLoadedEvent::class => [[
'onProductReviewsLoaded', 150
]]
];
}
public function onProductReviewsLoaded(ProductReviewsLoadedEvent $event): void
{
$request = $event->getRequest();
$productId = $request->get('parentId') ?? $request->get('productId');
$criteria = new Criteria([$productId]);
/** @var SalesChannelProductEntity $product */
$product = $this->salesChannelProductRepository->search($criteria, $event->getSalesChannelContext())->getEntities()->first();
if(!array_key_exists('custom_product_model', $product->getCustomFields())) {
return;
}
$model = $product->getCustomFields()['custom_product_model'];
if(!$model) {
return;
}
$criteria = $event->getSearchResult()->getCriteria();
$criteria->resetFilters();
$criteria->addAssociation('product');
$criteria->addFilter(new EqualsFilter('status', true));
$criteria->addFilter(new EqualsFilter('product.customFields.custom_product_model', $model));
$allReviews = $this->productReviewRepository->search($criteria, $event->getContext());
$event->getSearchResult()->merge($allReviews->getEntities());
$event->getSearchResult()->getAggregations()->set('ratingMatrix', $allReviews->getAggregations()->get('ratingMatrix'));
}
}