Files

261 lines
9.0 KiB
PHP
Raw Permalink Normal View History

<?php
/**
* For the full copyright and license information, please view the
* docs/licenses/LICENSE.txt file that was distributed with this source code.
*/
use PrestaShopBundle\Security\Admin\LegacyAdminTokenValidator;
class CmsControllerCore extends FrontController
{
public const CMS_CASE_PAGE = 1;
public const CMS_CASE_CATEGORY = 2;
/** @var string */
public $php_self = 'cms';
public $assignCase;
/**
* @var CMS|null
*/
protected $cms;
/**
* @var CMSCategory|null
*/
protected $cms_category;
/** @var bool */
public $ssl = false;
public function canonicalRedirection(string $canonicalURL = ''): void
{
if (Validate::isLoadedObject($this->cms) && ($canonicalURL = $this->context->link->getCMSLink($this->cms, $this->cms->link_rewrite))) {
parent::canonicalRedirection($canonicalURL);
} elseif (Validate::isLoadedObject($this->cms_category) && ($canonicalURL = $this->context->link->getCMSCategoryLink($this->cms_category))) {
parent::canonicalRedirection($canonicalURL);
}
}
/**
* Initialize cms controller.
*
* @see FrontController::init()
*/
public function init(): void
{
if ($id_cms = (int) Tools::getValue('id_cms')) {
$this->cms = new CMS($id_cms, $this->context->language->id, $this->context->shop->id);
} elseif ($id_cms_category = (int) Tools::getValue('id_cms_category')) {
$this->cms_category = new CMSCategory($id_cms_category, $this->context->language->id, $this->context->shop->id);
}
if (Configuration::get('PS_SSL_ENABLED') && Tools::getValue('content_only') && $id_cms && Validate::isLoadedObject($this->cms)
&& in_array($id_cms, $this->getSSLCMSPageIds())) {
$this->ssl = true;
}
parent::init();
$this->canonicalRedirection();
if (Validate::isLoadedObject($this->cms)) {
if (!$this->cms->isAssociatedToShop()) {
$this->redirect_after = '404';
$this->redirect();
} elseif (!$this->cms->active) {
$adminTokenValidator = $this->getContainer()->get(LegacyAdminTokenValidator::class);
$isAdminTokenValid = $adminTokenValidator->isTokenValid((int) Tools::getValue('id_employee'), Tools::getValue('adtoken'));
if (!$isAdminTokenValid) {
$this->redirect_after = '404';
$this->redirect();
}
} else {
$this->assignCase = self::CMS_CASE_PAGE;
}
} elseif (Validate::isLoadedObject($this->cms_category) && $this->cms_category->active) {
$this->assignCase = self::CMS_CASE_CATEGORY;
} else {
$this->redirect_after = '404';
$this->redirect();
}
}
/**
* Assign template vars related to page content.
*
* @see FrontController::initContent()
*/
public function initContent(): void
{
if ($this->assignCase == self::CMS_CASE_PAGE) {
$cmsVar = $this->objectPresenter->present($this->cms);
// Chained hook call - if multiple modules are hooked here, they will receive the result of the previous one as a parameter
$filteredCmsContent = Hook::exec(
'filterCmsContent',
['object' => $cmsVar],
null,
false,
true,
false,
null,
true
);
if (!empty($filteredCmsContent['object'])) {
$cmsVar = $filteredCmsContent['object'];
}
$this->context->smarty->assign([
'cms' => $cmsVar,
]);
if ($this->cms->indexation == 0) {
$this->context->smarty->assign('nobots', true);
}
$this->setTemplate(
'cms/page',
['entity' => 'cms', 'id' => $this->cms->id]
);
} elseif ($this->assignCase == self::CMS_CASE_CATEGORY) {
$cmsCategoryVar = $this->getTemplateVarCategoryCms();
// Chained hook call - if multiple modules are hooked here, they will receive the result of the previous one as a parameter
$filteredCmsCategoryContent = Hook::exec(
'filterCmsCategoryContent',
['object' => $cmsCategoryVar],
null,
false,
true,
false,
null,
true
);
if (!empty($filteredCmsCategoryContent['object'])) {
$cmsCategoryVar = $filteredCmsCategoryContent['object'];
}
$this->context->smarty->assign($cmsCategoryVar);
$this->setTemplate(
'cms/category',
['entity' => 'cms_category', 'id' => $this->cms_category->id]
);
}
parent::initContent();
}
/**
* Return an array of IDs of CMS pages, which shouldn't be forwared to their canonical URLs in SSL environment.
* Required for pages which are shown in iframes.
*/
protected function getSSLCMSPageIds(): array
{
return [(int) Configuration::get('PS_CONDITIONS_CMS_ID'), (int) Configuration::get('LEGAL_CMS_ID_REVOCATION')];
}
public function getBreadcrumbLinks(): array
{
$breadcrumb = parent::getBreadcrumbLinks();
if ($this->assignCase == self::CMS_CASE_CATEGORY) {
$cmsCategory = new CMSCategory($this->cms_category->id_cms_category);
} else {
$cmsCategory = new CMSCategory($this->cms->id_cms_category);
}
if ($cmsCategory->id_parent != 0) {
foreach (array_reverse($cmsCategory->getParentsCategories()) as $category) {
if ($category['active']) {
$cmsSubCategory = new CMSCategory($category['id_cms_category']);
$breadcrumb['links'][] = [
'title' => $cmsSubCategory->getName(),
'url' => $this->context->link->getCMSCategoryLink($cmsSubCategory),
];
}
}
}
if ($this->assignCase == self::CMS_CASE_PAGE && $this->context->controller instanceof CmsControllerCore) {
$breadcrumb['links'][] = [
'title' => $this->context->controller->cms->meta_title,
'url' => $this->context->link->getCMSLink($this->context->controller->cms),
];
}
return $breadcrumb;
}
/**
* Initializes a set of commonly used variables related to the current page, available for use
* in the template. @see FrontController::assignGeneralPurposeVariables for more information.
*
* @return array
*/
public function getTemplateVarPage(): array
{
$page = parent::getTemplateVarPage();
if ($this->assignCase == self::CMS_CASE_CATEGORY) {
$page['body_classes']['cms-id-' . $this->cms_category->id] = true;
} else {
$page['body_classes']['cms-id-' . $this->cms->id] = true;
if (!$this->cms->indexation) {
$page['meta']['robots'] = 'noindex';
}
}
return $page;
}
public function getTemplateVarCategoryCms(): array
{
$categoryCms = [];
$categoryCms['cms_category'] = $this->objectPresenter->present($this->cms_category);
$categoryCms['sub_categories'] = [];
$categoryCms['cms_pages'] = [];
foreach ($this->cms_category->getSubCategories($this->context->language->id) as $subCategory) {
$categoryCms['sub_categories'][$subCategory['id_cms_category']] = $subCategory;
$categoryCms['sub_categories'][$subCategory['id_cms_category']]['link'] = $this->context->link->getCMSCategoryLink($subCategory['id_cms_category'], $subCategory['link_rewrite']);
}
foreach (CMS::getCMSPages($this->context->language->id, (int) $this->cms_category->id, true, (int) $this->context->shop->id) as $cmsPages) {
$categoryCms['cms_pages'][$cmsPages['id_cms']] = $cmsPages;
$categoryCms['cms_pages'][$cmsPages['id_cms']]['link'] = $this->context->link->getCMSLink($cmsPages['id_cms'], $cmsPages['link_rewrite']);
}
return $categoryCms;
}
/**
* @return CMS|null
*/
public function getCms(): ?CMS
{
return $this->cms;
}
/**
* @return CMSCategory|null
*/
public function getCmsCategory(): ?CMSCategory
{
return $this->cms_category;
}
/**
* {@inheritdoc}
*/
public function getCanonicalURL(): string
{
if (Validate::isLoadedObject($this->cms)) {
return $this->context->link->getCMSLink($this->cms, $this->cms->link_rewrite);
} elseif (Validate::isLoadedObject($this->cms_category)) {
return $this->context->link->getCMSCategoryLink($this->cms_category);
}
return '';
}
}