<?php declare(strict_types=1);
namespace Nimbits\NimbitsProductSuccessorNext\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Content\Product\ProductEvents;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Shopware\Core\Content\Cms\CmsPageEntity;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\KernelEvent;
use Shopware\Storefront\Event\StorefrontRenderEvent;
use Shopware\Storefront\Pagelet\Footer\FooterPageletLoadedEvent;
use Nimbits\NimbitsProductSuccessorNext\Setting\Service\SettingService;
use Shopware\Core\Framework\Struct\ArrayEntity;
use Shopware\Core\Framework\Struct\StructCollection;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Content\Product\SalesChannel\Detail\AbstractProductDetailRoute;
class Subscriber implements EventSubscriberInterface
{
/** @var SettingService $settingsService */
protected $settingsService;
/** @var AbstractProductDetailRoute $productDetailRoute */
protected $productDetailRoute;
/** @var EntityRepositoryInterface $productSuccessorRepository */
protected $productSuccessorRepository;
public function __construct(
SettingService $settingsService,
AbstractProductDetailRoute $productDetailRoute,
EntityRepositoryInterface $productSuccessorRepository
)
{
$this->settingsService = $settingsService;
$this->productDetailRoute = $productDetailRoute;
$this->productSuccessorRepository = $productSuccessorRepository;
}
public static function getSubscribedEvents(): array
{
// Return the events to listen to as array like this: <event to listen to> => <method to execute>
return [
ProductPageLoadedEvent::class => 'onProductPageLoaded'
];
}
public function onProductPageLoaded(ProductPageLoadedEvent $event)
{
$productId = $event->getPage()->getProduct()->getId();
$event->getPage()->getProduct()->addExtension('nimbitsProductSuccessorSettings', $this->settingsService->getSettingsAsStruct($event->getSalesChannelContext()->getSalesChannel()->getId()));
$successors = $this->productSuccessorRepository->search(
(new Criteria())
->addFilter(new EqualsFilter('productIdFrom', $productId)),
\Shopware\Core\Framework\Context::createDefaultContext()
);
$successors = $successors->getElements();
if(count($successors) == 0)
return;
$sucessorArticles = [];
foreach($successors as $k => $successor)
{
try
{
$criteria = (new Criteria())
->addAssociation('manufacturer.media')
->addAssociation('options.group')
->addAssociation('properties.group')
->addAssociation('mainCategories.category');
$criteria
->getAssociation('media');
$sucessorArticles[] = $this->productDetailRoute->load($successor->getProductIdTo(),
$event->getRequest(), $event->getSalesChannelContext(), $criteria)->getProduct();
}
catch(\Exception $e)
{
//there might be inactivate products in the list; we must not display them and just skip therefore
}
}
$event->getPage()->getProduct()->addExtension('nimbitsProductSuccessor', (new StructCollection())->assign(['articles' => $sucessorArticles]));
}
}
?>