From edc9c25d702e499cbf1a554d2b270ff434c79925 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Sun, 8 May 2022 16:43:47 +0200 Subject: [PATCH] fix sitemap: navigation with several domains --- .../Controller/Site/SitemapController.php | 13 +++++----- src/core/Entity/Site/Navigation.php | 19 ++++++++++++++ src/core/Sitemap/SitemapBuilder.php | 26 ++++++++++++++++--- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/core/Controller/Site/SitemapController.php b/src/core/Controller/Site/SitemapController.php index ea1fe29..a2b6fc0 100644 --- a/src/core/Controller/Site/SitemapController.php +++ b/src/core/Controller/Site/SitemapController.php @@ -14,19 +14,20 @@ class SitemapController extends AbstractController /** * @Route("/sitemap.xml", name="sitemap") */ - public function sitemap(Request $request, NavigationRepositoryQuery $navigationRepositoryQuery, SitemapBuilder $builder): Response + public function sitemap(Request $request, NavigationRepositoryQuery $query, SitemapBuilder $builder): Response { - $navigations = $navigationRepositoryQuery - ->whereDomain($request->getHost()) - ->find() - ; + $navigations = $query->create()->find(); $items = []; foreach ($navigations as $navigation) { + if (!$navigation->matchDomain($request->getHost())) { + continue; + } + $items = array_merge( $items, - $builder->build($navigation) + $builder->build($navigation, $request->getHost()) ); } diff --git a/src/core/Entity/Site/Navigation.php b/src/core/Entity/Site/Navigation.php index 084f357..eb3b3cf 100644 --- a/src/core/Entity/Site/Navigation.php +++ b/src/core/Entity/Site/Navigation.php @@ -240,4 +240,23 @@ class Navigation implements EntityInterface return $this; } + + public function matchDomain(string $domain): bool + { + if ($domain === $this->getDomain()) { + return true; + } + + foreach ($this->getAdditionalDomains() as $additionalDomain) { + if ($additionalDomain['type'] === 'domain' && $additionalDomain['domain'] === $domain) { + return true; + } + + if ($additionalDomain['type'] === 'regexp' && preg_match('#'.$additionalDomain['domain'].'#', $domain) > 0) { + return true; + } + } + + return false; + } } diff --git a/src/core/Sitemap/SitemapBuilder.php b/src/core/Sitemap/SitemapBuilder.php index e5bca25..b61aa56 100644 --- a/src/core/Sitemap/SitemapBuilder.php +++ b/src/core/Sitemap/SitemapBuilder.php @@ -28,7 +28,7 @@ class SitemapBuilder $this->urlGenerator = $urlGenerator; } - public function build(Navigation $navigation): array + public function build(Navigation $navigation, ?string $currentDomain): array { $items = []; @@ -52,7 +52,7 @@ class SitemapBuilder $nodeItems = []; - foreach ($this->getNodeUrls($node) as $url) { + foreach ($this->getNodeUrls($node, $currentDomain) as $url) { $nodeItems[] = $this->createItem($parameters, $url); } @@ -66,7 +66,7 @@ class SitemapBuilder return $items; } - public function getNodeUrls(Node $node) + public function getNodeUrls(Node $node, ?string $currentDomain) { $urls = []; @@ -90,9 +90,27 @@ class SitemapBuilder } } } elseif (!$node->getDisableUrl() && !$node->hasAppUrl()) { + $params = []; + $domain = $currentDomain; + $navigation = $node->getMenu()->getNavigation(); + + if (null === $currentDomain || $navigation->getForceDomain()) { + $domain = $navigation->getDomain(); + } + + $params['_domain'] = $domain; + + foreach ($node->getParameters() as $param) { + if ('_locale' === $param['name']) { + $params['_locale'] = !empty($param['defaultValue']) + ? $param['defaultValue'] + : $node->getMenu()->getNavigation()->getLocale(); + } + } + $urls[] = $this->urlGenerator->generate( $node->getRouteName(), - [], + $params, UrlGeneratorInterface::ABSOLUTE_URL ); }