<?php declare(strict_types=1);
namespace Acris\CmsPreview\Subscriber;
use Acris\CmsPreview\Components\Struct\CmsPreviewPageStruct;
use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
use Shopware\Core\System\SalesChannel\Entity\SalesChannelEntityLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class SalesChannelEntityLoadedSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
'sales_channel.product.loaded' => 'onSalesChannelProductLoaded',
'sales_channel.category.loaded' => 'onSalesChannelCategoryLoaded'
];
}
public function onSalesChannelProductLoaded(SalesChannelEntityLoadedEvent $event): void
{
$salesChannelContext = $event->getSalesChannelContext();
if($salesChannelContext->hasExtension(CmsPreviewPageStruct::EXTENSION_CMS_PREVIEW_PAGE) === true && $salesChannelContext->getExtension(CmsPreviewPageStruct::EXTENSION_CMS_PREVIEW_PAGE) instanceof CmsPreviewPageStruct) {
/** @var CmsPreviewPageStruct $cmsPagePreviewStruct */
$cmsPagePreviewStruct = $salesChannelContext->getExtension(CmsPreviewPageStruct::EXTENSION_CMS_PREVIEW_PAGE);
$cmsPageId = $cmsPagePreviewStruct->getPageId();
$productId = $cmsPagePreviewStruct->getProductId();
if(!empty($cmsPageId) && !empty($productId)) {
/** @var SalesChannelProductEntity $product */
foreach ($event->getEntities() as $product) {
if($product->getId() === $productId) {
$product->setCmsPageId($cmsPageId);
}
}
}
}
}
public function onSalesChannelCategoryLoaded(SalesChannelEntityLoadedEvent $event): void
{
$salesChannelContext = $event->getSalesChannelContext();
if($salesChannelContext->hasExtension(CmsPreviewPageStruct::EXTENSION_CMS_PREVIEW_PAGE) === true && $salesChannelContext->getExtension(CmsPreviewPageStruct::EXTENSION_CMS_PREVIEW_PAGE) instanceof CmsPreviewPageStruct) {
/** @var CmsPreviewPageStruct $cmsPagePreviewStruct */
$cmsPagePreviewStruct = $salesChannelContext->getExtension(CmsPreviewPageStruct::EXTENSION_CMS_PREVIEW_PAGE);
$cmsPageId = $cmsPagePreviewStruct->getPageId();
$categoryId = $cmsPagePreviewStruct->getCategoryId();
if(!empty($cmsPageId) && !empty($categoryId)) {
/** @var SalesChannelProductEntity $category */
foreach ($event->getEntities() as $category) {
if($category->getId() === $categoryId) {
$category->setCmsPageId($cmsPageId);
$category->setActive(true);
}
}
}
}
}
}