*/ class SitemapController extends BaseFrontController { /** * Folder name for sitemap cache */ const SITEMAP_CACHE_DIR = "sitemap"; /** * Key prefix for sitemap cache */ const SITEMAP_CACHE_KEY = "sitemap"; /** * @return Response */ public function generateAction() { /** @var Request $request */ $request = $this->getRequest(); // the locale : fr, en, $lang = $request->query->get("lang", ""); if ("" !== $lang) { if (! $this->checkLang($lang)){ $this->pageNotFound(); } } // specific content : product, category, cms $context = $request->query->get("context", ""); if (! in_array($context, array("", "catalog", "content")) ){ $this->pageNotFound(); } $flush = $request->query->get("flush", ""); // check if sitemap already in cache $cacheContent = false; $cacheDir = $this->getCacheDir(); $cacheKey = self::SITEMAP_CACHE_KEY . $lang . $context; $cacheExpire = intval(ConfigQuery::read("sitemap_ttl", '7200')) ?: 7200; $cacheDriver = new FilesystemCache($cacheDir); if (!($this->checkAdmin() && "" !== $flush)){ $cacheContent = $cacheDriver->fetch($cacheKey); } else { $cacheDriver->delete($cacheKey); } // if not in cache if (false === $cacheContent){ // render the view $cacheContent = $this->renderRaw( "sitemap", array( "_lang_" => $lang, "_context_" => $context ) ); // save cache $cacheDriver->save($cacheKey, $cacheContent, $cacheExpire); } $response = new Response(); $response->setContent($cacheContent); $response->headers->set('Content-Type', 'application/xml'); return $response; } /** * get the cache directory for sitemap * * @return mixed|string */ protected function getCacheDir() { $cacheDir = $this->container->getParameter("kernel.cache_dir"); $cacheDir = rtrim($cacheDir, '/'); $cacheDir .= '/' . self::SITEMAP_CACHE_DIR . '/'; return $cacheDir; } /** * Check if current user has ADMIN role * * @return bool */ protected function checkAdmin(){ return $this->getSecurityContext()->hasAdminUser(); } /** * Check if a lang is used * * @param $lang The lang code. e.g.: fr * @return bool true if the language is used, otherwise false */ private function checkLang($lang) { // load locals $lang = LangQuery::create() ->findOneByCode($lang); return (null !== $lang); } }