<?php declare(strict_types=1);
namespace Acris\ProductTab\Storefront\Subscriber;
use Acris\ProductTab\Components\ProductTab\ProductTabGateway;
use Acris\ProductTab\Components\ProductTab\ProductTabService;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Core\Framework\Struct\ArrayEntity;
use Shopware\Storefront\Page\Product\ProductPageCriteriaEvent;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
Class ProductTabSubscriber implements EventSubscriberInterface
{
public const ACRIS_STREAM_IDS_EXTENSION = 'acrisStreamIds';
public const PRODUCT_TAB_SORT_BY = 'DESC';
/**
* @var RequestStack
*/
private $requestStack;
/**
* @var ProductTabGateway
*/
private $productTabGateway;
/**
* @var ProductTabService
*/
private $productTabService;
public function __construct(
RequestStack $requestStack,
ProductTabGateway $productTabGateway,
ProductTabService $productTabService
)
{
$this->requestStack = $requestStack;
$this->productTabGateway = $productTabGateway;
$this->productTabService = $productTabService;
}
public static function getSubscribedEvents(): array
{
return [
ProductPageCriteriaEvent::class => 'onProductPageCriteria',
ProductPageLoadedEvent::class => 'onProductPageLoaded'
];
}
public function onProductPageCriteria(ProductPageCriteriaEvent $event): void
{
$event->getCriteria()->addAssociation('acrisProductTab')->addAssociation('acrisProductTab.cmsPage')
->getAssociation('acrisProductTab')->addSorting(new FieldSorting('priority', self::PRODUCT_TAB_SORT_BY))
->addFilter(new EqualsFilter('active', true));
}
public function onProductPageLoaded(ProductPageLoadedEvent $event): void
{
$request = $this->requestStack->getCurrentRequest();
if(empty($request) === true) {
return;
}
$product = $event->getPage()->getProduct();
if (empty($product)) return;
$productId = $product->getId();
if ($product->hasExtension(self::ACRIS_STREAM_IDS_EXTENSION) && !empty($product->getExtension(self::ACRIS_STREAM_IDS_EXTENSION))) {
$productStreamIds = $product->getExtension(self::ACRIS_STREAM_IDS_EXTENSION)->get('ids');
} else {
$productStreamIds = $this->productTabGateway->getProductStreamIds([$productId], $event->getSalesChannelContext()->getContext());
$product->addExtension(self::ACRIS_STREAM_IDS_EXTENSION, new ArrayEntity(['ids' => $productStreamIds]));
}
$productTabResult = !empty($product->getParentId()) ? $this->productTabGateway->getProductDetailProductTab($product->getParentId(), $productStreamIds, $event->getSalesChannelContext()) : $this->productTabGateway->getProductDetailProductTab($productId, $productStreamIds, $event->getSalesChannelContext());
if($productTabResult->count() === 0) {
if($product->hasExtension('acrisProductTab')){
$product->removeExtension('acrisProductTab');
}
return;
}
$this->productTabService->setCmsPages($productTabResult->getEntities(), $request, $event);
$product->addExtension('acrisProductTab', $productTabResult->getEntities());
}
}