*/
class SitemapController extends BaseFrontController
{
use CategorySitemapTrait;
use ProductSitemapTrait;
use FolderSitemapTrait;
use ContentSitemapTrait;
use ProductImageTrait;
/** Folder name for sitemap cache */
const SITEMAP_CACHE_DIR = "sitemap";
/** Key prefix for sitemap cache */
const SITEMAP_CACHE_KEY = "sitemap";
/** Folder name for sitemap image cache */
const SITEMAP_IMAGE_CACHE_DIR = "sitemap-image";
/** Key prefix for sitemap image cache */
const SITEMAP_IMAGE_CACHE_KEY = "sitemap-image";
protected $useFallbackTemplate = true;
/**
* Generate sitemap
*/
public function generateAction()
{
return $this->generateSitemap(self::SITEMAP_CACHE_KEY, self::SITEMAP_CACHE_DIR);
}
/**
* Generate sitemap image
*/
public function generateImageAction()
{
return $this->generateSitemap(self::SITEMAP_IMAGE_CACHE_KEY, self::SITEMAP_IMAGE_CACHE_DIR);
}
/**
* Check if cached sitemap can be used or generate a new one and cache it
*
* @param $cacheKey
* @param $cacheDirName
* @return Response
*/
public function generateSitemap($cacheKey, $cacheDirName)
{
// Get and check locale
$locale = $this->getSession()->getLang()->getLocale();
if ("" !== $locale) {
if (! $this->checkLang($locale)){
$this->pageNotFound();
}
}
// Get sitemap cache information
$sitemapContent = false;
$cacheDir = $this->getCacheDir($cacheDirName);
$cacheKey .= $locale;
$cacheExpire = intval(ConfigQuery::read("sitemap_ttl", '7200')) ?: 7200;
$cacheDriver = new FilesystemCache($cacheDir);
// Check if sitemap has to be deleted
if (!($this->checkAdmin() && "" !== $this->getRequest()->query->get("flush", ""))){
// Get cached sitemap
$sitemapContent = $cacheDriver->fetch($cacheKey);
} else {
$cacheDriver->delete($cacheKey);
}
// If not in cache, generate and cache it
if (false === $sitemapContent){
// Check if we generate the standard sitemap or the sitemap image
switch ($cacheDirName) {
// Image
case self::SITEMAP_IMAGE_CACHE_DIR:
$sitemap = $this->hydrateSitemapImage($locale);
break;
// Standard
case self::SITEMAP_CACHE_DIR:
default:
$sitemap = $this->hydrateSitemap($locale);
break;
}
$sitemapContent = implode("\n", $sitemap);
// Save cache
$cacheDriver->save($cacheKey, $sitemapContent, $cacheExpire);
}
// Render
$response = new Response();
$response->setContent($sitemapContent);
$response->headers->set('Content-Type', 'application/xml');
return $response;
}
/* ------------------ */
/**
* Build sitemap array
*
* @param $locale
* @return array
*/
protected function hydrateSitemap($locale)
{
// Begin sitemap
$sitemap = ['
'.URL::getInstance()->getIndexPage().'
'
];
// Hydrate sitemap
$this->setSitemapCategories($sitemap, $locale);
$this->setSitemapProducts($sitemap, $locale);
$this->setSitemapFolders($sitemap, $locale);
$this->setSitemapContents($sitemap, $locale);
// End sitemap
$sitemap[] = "\t".'';
return $sitemap;
}
/**
* Build sitemap image array
*
* @param $locale
* @return array
*/
protected function hydrateSitemapImage($locale)
{
// Begin sitemap image
$sitemap = ['
'.URL::getInstance()->getIndexPage().'
'
];
// Hydrate sitemap image
$this->setSitemapProductImages($sitemap, $locale);
// End sitemap image
$sitemap[] = "\t".'';
return $sitemap;
}
/* ------------------ */
/**
* @param $type
* @param RewritingUrl $result
* @param $configValues
* @param $sitemap
*/
protected function generateSitemapImage($type, $result, $configValues, &$sitemap)
{
$event = new ImageEvent();
$event
->setWidth($configValues['width'])
->setHeight($configValues['height'])
->setQuality($configValues['quality'])
->setRotation($configValues['rotation'])
->setResizeMode($configValues['resizeMode'])
->setBackgroundColor($configValues['bgColor'])
->setAllowZoom($configValues['allowZoom']);
// Put source image file path
$source_filepath = sprintf("%s%s/%s/%s",
THELIA_ROOT,
ConfigQuery::read('images_library_path', 'local/media/images'),
$type,
$result->getVirtualColumn('PRODUCT_FILE')
);
$event->setSourceFilepath($source_filepath);
$event->setCacheSubdirectory($type);
try {
// Dispatch image processing event
$this->dispatch(TheliaEvents::IMAGE_PROCESS, $event);
// New sitemap image entry
$sitemap[] = '
'.URL::getInstance()->absoluteUrl($result->getUrl()).'
'.$event->getFileUrl().'
'.htmlspecialchars($result->getVirtualColumn('PRODUCT_TITLE')).'
';
} catch (\Exception $ex) {
}
}
/* ------------------ */
/**
* @param $locale
* @return bool true if the language is used, otherwise false
*/
protected function checkLang($locale)
{
// Load locales
$locale = LangQuery::create()
->findOneByLocale($locale);
return (null !== $locale);
}
/**
* Get the cache directory for sitemap
*
* @param $cacheDirName
* @return mixed|string
*/
protected function getCacheDir($cacheDirName)
{
$cacheDir = $this->container->getParameter("kernel.cache_dir");
$cacheDir = rtrim($cacheDir, '/');
$cacheDir .= '/' . $cacheDirName . '/';
return $cacheDir;
}
/**
* Check if current user has ADMIN role
*
* @return bool
*/
protected function checkAdmin(){
return $this->getSecurityContext()->hasAdminUser();
}
}