openMemory(); $writer->startDocument('1.0', 'UTF-8'); $writer->startElement('sitemapindex'); $writer->writeAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9'); // sitemap parts foreach ($this->getSitemaps($sitemapLocator) as $loc) { $writer->startElement('sitemap'); $writer->writeElement('loc', $loc); $writer->endElement(); } $writer->endElement(); $response = new Response($writer->outputMemory(true)); $response->headers->set('Content-type', 'application/xml'); $response->headers->set('Content-type', 'text/xml; charset=utf-8'); return $response; } /** * @Route("/{sequence}/sitemap_{type}.xml", name="kupshop_content_sitemap_sitemaptypesequence") * @Route("/sitemap_{type}.xml", name="kupshop_content_sitemap_sitemaptype") */ public function sitemapTypeAction(Request $request, SitemapLocator $sitemapLocator, string $type, ?string $sequence = null): Response { try { $sitemap = $sitemapLocator->getSitemap($type); } catch (UnknownSitemapTypeException $e) { throw new NotFoundHttpException($type); } $response = new CachingStreamedResponse(); $response->headers->set('Content-type', 'application/xml'); $response->headers->set('Content-type', 'text/xml; charset=utf-8'); $languageContext = Contexts::get(LanguageContext::class); $cacheName = 'sitemap_'.$type; if (findModule(\Modules::TRANSLATIONS)) { $cacheName = 'sitemap_'.$type.'_'.$languageContext->getActiveId(); } if (!empty($sequence)) { $sitemap::setSequence($sequence); $cacheName = $cacheName.'_'.$sequence; } $response->setCacheName($cacheName); $response->setTtl(43200); $response->setSkipCache($request->get('skip_cache', false)); $response->setCallback(function () use ($sitemap) { $sitemap->render(); }); $response->initialize(); return $response; } public function getSitemaps(SitemapLocator $sitemapLocator): \Generator { foreach ($sitemapLocator->getTypes() as $type) { try { $sitemap = $sitemapLocator->getSitemap($type); } catch (UnknownSitemapTypeException $e) { throw new NotFoundHttpException($type); } if ($sitemap->hasSequences()) { $countSequences = $sitemap->getCountSequences(); for ($i = 1; $i <= $countSequences; $i++) { yield path('kupshop_content_sitemap_sitemaptypesequence', ['type' => $type, 'sequence' => $i], Router::ABSOLUTE_URL); } } else { yield path('kupshop_content_sitemap_sitemaptype', ['type' => $type], Router::ABSOLUTE_URL); } } } }