<?php declare(strict_types=1);
namespace Avency\Shopware\Core\Core\Subscriber;
use Shopware\Core\Framework\Struct\ArrayStruct;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProductPageSubscriber implements EventSubscriberInterface
{
const SNIPPET_PRODUCT_ALLWAYS = 'avencyMinimumOrderValue.product';
const SNIPPET_PRODUCT_EXCLUDE = 'avencyMinimumOrderValue.productExclude';
const SNIPPET_PRODUCT_EXCLUDE_WITH_VALUE = 'avencyMinimumOrderValue.productExcludeWithValue';
const SNIPPET_PRODUCT_INCLUDE = 'avencyMinimumOrderValue.productInclude';
const SNIPPET_PRODUCT_INCLUDE_WITH_VALUE = 'avencyMinimumOrderValue.productIncludeWithValue';
/**
* @var SystemConfigService
*/
protected $systemConfigService;
public function __construct(SystemConfigService $systemConfigService)
{
$this->systemConfigService = $systemConfigService;
}
public static function getSubscribedEvents(): array
{
return [
ProductPageLoadedEvent::class => 'extendProductPage',
];
}
/**
* @param ProductPageLoadedEvent $event
*/
public function extendProductPage(ProductPageLoadedEvent $event)
{
$config = $this->systemConfigService->get('AvencyShopwareCore.config', $event->getSalesChannelContext()->getSalesChannelId());
if ($snippetName = $this->getSnippetName($event, $config)) {
$event->getPage()->getProduct()->addExtension('avencyMinimumOrderProduct', new ArrayStruct([
'snippetName' => $snippetName,
'minimumOrderAmount' => $config['avencyMinimumOrderAmount'],
]));
}
}
/**
* Get the snippet name
*
* @param ProductPageLoadedEvent $event
* @param array $config
* @return string
*/
private function getSnippetName(ProductPageLoadedEvent $event, array $config): ?string
{
$snippetName = null;
$minimumOrderValueDefinedByRule = isset($config['avencyMinimumOrderRuleId']) && $config['avencyMinimumOrderExtendedAmount'];
if (($config['avencyMinimumOrderProductMessage'] ?? false) && !$minimumOrderValueDefinedByRule) {
$snippetName = self::SNIPPET_PRODUCT_ALLWAYS;
}
if ($config['avencyMinimumOrderIncExcMessage'] ?? false) {
if (in_array($event->getPage()->getProduct()->getId(), $config['avencyMinimumOrderExcludeProductIds'] ?? [])) {
if ($minimumOrderValueDefinedByRule) {
$snippetName = $config['avencyMinimumOrderIncExcProductIds'] ?? false ? self::SNIPPET_PRODUCT_INCLUDE : self::SNIPPET_PRODUCT_EXCLUDE;
} else {
$snippetName = $config['avencyMinimumOrderIncExcProductIds'] ?? false ? self::SNIPPET_PRODUCT_INCLUDE_WITH_VALUE : self::SNIPPET_PRODUCT_EXCLUDE_WITH_VALUE;
}
}
}
return $snippetName;
}
}