Example #1
0
 /**
  * @param HitEvent $event
  */
 public function onHit(HitEvent $event)
 {
     if ($event->getMetadata()->reflection->getName() !== 'Sulu\\Bundle\\EventBundle\\Entity\\Event') {
         return;
     }
     $locale = $this->requestAnalyzer->getCurrentLocalization()->getLocalization();
     $document = $event->getHit()->getDocument();
     $eventApiEntity = $this->eventManager->findByIdAndLocale($document->getId(), $locale);
     if (!$eventApiEntity) {
         return;
     }
     $startDate = $eventApiEntity->getStartDate();
     $endDate = $eventApiEntity->getEndDate();
     $categories = $eventApiEntity->getCategories();
     $categoryTitles = array();
     foreach ($categories as $category) {
         $categoryTitles[] = $category->getName();
     }
     $startDateField = new Field('start_date', $startDate->format('c'), Field::TYPE_STRING);
     $document->addField($startDateField);
     if ($endDate) {
         $endDateField = new Field('end_date', $endDate->format('c'), Field::TYPE_STRING);
         $document->addField($endDateField);
     }
     $categoryTitleField = new Field('category_title', implode(', ', $categoryTitles), Field::TYPE_STRING);
     $document->addField($categoryTitleField);
     $url = $this->router->generate('sulu_events.detail', array('id' => $eventApiEntity->getId(), 'slug' => $eventApiEntity->getSlug()));
     $document->setUrl($url);
 }
 /**
  * Update locale in request analyzer.
  *
  * @param Request $request
  * @param RequestAnalyzerInterface $requestAnalyzer
  */
 public function enhance(Request $request, RequestAnalyzerInterface $requestAnalyzer)
 {
     if ($request->get('_custom_url') === null) {
         return;
     }
     $requestAnalyzer->updateLocale($request->get('_custom_url')->getTargetLocale(), $request);
 }
Example #3
0
 /**
  * {@inheritdoc}
  */
 public function resolve(RequestAnalyzerInterface $requestAnalyzer)
 {
     // determine default locale (if one exists)
     $defaultLocalization = $requestAnalyzer->getPortal()->getDefaultLocalization();
     $defaultLocale = $defaultLocalization ? $defaultLocalization->getLocalization() : null;
     return ['request' => ['webspaceKey' => $requestAnalyzer->getWebspace()->getKey(), 'defaultLocale' => $defaultLocale, 'locale' => $requestAnalyzer->getCurrentLocalization()->getLocalization(), 'portalUrl' => $requestAnalyzer->getPortalUrl(), 'resourceLocatorPrefix' => $requestAnalyzer->getResourceLocatorPrefix(), 'resourceLocator' => $requestAnalyzer->getResourceLocator(), 'get' => $requestAnalyzer->getGetParameters(), 'post' => $requestAnalyzer->getPostParameters(), 'analyticsKey' => $requestAnalyzer->getAnalyticsKey()]];
 }
Example #4
0
 private function initialize()
 {
     if ($this->initialized || $this->requestAnalyzer->getCurrentLocalization() === null) {
         return;
     }
     $this->translator->setLocale($this->requestAnalyzer->getCurrentLocalization()->getLocale(Localization::LCID));
     $this->initialized = true;
 }
Example #5
0
 /**
  * Set the active theme if there is a portal.
  *
  * @param GetResponseEvent $event
  */
 public function onKernelRequest(GetResponseEvent $event)
 {
     $portal = $this->requestAnalyzer->getPortal();
     if (null === $portal) {
         return;
     }
     $themeKey = $portal->getWebspace()->getTheme()->getKey();
     $this->activeTheme->setName($themeKey);
 }
Example #6
0
 /**
  * Prefix url of document with current resourcelocator prefix.
  *
  * @param HitEvent $event
  */
 public function onHit(HitEvent $event)
 {
     if (false === $event->getMetadata()->reflection->isSubclassOf('Sulu\\Bundle\\ContentBundle\\Document\\BasePageDocument')) {
         return;
     }
     $document = $event->getHit()->getDocument();
     $url = sprintf('%s/%s', rtrim($this->requestAnalyzer->getResourceLocatorPrefix(), '/'), ltrim($document->getUrl(), '/'));
     $document->setUrl($url);
 }
Example #7
0
 /**
  * {@inheritdoc}
  */
 public function loadParent($uuid)
 {
     $session = $this->sessionManager->getSession();
     $contentsNode = $this->sessionManager->getContentNode($this->requestAnalyzer->getWebspace()->getKey());
     $node = $session->getNodeByIdentifier($uuid);
     if ($node->getDepth() <= $contentsNode->getDepth()) {
         throw new ParentNotFoundException($uuid);
     }
     return $this->load($node->getParent()->getIdentifier());
 }
Example #8
0
 /**
  * {@inheritdoc}
  */
 public function sitemapFunction($locale = null, $webspaceKey = null)
 {
     if ($webspaceKey === null) {
         $webspaceKey = $this->requestAnalyzer->getWebspace()->getKey();
     }
     if ($locale === null) {
         $locale = $this->requestAnalyzer->getCurrentLocalization()->getLocalization();
     }
     return $this->sitemapGenerator->generate($webspaceKey, $locale)->getSitemap();
 }
 protected function setUp()
 {
     $this->contentMapper = $this->getContainer()->get('sulu.content.mapper');
     $this->requestAnalyzer = $this->getContainer()->get('sulu_core.webspace.request_analyzer');
     $this->structureResolver = $this->getContainer()->get('sulu_website.resolver.structure');
     $this->requestAnalyzer->setWebspaceKey('sulu_io');
     $this->requestAnalyzer->setLocalizationCode('en');
     $this->initPhpcr();
     $this->extension = new SnippetTwigExtension($this->contentMapper, $this->requestAnalyzer, $this->structureResolver);
 }
Example #10
0
 /**
  * Analyzes the request before passing the event to the default RouterListener from symfony and validates the result
  * afterwards.
  *
  * @param GetResponseEvent $event
  */
 public function onKernelRequest(GetResponseEvent $event)
 {
     $request = $event->getRequest();
     // This call is required in all cases, because the default router needs our webspace information
     // Would be nice to also only call this if the _requestAnalyzer attribute is set, but it's set on the next line
     $this->requestAnalyzer->analyze($request);
     $this->baseRouteListener->onKernelRequest($event);
     if ($request->attributes->get(static::REQUEST_ANALYZER, true) !== false) {
         $this->requestAnalyzer->validate($request);
     }
 }
Example #11
0
 /**
  * Renders the correct title of the current page. The correct title is either the title provided by the SEO
  * extension, or the title of the content, if the SEO extension does not provide one.
  *
  * @deprecated use the twig include function to render the seo
  */
 public function renderSeoTags(\Twig_Environment $twig, array $seoExtension, array $content, array $urls, $shadowBaseLocale)
 {
     $template = 'SuluWebsiteBundle:Extension:seo.html.twig';
     @trigger_error('This twig extension is deprecated and should not be used anymore, include the "%s".', $template);
     $defaultLocale = null;
     $portal = $this->requestAnalyzer->getPortal();
     if ($portal) {
         $defaultLocale = $portal->getXDefaultLocalization()->getLocale();
     }
     return $twig->render($template, ['seo' => $seoExtension, 'content' => $content, 'urls' => $urls, 'defaultLocale' => $defaultLocale, 'shadowBaseLocale' => $shadowBaseLocale]);
 }
Example #12
0
 /**
  * {@inheritdoc}
  */
 public function loadSnippet($uuid, $locale = null)
 {
     if ($locale === null) {
         $locale = $this->requestAnalyzer->getCurrentLocalization()->getLocalization();
     }
     try {
         $snippet = $this->contentMapper->load($uuid, $this->requestAnalyzer->getWebspace()->getKey(), $locale);
         return $this->structureResolver->resolve($snippet);
     } catch (DocumentNotFoundException $ex) {
         return;
     }
 }
Example #13
0
 /**
  * {@inheritdoc}
  */
 public function getContentRootPath($full = false)
 {
     if ($this->requestAnalyzer !== null) {
         if ($full) {
             return $this->requestAnalyzer->getPortalUrl();
         } else {
             return $this->requestAnalyzer->getResourceLocatorPrefix();
         }
     } else {
         return '/';
     }
 }
Example #14
0
 /**
  * Appends analytics scripts into body.
  *
  * @param FilterResponseEvent $event
  */
 public function onResponse(FilterResponseEvent $event)
 {
     if (0 !== strpos($event->getResponse()->headers->get('Content-Type'), 'text/html') || $this->requestAnalyzer->getPortalInformation() === null) {
         return;
     }
     $portalUrl = $this->requestAnalyzer->getAttribute('urlExpression');
     $analytics = $this->analyticsRepository->findByUrl($portalUrl, $this->requestAnalyzer->getPortalInformation()->getWebspaceKey(), $this->environment);
     $content = $this->engine->render('SuluWebsiteBundle:Analytics:website.html.twig', ['analytics' => $analytics]);
     $response = $event->getResponse();
     $responseContent = $response->getContent();
     $response->setContent(str_replace('</body>', $content . '</body>', $responseContent));
 }
Example #15
0
 /**
  * {@inheritdoc}
  */
 public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null)
 {
     $code = $exception->getStatusCode();
     $showException = $request->attributes->get('showException', $this->debug);
     $template = $this->requestAnalyzer->getWebspace()->getTheme()->getErrorTemplate($code);
     if ($showException || $request->getRequestFormat() !== 'html' || $template === null) {
         return parent::showAction($request, $exception, $logger);
     }
     $currentContent = $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1));
     $parameter = ['status_code' => $code, 'status_text' => isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '', 'exception' => $exception, 'currentContent' => $currentContent];
     $data = $this->parameterResolver->resolve($parameter, $this->requestAnalyzer);
     return new Response($this->twig->render($template, $data), $code);
 }
Example #16
0
 public function getDefault($snippetType, $webspaceKey = null, $locale = null)
 {
     if (!$webspaceKey) {
         $webspaceKey = $this->requestAnalyzer->getWebspace()->getKey();
     }
     if (!$locale) {
         $locale = $this->requestAnalyzer->getCurrentLocalization()->getLocalization();
     }
     $ids = [$this->defaultSnippetManager->loadIdentifier($webspaceKey, $snippetType)];
     // to filter null default snippet
     $ids = array_filter($ids);
     return $this->snippetResolver->resolve($ids, $webspaceKey, $locale);
 }
Example #17
0
 /**
  * {@inheritdoc}
  */
 public function onRequest(GetResponseEvent $event)
 {
     $context = $this->router->getContext();
     $portalInformation = $this->requestAnalyzer->getPortalInformation();
     if ($portalInformation) {
         if (!$context->hasParameter('prefix')) {
             $context->setParameter('prefix', $portalInformation->getPrefix());
         }
         if (!$context->hasParameter('host')) {
             $context->setParameter('host', $portalInformation->getHost());
         }
     }
 }
Example #18
0
 /**
  * Updates properties of current session content.
  *
  * @param ConnectionInterface   $from
  * @param MessageHandlerContext $context
  * @param array                 $msg
  *
  * @return array
  *
  * @throws PreviewNotStartedException
  * @throws MissingParameterException
  */
 private function update(ConnectionInterface $from, MessageHandlerContext $context, $msg)
 {
     // check context parameters
     if (!$context->has('content') && !$context->has('locale') && !$context->has('webspaceKey') && !$context->has('user')) {
         throw new PreviewNotStartedException();
     }
     // get user id
     $user = $context->get('user');
     // get session vars
     $contentUuid = $context->get('content');
     $locale = $context->get('locale');
     $webspaceKey = $context->get('webspaceKey');
     // init msg vars
     if (!array_key_exists('data', $msg) && is_array($msg['data'])) {
         throw new MissingParameterException('data');
     }
     $changes = $msg['data'];
     $this->requestAnalyzer->setWebspaceKey($webspaceKey);
     $this->requestAnalyzer->setLocalizationCode($locale);
     foreach ($changes as $property => $data) {
         // update property
         $this->preview->updateProperty($user, $contentUuid, $webspaceKey, $locale, $property, $data);
     }
     return ['command' => 'update', 'content' => $contentUuid, 'data' => $this->preview->getChanges($user, $contentUuid, $webspaceKey, $locale)];
 }
Example #19
0
 /**
  * Returns the security system.
  *
  * @return string
  */
 protected function getSystem()
 {
     $system = $this->suluSystem;
     if ($this->requestAnalyzer != null && $this->requestAnalyzer->getWebspace() !== null && $this->requestAnalyzer->getWebspace()->getSecurity() !== null) {
         // if the request analyzer is available, overwrite the system
         $system = $this->requestAnalyzer->getWebspace()->getSecurity()->getSystem();
     }
     return $system;
 }
Example #20
0
 /**
  * Returns alternate link HTML tags with href-lang attributes.
  *
  * @param array $urls
  *
  * @return string
  */
 public function getAlternateLinks($urls)
 {
     // determine default and current values
     $webspaceKey = $this->requestAnalyzer->getWebspace()->getKey();
     $currentPortal = $this->requestAnalyzer->getPortal();
     $defaultLocale = null;
     if ($currentPortal !== null && ($defaultLocale = $currentPortal->getDefaultLocalization()) !== null) {
         $defaultLocale = $defaultLocale->getLocalization();
     }
     $result = [];
     foreach ($urls as $locale => $url) {
         if ($url !== null) {
             if ($locale === $defaultLocale) {
                 $result[] = $this->getAlternate($url, $webspaceKey, $locale, true);
             }
             $result[] = $this->getAlternate($url, $webspaceKey, $locale);
         }
     }
     return implode(PHP_EOL, $result);
 }
Example #21
0
 /**
  * {@inheritdoc}
  */
 public function getContentPath($route, $webspaceKey = null, $locale = null, $domain = null, $scheme = null, $withoutDomain = true)
 {
     // if the request analyzer null or a route is passed which is relative or inclusive a domain nothing should be
     // done (this is important for external-links in navigations)
     if (!$this->requestAnalyzer || strpos($route, '/') !== 0) {
         return $route;
     }
     $scheme = $scheme ?: $this->requestAnalyzer->getAttribute('scheme');
     $locale = $locale ?: $this->requestAnalyzer->getCurrentLocalization()->getLocale();
     $webspaceKey = $webspaceKey ?: $this->requestAnalyzer->getWebspace()->getKey();
     $url = null;
     $host = $this->requestAnalyzer->getAttribute('host');
     if (!$domain && $this->webspaceManager->findWebspaceByKey($webspaceKey)->hasDomain($host, $this->environment)) {
         $domain = $host;
     }
     $url = $this->webspaceManager->findUrlByResourceLocator($route, $this->environment, $locale, $webspaceKey, $domain, $scheme);
     if (!$withoutDomain && !$url) {
         $url = $this->webspaceManager->findUrlByResourceLocator($route, $this->environment, $locale, $webspaceKey, null, $scheme);
     }
     return $url ?: $route;
 }
Example #22
0
 /**
  * Returns the search results for the given query.
  *
  * @param Request $request
  *
  * @return Response
  */
 public function queryAction(Request $request)
 {
     $query = $this->getRequestParameter($request, 'q', true);
     $locale = $this->requestAnalyzer->getCurrentLocalization()->getLocale();
     $webspace = $this->requestAnalyzer->getWebspace();
     $queryString = '';
     if (strlen($query) < 3) {
         $queryString .= '+("' . self::escapeDoubleQuotes($query) . '") ';
     } else {
         $queryValues = explode(' ', $query);
         foreach ($queryValues as $queryValue) {
             if (strlen($queryValue) > 2) {
                 $queryString .= '+("' . self::escapeDoubleQuotes($queryValue) . '" OR ' . preg_replace('/([^\\pL\\s\\d])/u', '?', $queryValue) . '* OR ' . preg_replace('/([^\\pL\\s\\d])/u', '', $queryValue) . '~) ';
             } else {
                 $queryString .= '+("' . self::escapeDoubleQuotes($queryValue) . '") ';
             }
         }
     }
     $hits = $this->searchManager->createSearch($queryString)->locale($locale)->index('page_' . $webspace->getKey() . '_published')->execute();
     return $this->engine->renderResponse($webspace->getTemplate('search'), $this->parameterResolver->resolve(['query' => $query, 'hits' => $hits], $this->requestAnalyzer));
 }
Example #23
0
 /**
  * Returns alternate link HTML tags with href-lang attributes.
  *
  * @param array $urls
  *
  * @return string
  *
  * @deprecated since 1.1 use SeoTwigExtension::renderSeoTags - sulu_seo
  */
 public function getAlternateLinks($urls)
 {
     // determine default and current values
     $webspaceKey = $this->requestAnalyzer->getWebspace()->getKey();
     $currentPortal = $this->requestAnalyzer->getPortal();
     $defaultLocale = null;
     if ($currentPortal !== null && ($defaultLocale = $currentPortal->getXDefaultLocalization()) !== null) {
         $defaultLocale = $defaultLocale->getLocalization();
     }
     $result = [];
     foreach ($urls as $locale => $url) {
         // url = '/' means that there is no translation for this page
         // the only exception is the homepage where the requested resource-locator is '/'
         if ($url !== '/' || $this->requestAnalyzer->getResourceLocator() === '/') {
             if ($locale === $defaultLocale) {
                 $result[] = $this->getAlternate($url, $webspaceKey, $locale, true);
             }
             $result[] = $this->getAlternate($url, $webspaceKey, $locale);
         }
     }
     return implode(PHP_EOL, $result);
 }
Example #24
0
 /**
  * @dataProvider provideSeoData
  *
  * @param $seoExtension
  * @param $content
  * @param $urls
  * @param $defaultLocale
  * @param $shadowBaseLocale
  * @param $expectedResults
  * @param array $unexpectedResults
  */
 public function testRenderSeoTags($seoExtension, $content, $urls, $defaultLocale, $shadowBaseLocale, $expectedResults, $unexpectedResults = [])
 {
     /** @var Localization $localization */
     $localization = $this->prophesize(Localization::class);
     $localization->getLocalization()->willReturn($defaultLocale);
     /** @var Portal $portal */
     $portal = $this->prophesize(Portal::class);
     $portal->getDefaultLocalization()->willReturn($localization->reveal());
     $this->requestAnalyzer->getPortal()->willReturn($portal->reveal());
     $webspace = $this->prophesize(Webspace::class);
     $this->requestAnalyzer->getWebspace()->willReturn($webspace);
     $this->contentPath->getContentPath(Argument::cetera())->will(function ($arguments) {
         return '/' . str_replace('_', '-', $arguments[2]) . $arguments[0];
     });
     $result = $this->seoTwigExtension->renderSeoTags($seoExtension, $content, $urls, $shadowBaseLocale);
     foreach ($expectedResults as $expectedResult) {
         $this->assertContains($expectedResult, $result);
     }
     foreach ($unexpectedResults as $unexpectedResult) {
         $this->assertNotContains($unexpectedResult, $result);
     }
 }
Example #25
0
 /**
  * Renders the alternate links for this page, this means all the localizations in which this page is available. In
  * addition the default localization is also rendered.
  *
  * @param string[] $urls All the localized URLs for the current page
  * @param string $webspaceKey The key of the current webspace
  *
  * @return string The rendered HTML tags
  */
 private function renderAlternateLinks(array $urls, $webspaceKey)
 {
     $html = '';
     $portal = $this->requestAnalyzer->getPortal();
     $defaultLocale = null;
     if ($portal) {
         $defaultLocale = $portal->getDefaultLocalization()->getLocalization();
         $html .= $this->renderAlternateLink($urls[$defaultLocale], $webspaceKey, $defaultLocale, true);
     }
     foreach ($urls as $locale => $url) {
         $html .= $this->renderAlternateLink($url, $webspaceKey, $locale);
     }
     return $html;
 }
Example #26
0
 /**
  * Will create a symfony route.
  *
  * @param RouteInterface $route
  * @param Request $request
  *
  * @return Route
  */
 protected function createRoute(RouteInterface $route, Request $request)
 {
     $routePath = $this->requestAnalyzer->getResourceLocatorPrefix() . $route->getPath();
     if ($route->isHistory()) {
         return new Route($routePath, ['_controller' => 'SuluWebsiteBundle:Redirect:redirect', 'url' => $request->getSchemeAndHttpHost() . $this->requestAnalyzer->getResourceLocatorPrefix() . $route->getTarget()->getPath() . ($request->getQueryString() ? '?' . $request->getQueryString() : '')]);
     }
     $symfonyRoute = $this->proxyFactory->createProxy(Route::class, function (&$wrappedObject, LazyLoadingInterface $proxy, $method, array $parameters, &$initializer) use($routePath, $route, $request) {
         $initializer = null;
         // disable initialization
         $wrappedObject = new Route($routePath, $this->routeDefaultsProvider->getByEntity($route->getEntityClass(), $route->getEntityId(), $request->getLocale()));
         return true;
     });
     return $this->symfonyRouteCache[$route->getId()] = $symfonyRoute;
 }
Example #27
0
 /**
  * Renders the alternate links for this page, this means all the localizations in which this page is available. In
  * addition the default localization is also rendered.
  *
  * @param string[] $urls All the localized URLs for the current page
  * @param string $webspaceKey The key of the current webspace
  *
  * @return string The rendered HTML tags
  */
 private function renderAlternateLinks(array $urls, $webspaceKey)
 {
     $html = '';
     $defaultLocale = null;
     $portal = $this->requestAnalyzer->getPortal();
     if ($portal) {
         $defaultLocale = $portal->getXDefaultLocalization()->getLocalization();
     }
     foreach ($urls as $locale => $url) {
         // url = '/' means that there is no translation for this page
         // the only exception is the homepage where the requested resource-locator is false
         if ($url !== '/' || $this->requestAnalyzer->getResourceLocator() === false) {
             if ($defaultLocale === $locale) {
                 $html .= $this->renderAlternateLink($url, $webspaceKey, $locale, true);
             }
             $html .= $this->renderAlternateLink($url, $webspaceKey, $locale);
         }
     }
     return $html;
 }
Example #28
0
 /**
  * @return array
  */
 protected function getUrls()
 {
     $request = $this->requestStack->getCurrentRequest();
     $urls = [];
     if ($request->get('_route')) {
         $portalInformations = $this->webspaceManager->getPortalInformations($this->environment);
         $routeParams = $request->get('_route_params');
         $routeName = $request->get('_route');
         foreach ($portalInformations as $portalInformation) {
             if ($portalInformation->getPortalKey() === $this->requestAnalyzer->getPortal()->getKey() && $portalInformation->getType() === RequestAnalyzerInterface::MATCH_TYPE_FULL) {
                 if (isset($routeParams['prefix'])) {
                     $routeParams['prefix'] = $portalInformation->getPrefix();
                 }
                 $url = $this->router->generate($routeName, $routeParams, true);
                 $urls[$portalInformation->getLocale()] = $url;
             }
         }
     }
     return $urls;
 }
 /**
  * {@inheritdoc}
  */
 public function getDefaultLocale()
 {
     $request = $this->requestStack->getCurrentRequest();
     if (null === $request) {
         return $this->requestAnalyzer->getPortal()->getDefaultLocalization();
     }
     $defaultLocalization = $this->requestAnalyzer->getPortal()->getDefaultLocalization()->getLocale(Localization::LCID);
     $localizations = [$defaultLocalization];
     foreach ($this->requestAnalyzer->getPortal()->getLocalizations() as $localization) {
         if ($localization->getLocale(Localization::LCID) !== $defaultLocalization) {
             $localizations[] = $localization->getLocale(Localization::LCID);
         }
     }
     $preferredLocale = $this->requestStack->getCurrentRequest()->getPreferredLanguage($localizations);
     foreach ($this->requestAnalyzer->getPortal()->getLocalizations() as $localization) {
         if ($localization->getLocale(Localization::LCID) === $preferredLocale) {
             return $localization;
         }
     }
     return $this->requestAnalyzer->getPortal()->getDefaultLocalization();
 }
Example #30
0
 /**
  * {@inheritdoc}
  */
 public function getRouteCollectionForRequest(Request $request)
 {
     $collection = new RouteCollection();
     $routeDocument = $this->requestAnalyzer->getAttribute('customUrlRoute');
     $customUrlDocument = $this->requestAnalyzer->getAttribute('customUrl');
     $localization = $this->requestAnalyzer->getAttribute('localization');
     if (null === $routeDocument || null === $localization) {
         return $collection;
     }
     if ($routeDocument->isHistory()) {
         // if custom-url is not redirect to avoid double redirects.
         if (!$routeDocument->getTargetDocument()->getTargetDocument()->isRedirect()) {
             return $this->addHistoryRedirectToRouteCollection($request, $routeDocument, $collection, $this->requestAnalyzer->getWebspace()->getKey());
         }
         $routeDocument = $routeDocument->getTargetDocument();
         $customUrlDocument = $routeDocument->getTargetDocument();
     }
     if ($customUrlDocument === null || $customUrlDocument->isPublished() === false || $customUrlDocument->getTargetDocument() !== null && $customUrlDocument->getTargetDocument()->getWorkflowStage() !== WorkflowStage::PUBLISHED) {
         return $collection;
     }
     $collection->add(uniqid('custom_url_route_', true), new Route($request->getPathInfo(), ['_custom_url' => $customUrlDocument, '_webspace' => $this->requestAnalyzer->getWebspace(), '_environment' => $this->environment]));
     return $collection;
 }