<?php declare(strict_types=1);
namespace She\StorefrontUrls;
use She\StorefrontUrls\Components\RequestMatcher;
use She\StorefrontUrls\Components\UrlGenerator;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Routing\RouteCollectionBuilder;
class SheStorefrontUrls extends Plugin implements CompilerPassInterface
{
public const CONFIG_NAME = 'SheStorefrontUrls.config';
public function build(ContainerBuilder $container): void
{
parent::build($container);
$container->addCompilerPass($this);
}
public function configureRoutes(RouteCollectionBuilder $routeBuilder, string $environment): void
{
if (!$this->isActive()) {
return;
}
$this->buildRoutes($routeBuilder);
}
public function process(ContainerBuilder $container)
{
$router = $container->getDefinition('router.default');
$router->addMethodCall('setOption', ['generator_class', UrlGenerator::class]);
}
private function buildRoutes(RouteCollectionBuilder $routeBuilder)
{
$routes = $routeBuilder->build()->all();
/** @var EntityRepositoryInterface $repository */
$repository = $this->container->get('sales_channel.repository');
$salesChannelIds = $repository->searchIds(new Criteria(), Context::createDefaultContext())->getIds();
$salesChannelIds[] = null;
foreach ($salesChannelIds as $salesChannelId) {
$config = $this->container->get(SystemConfigService::class)->get(self::CONFIG_NAME, $salesChannelId);
if (empty($config)) {
continue;
}
foreach ($config as $key => $paths) {
if (empty($paths)) {
continue;
}
$key = strtolower(substr(preg_replace('/(?<!^)[A-Z]/', '.$0', $key), 6));
if (!isset($routes[$key])) {
continue;
}
$paths = explode('&', $paths);
foreach ($paths as $path) {
$name = $key;
$routes[$key]->setDefault('_canonical_route', $key);
$route = clone $routes[$key];
if ($salesChannelId !== null) {
$name .= '.' . $salesChannelId;
$route->setDefault('_channel', $salesChannelId);
}
$path = explode('=', $path);
if (count($path) > 1) {
$name .= '.' . $path[0];
$route->setDefault('_locale', $path[0]);
$route->setPath($path[1]);
} else {
$route->setPath($path[0]);
}
$routeBuilder->addRoute($route, $name);
$routeBuilder->addRoute($routes[$key], $key . '.original');
}
}
}
}
}