<?php declare(strict_types=1);
namespace Shopware\Storefront\Theme\Subscriber;
use Doctrine\DBAL\Exception as DBALException;
use Shopware\Core\System\SystemConfig\Service\ConfigurationService;
use Shopware\Storefront\Theme\Event\ThemeCompilerEnrichScssVariablesEvent;
use Shopware\Storefront\Theme\StorefrontPluginRegistryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ThemeCompilerEnrichScssVarSubscriber implements EventSubscriberInterface
{
private ConfigurationService $configurationService;
private StorefrontPluginRegistryInterface $storefrontPluginRegistry;
/**
* @internal
*/
public function __construct(
ConfigurationService $configurationService,
StorefrontPluginRegistryInterface $storefrontPluginRegistry
) {
$this->configurationService = $configurationService;
$this->storefrontPluginRegistry = $storefrontPluginRegistry;
}
/**
* @return array<string, string|array{0: string, 1: int}|list<array{0: string, 1?: int}>>
*/
public static function getSubscribedEvents()
{
return [
ThemeCompilerEnrichScssVariablesEvent::class => 'enrichExtensionVars',
];
}
/**
* @internal
*/
public function enrichExtensionVars(ThemeCompilerEnrichScssVariablesEvent $event): void
{
$allConfigs = [];
if ($this->storefrontPluginRegistry->getConfigurations()->count() === 0) {
return;
}
try {
foreach ($this->storefrontPluginRegistry->getConfigurations() as $configuration) {
$allConfigs = array_merge(
$allConfigs,
$this->configurationService->getResolvedConfiguration(
$configuration->getTechnicalName() . '.config',
$event->getContext(),
$event->getSalesChannelId()
)
);
}
} catch (DBALException $e) {
if (\defined('\STDERR')) {
fwrite(
\STDERR,
'Warning: Failed to load plugin css configuration. Ignoring plugin css customizations. Message: '
. $e->getMessage() . \PHP_EOL
);
}
}
foreach ($allConfigs as $card) {
if (!isset($card['elements']) || !\is_array($card['elements'])) {
continue;
}
foreach ($card['elements'] as $element) {
if (!$this->hasCssValue($element)) {
continue;
}
$event->addVariable($element['config']['css'], $element['value'] ?? $element['defaultValue']);
}
}
}
/**
* @param mixed $element
*/
private function hasCssValue($element): bool
{
if (!\is_array($element)) {
return false;
}
if (!\is_array($element['config'])) {
return false;
}
if (!isset($element['config']['css'])) {
return false;
}
if (!\is_string($element['value'] ?? $element['defaultValue'])) {
return false;
}
return true;
}
}