Files
sterivein/local/modules/Front/Controller/SitemapController.php

146 lines
4.2 KiB
PHP

<?php
/*************************************************************************************/
/* This file is part of the Thelia package. */
/* */
/* Copyright (c) OpenStudio */
/* email : dev@thelia.net */
/* web : http://www.thelia.net */
/* */
/* For the full copyright and license information, please view the LICENSE.txt */
/* file that was distributed with this source code. */
/*************************************************************************************/
namespace Front\Controller;
use Doctrine\Common\Cache\FilesystemCache;
use Thelia\Controller\Front\BaseFrontController;
use Thelia\Core\HttpFoundation\Request;
use Thelia\Core\HttpFoundation\Response;
use Thelia\Log\Tlog;
use Thelia\Model\ConfigQuery;
use Thelia\Model\LangQuery;
/**
* Controller uses to generate sitemap.xml
*
* A default cache of 2 hours is used to avoid attack. You can flush cache if you have `ADMIN` role and pass flush=1 in
* query parameter.
*
* @package Front\Controller
* @author Julien Chanséaume <jchanseaume@openstudio.fr>
*/
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);
}
}