Console theme compile // Nur ein bestimmten Verkaufskanal

Hallo,

ich habe knapp 70 Verkaufskanäle und möchte mit dem Befehl „bin/console theme:compile“ nur einen bestimmten Verkaufskanal kompilieren und nicht immer alle.

Wie lautet der Befehl dafür? Das müsste ja sowas ähnliches sein: „bin/console theme:compile channelxy“

Geht wohl nicht oder?

Einfach folgende Datei anpassen/überschreiben.
Die foreach-Schleife ist verantwortlich, dass alle aufgerufen werden.

Quick&Dirty:

class CompileThemeCommand extends Command
{
    protected static $defaultName = 'sales_channel_theme:compile';

    private ThemeService $themeService;
    private AbstractAvailableThemeProvider $themeProvider;

    private EntityRepository $salesChannelRepository;

    public function __construct(ThemeService $themeService, AbstractAvailableThemeProvider $themeProvider, EntityRepository $salesChannelRepository)
    {
        parent::__construct();
        $this->themeService = $themeService;
        $this->themeProvider = $themeProvider;
        $this->salesChannelRepository = $salesChannelRepository;
    }

    // Provides a description, printed out in bin/console
    protected function configure(): void
    {
        $this->setDescription('Compiles theme by sales channel');

        $this->addArgument(
            'salesChannelName',
            InputArgument::IS_ARRAY | InputArgument::REQUIRED,
            'Please specify the name of the sales channel.'
        );

        $this->addOption(
            'keep-assets', 'k', 
            InputOption::VALUE_NONE, 
            'Keep current assets, do not delete them'
        );
    }

    // Actual code executed in the command
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $context = Context::createDefaultContext();

        $criteria = new Criteria();
        $criteria->addFilter(new EqualsFilter('name', $input->getArgument('salesChannelName')[0]));
        $salesChannelEntity = $this->salesChannelRepository->search($criteria, $context)->first();

        foreach ($this->themeProvider->load($context) as $salesChannelId => $themeId) {
            if($salesChannelEntity->getId() === $salesChannelId){
                $output->writeln(\sprintf('Compiling theme for sales channel for : %s', $salesChannelId));
                $start = microtime(true);
                $this->themeService->compileTheme($salesChannelId, $themeId, $context, null, !$input->getOption('keep-assets'));
                $output->writeln(sprintf('Took %f seconds', microtime(true) - $start));

                return 1;
            }
        }

        return 0;
    }
}

Geht auch direkt über die Console:

bin/console theme:compile -o 018adff7ba1c782a931e492ebd70dd63

Parameter ist hier definiert:

Die ID die man angeben muss bekommt man aus dem Backend aus der Adressleiste wenn der Sales-Channel ausgewählt ist für den man ausschließlich kompilieren will.

1 „Gefällt mir“