<?php
declare(strict_types=1);
namespace S360Experts\Storefront\Page\Product\Subscriber;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\Struct\ArrayStruct;
class ProductPageSubscriber implements EventSubscriberInterface
{
/**
* @var SystemConfigService
*/
private $systemConfigService;
/**
* @var EntityRepository
*/
private $expertRepository;
public function __construct(
SystemConfigService $systemConfigService,
EntityRepository $expertRepository
) {
$this->expertRepository = $expertRepository;
$this->systemConfigService = $systemConfigService;
}
/**
* @inheritDoc
*/
public static function getSubscribedEvents(): array
{
return [
ProductPageLoadedEvent::class => 'onProductPageLoaded'
];
}
public function onProductPageLoaded(ProductPageLoadedEvent $event): void
{
$product = $event->getPage()->getProduct();
$productExtensions = $product->getExtensions();
// has expert assigned via category no product expert assigned
if($this->systemConfigService->get('S360Experts.config.inheritFromCategory') && $productExtensions['experts'] && empty($productExtensions['experts']->getElements())) {
$categoryTree = $event->getPage()->getProduct()->getCategoryTree();
if(!empty($categoryTree)) {
$categoryTree = array_reverse($categoryTree); // needs to reverse cause the most specific category needs to be first and then we get more general
array_pop($categoryTree);
$criteria = new Criteria();
$criteria->addAssociation('categories');
$allExperts = $this->expertRepository->search($criteria, $event->getContext());
foreach($allExperts as $expert) {
if(empty($productExtensions['experts']->getElements())) {
foreach($categoryTree as $categoryId) {
if($expert->getCategories()->has($categoryId)) {
$productExtensions['experts']->add($expert);
}
}
}
}
}
}
// this is the base entities we assign to my page
if($productExtensions['experts'] && !empty($productExtensions['experts']->getElements())) {
$event->getPage()->getProduct()->addExtension('s360_experts', $productExtensions['experts']);
}
// this is their images
$s360ExpertImages = [];
foreach($productExtensions['experts'] as $s360Expert) {
if(!empty($s360Expert->getImage())) {
$s360ExpertImages[] = $s360Expert->getImage();
}
}
$event->getPage()->getProduct()->addExtension('s360_experts_images', new ArrayStruct($s360ExpertImages));
}
}