<?php declare(strict_types=1);namespace Shopware\Storefront\Theme\Subscriber;use Shopware\Core\Defaults;use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;use Shopware\Core\Framework\Log\Package;use Shopware\Core\Framework\Store\Event\FirstRunWizardFinishedEvent;use Shopware\Storefront\Theme\ThemeEntity;use Shopware\Storefront\Theme\ThemeLifecycleService;use Shopware\Storefront\Theme\ThemeService;use Symfony\Component\EventDispatcher\EventSubscriberInterface;/** * @deprecated tag:v6.5.0 - reason:becomes-internal - EventSubscribers will become internal in v6.5.0 */#[Package('storefront')]class FirstRunWizardSubscriber implements EventSubscriberInterface{ private ThemeService $themeService; private ThemeLifecycleService $themeLifecycleService; private EntityRepositoryInterface $themeRepository; private EntityRepositoryInterface $themeSalesChannelRepository; private EntityRepositoryInterface $salesChannelRepository; /** * @internal */ public function __construct( ThemeService $themeService, ThemeLifecycleService $themeLifecycleService, EntityRepositoryInterface $themeRepository, EntityRepositoryInterface $themeSalesChannelRepository, EntityRepositoryInterface $salesChannelRepository ) { $this->themeService = $themeService; $this->themeLifecycleService = $themeLifecycleService; $this->themeRepository = $themeRepository; $this->themeSalesChannelRepository = $themeSalesChannelRepository; $this->salesChannelRepository = $salesChannelRepository; } /** * @return array<string, string|array{0: string, 1: int}|list<array{0: string, 1?: int}>> */ public static function getSubscribedEvents() { return [ FirstRunWizardFinishedEvent::class => 'frwFinished', ]; } public function frwFinished(FirstRunWizardFinishedEvent $event): void { // only run on open -> completed|failed transition if (!$event->getPreviousState()->isOpen() || $event->getState()->isOpen()) { return; } $context = $event->getContext(); $this->themeLifecycleService->refreshThemes($context); $criteria = new Criteria(); $criteria->addAssociation('salesChannels'); $criteria->addFilter(new EqualsFilter('technicalName', 'Storefront')); /** @var ThemeEntity|null $theme */ $theme = $this->themeRepository->search($criteria, $context)->first(); if (!$theme) { throw new \RuntimeException('Default theme not found'); } $themeSalesChannels = $theme->getSalesChannels(); // only run if the themes are not already initialised if ($themeSalesChannels && $themeSalesChannels->count() > 0) { return; } $criteria = new Criteria(); $criteria->addFilter(new EqualsFilter('typeId', Defaults::SALES_CHANNEL_TYPE_STOREFRONT)); $salesChannelIds = $this->salesChannelRepository->search($criteria, $context)->getIds(); foreach ($salesChannelIds as $id) { $this->themeService->compileTheme($id, $theme->getId(), $context); $this->themeSalesChannelRepository->upsert([[ 'themeId' => $theme->getId(), 'salesChannelId' => $id, ]], $context); } }}