<?php
namespace Twigel\StrengthPlugin\Subscriber;
use Shopware\Core\Content\Product\Events\ProductListingResultEvent;
use Shopware\Core\Content\Property\Aggregate\PropertyGroupOption\PropertyGroupOptionEntity;
use Shopware\Core\Content\Property\PropertyGroupDefinition;
use Shopware\Core\Content\Property\PropertyGroupEntity;
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\SystemConfig\SystemConfigService;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Twigel\StrengthPlugin\Service\TwigelStrengthGroupOptions;
class ProductDetailSubscriber implements EventSubscriberInterface
{
/** @var SystemConfigService */
protected $config;
/** @var EntityRepository */
protected $groupRepository;
public function __construct(SystemConfigService $config, EntityRepository $groupRepository)
{
$this->config = $config;
$this->groupRepository = $groupRepository;
}
/**
* @inheritDoc
*/
public static function getSubscribedEvents()
{
return [
ProductPageLoadedEvent::class => 'productLoaded',
ProductListingResultEvent::class => 'listing'
];
}
public function listing(ProductListingResultEvent $event){
$products = $event->getResult()->getElements();
$pluginConfig = $this->config->get("TwigelStrengthPlugin");
if (!is_null($pluginConfig)){
$pluginConfig = $pluginConfig['config'];
}
foreach ($products as $product){
$productPropertyIds = $product->getPropertyIds();
$strength = [];
if (!is_null($productPropertyIds) && !is_null($pluginConfig)){
$strength = array_intersect($productPropertyIds, $pluginConfig);
if ($strength){
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('name', TwigelStrengthGroupOptions::POPERS_STRENGTHS));
$criteria->addAssociations(['options']);
/** @var PropertyGroupEntity $group */
$group = $this->groupRepository->search($criteria, $event->getContext())->first();
if (!$group){
return null;
}
$options = [];
/** @var PropertyGroupOptionEntity $option */
foreach ($group->getOptions() as $option){
$options[$option->getTranslation('name')] = [
'name' => $option->getTranslation('name'),
'id' => $option->getId(),
'groupId' => $option->getGroupId(),
'active' => false
];
if ($strength[0] === $option->getId()){
$options[$option->getTranslation('name')]['active'] = true;
}
}
krsort($options);
$product->setExtensions(['options' => $options]);
}
}
}
}
public function productLoaded(ProductPageLoadedEvent $event)
{
$productPropertyIds = $event->getPage()->getProduct()->getPropertyIds();
$pluginConfig = $this->config->get("TwigelStrengthPlugin");
$strength = [];
if (!is_null($pluginConfig)){
$pluginConfig = $pluginConfig['config'];
}
if (!is_null($productPropertyIds) && !is_null($pluginConfig)){
$strength = array_intersect($productPropertyIds, $pluginConfig);
if ($strength){
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('name', TwigelStrengthGroupOptions::POPERS_STRENGTHS));
$criteria->addAssociations(['options']);
/** @var PropertyGroupEntity $group */
$group = $this->groupRepository->search($criteria, $event->getContext())->first();
if (!$group){
return null;
}
$options = [];
/** @var PropertyGroupOptionEntity $option */
foreach ($group->getOptions() as $option){
$options[$option->getTranslation('name')] = [
'name' => $option->getTranslation('name'),
'id' => $option->getId(),
'groupId' => $option->getGroupId(),
'active' => false
];
if ($strength[0] === $option->getId()){
$options[$option->getTranslation('name')]['active'] = true;
}
}
krsort($options);
$event->getPage()->assign(['strength' => true, 'strengthOptions' => $options ]);
}
}
}
}