215 lines
9.5 KiB
PHP
215 lines
9.5 KiB
PHP
<?php
|
|
/**
|
|
*
|
|
* @author Presta-Module.com <support@presta-module.com>
|
|
* @copyright Presta-Module
|
|
* @license Commercial
|
|
*
|
|
* ____ __ __
|
|
* | _ \ | \/ |
|
|
* | |_) | | |\/| |
|
|
* | __/ | | | |
|
|
* |_| |_| |_|
|
|
*
|
|
****/
|
|
|
|
if (!defined('_PS_VERSION_')) {
|
|
exit;
|
|
}
|
|
class pm_advancedsearch4seoModuleFrontController extends ModuleFrontController
|
|
{
|
|
protected $idSeo;
|
|
protected $idSearch;
|
|
protected $searchInstance;
|
|
protected $seoUrl;
|
|
protected $pageNb = 1;
|
|
protected $criterions;
|
|
protected $originalCriterions;
|
|
public function init()
|
|
{
|
|
parent::init();
|
|
$this->setSEOTags();
|
|
$this->setProductFilterList();
|
|
$this->setSmartyVars();
|
|
if (version_compare(_PS_VERSION_, '1.7.0.0', '<')) {
|
|
$this->setTemplate('seo-page.tpl');
|
|
} else {
|
|
$this->setTemplate('module:pm_advancedsearch4/views/templates/front/'.Tools::substr(_PS_VERSION_, 0, 3).'/seo-page.tpl');
|
|
}
|
|
}
|
|
public function setMedia()
|
|
{
|
|
parent::setMedia();
|
|
if ((method_exists($this->context, 'getMobileDevice') && $this->context->getMobileDevice() == false || !method_exists($this->context, 'getMobileDevice'))) {
|
|
$this->addCSS(array(
|
|
_THEME_CSS_DIR_.'scenes.css' => 'all',
|
|
_THEME_CSS_DIR_.'category.css' => 'all',
|
|
_THEME_CSS_DIR_.'product_list.css' => 'all',
|
|
));
|
|
if (Configuration::get('PS_COMPARATOR_MAX_ITEM') > 0) {
|
|
$this->addJS(_THEME_JS_DIR_.'products-comparison.js');
|
|
}
|
|
}
|
|
}
|
|
protected function redirectToSeoPageIndex()
|
|
{
|
|
$seoObj = new AdvancedSearchSeoClass($this->idSeo, $this->context->language->id);
|
|
if (Validate::isLoadedObject($seoObj)) {
|
|
Tools::redirect($this->context->link->getModuleLink('pm_advancedsearch4', 'seo', array('id_seo' => (int)$seoObj->id, 'seo_url' => $seoObj->seo_url), null, (int)$this->context->language->id));
|
|
} else {
|
|
Tools::redirect('index');
|
|
}
|
|
}
|
|
protected function setSEOTags()
|
|
{
|
|
$this->idSeo = Tools::getValue('id_seo');
|
|
$this->seoUrl = Tools::getValue('seo_url');
|
|
$this->pageNb = (int)Tools::getValue('p', 1);
|
|
if ($this->seoUrl && $this->idSeo) {
|
|
$resultSeoUrl = AdvancedSearchSeoClass::getSeoSearchByIdSeo((int)$this->idSeo, (int)$this->context->language->id);
|
|
if (!$resultSeoUrl) {
|
|
Tools::redirect('404');
|
|
}
|
|
$this->idSearch = (int)$resultSeoUrl[0]['id_search'];
|
|
$this->searchInstance = new AdvancedSearchClass((int)$this->idSearch, (int)$this->context->language->id);
|
|
if ($resultSeoUrl[0]['deleted']) {
|
|
header("Status: 301 Moved Permanently", false, 301);
|
|
Tools::redirect('index');
|
|
}
|
|
if (!$this->searchInstance->active) {
|
|
header("Status: 307 Temporary Redirect", false, 307);
|
|
Tools::redirect('index');
|
|
}
|
|
$seoUrlCheck = current(explode('/', $this->seoUrl));
|
|
if ($resultSeoUrl[0]['seo_url'] != $seoUrlCheck) {
|
|
header("Status: 301 Moved Permanently", false, 301);
|
|
$this->redirectToSeoPageIndex();
|
|
die();
|
|
}
|
|
$hasPriceCriterionGroup = false;
|
|
if (is_array($this->criterions) && sizeof($this->criterions)) {
|
|
$selected_criteria_groups_type = As4SearchEngine::getCriterionGroupsTypeAndDisplay((int)$this->id_search, array_keys($this->criterions));
|
|
if (is_array($selected_criteria_groups_type) && sizeof($selected_criteria_groups_type)) {
|
|
foreach ($selected_criteria_groups_type as $criterionGroup) {
|
|
if ($criterionGroup['criterion_group_type'] == 'price') {
|
|
$hasPriceCriterionGroup = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ($hasPriceCriterionGroup && $resultSeoUrl[0]['id_currency'] && $this->context->cookie->id_currency != (int)$resultSeoUrl[0]['id_currency']) {
|
|
$this->context->cookie->id_currency = $resultSeoUrl[0]['id_currency'];
|
|
header('Refresh: 1; URL='.$_SERVER['REQUEST_URI']);
|
|
die;
|
|
}
|
|
$criteria = unserialize($resultSeoUrl[0]['criteria']);
|
|
if (is_array($criteria) && sizeof($criteria)) {
|
|
$this->criterions = PM_AdvancedSearch4::getArrayCriteriaFromSeoArrayCriteria($criteria);
|
|
$this->criterions = As4SearchEngine::cleanArrayCriterion($this->criterions);
|
|
}
|
|
$searchQuery = implode('/', array_slice(explode('/', $this->seoUrl), 1));
|
|
$criterionsList = As4SearchEngine::getCriterionsFromURL($this->idSearch, $searchQuery);
|
|
if (is_array($criterionsList) && sizeof($criterionsList)) {
|
|
if (is_array($this->criterions) && sizeof($this->criterions)) {
|
|
$arrayDiff = $criterionsList;
|
|
foreach ($arrayDiff as $arrayDiffKey => $arrayDiffRow) {
|
|
if (isset($this->criterions[$arrayDiffKey]) && $this->criterions[$arrayDiffKey] == $arrayDiffRow) {
|
|
unset($arrayDiff[$arrayDiffKey]);
|
|
}
|
|
}
|
|
if (is_array($arrayDiff) && sizeof($arrayDiff)) {
|
|
$this->context->smarty->assign(array(
|
|
'nobots' => true,
|
|
));
|
|
}
|
|
unset($arrayDiff);
|
|
} else {
|
|
$this->context->smarty->assign(array(
|
|
'nobots' => true,
|
|
));
|
|
}
|
|
}
|
|
$this->originalCriterions = $this->criterions;
|
|
$this->criterions += $criterionsList;
|
|
$this->context->smarty->assign(array(
|
|
'page_name' => 'advancedsearch-seo-' . (int)$this->idSeo,
|
|
'as_is_seo_page' => true,
|
|
'meta_title' => $resultSeoUrl[0]['meta_title'] . ((int)$this->pageNb > 1 ? ' ('.$this->pageNb.')' : ''),
|
|
'meta_description' => $resultSeoUrl[0]['meta_description'],
|
|
'meta_keywords' => $resultSeoUrl[0]['meta_keywords'],
|
|
'path' => $resultSeoUrl[0]['title'],
|
|
'as_seo_title' => $resultSeoUrl[0]['title'],
|
|
'as_seo_description' => $resultSeoUrl[0]['description'],
|
|
'as_seo_description2' => $resultSeoUrl[0]['description2'],
|
|
'as_cross_links' => AdvancedSearchSeoClass::getCrossLinksSeo((int)$this->context->language->id, $resultSeoUrl[0]['id_seo']),
|
|
));
|
|
} else {
|
|
Tools::redirect('404');
|
|
}
|
|
}
|
|
protected function setProductFilterList()
|
|
{
|
|
$productFilterListSource = Tools::getValue('productFilterListSource');
|
|
if (in_array($productFilterListSource, As4SearchEngine::$validPageName)) {
|
|
As4SearchEngine::$productFilterListSource = $productFilterListSource;
|
|
if ($productFilterListSource == 'search' || $productFilterListSource == 'jolisearch' || $productFilterListSource == 'module-ambjolisearch-jolisearch') {
|
|
$productFilterListData = AdvancedSearchCoreClass::getDataUnserialized(Tools::getValue('productFilterListData'));
|
|
if ($productFilterListData !== false) {
|
|
As4SearchEngine::$productFilterListData = $productFilterListData;
|
|
}
|
|
}
|
|
$this->module->setProductFilterContext();
|
|
}
|
|
}
|
|
protected function setSmartyVars()
|
|
{
|
|
$nb_products = As4SearchEngine::getProductsSearched(
|
|
$this->idSearch,
|
|
$this->criterions,
|
|
As4SearchEngine::getCriterionGroupsTypeAndDisplay($this->idSearch, array_keys($this->criterions)),
|
|
(int)$this->pageNb,
|
|
(int)Tools::getValue('n', $this->searchInstance->products_per_page),
|
|
true
|
|
);
|
|
$products = As4SearchEngine::getProductsSearched(
|
|
$this->idSearch,
|
|
$this->criterions,
|
|
As4SearchEngine::getCriterionGroupsTypeAndDisplay($this->idSearch, array_keys($this->criterions)),
|
|
(int)$this->pageNb,
|
|
(int)Tools::getValue('n', $this->searchInstance->products_per_page),
|
|
false
|
|
);
|
|
if ($this->pageNb > 1 && !$products) {
|
|
$this->redirectToSeoPageIndex();
|
|
}
|
|
$this->module->_assignPagination($this->searchInstance->products_per_page, $nb_products);
|
|
$this->module->_assignProductSort($this->searchInstance);
|
|
$link_pm = new LinkPM($this->context->link->protocol_link, $this->context->link->protocol_content);
|
|
$this->context->smarty->assign(array(
|
|
'products' => $products,
|
|
'nb_products' => $nb_products,
|
|
'id_search' => $this->idSearch,
|
|
'request' => $link_pm->getPaginationLink(false, false, false, true),
|
|
'link' => $link_pm,
|
|
'as_obj' => $this->module,
|
|
));
|
|
}
|
|
public function getSearchEngine()
|
|
{
|
|
return $this->searchInstance;
|
|
}
|
|
public function getIdSeo()
|
|
{
|
|
return $this->idSeo;
|
|
}
|
|
public function getSelectedCriterions()
|
|
{
|
|
return $this->criterions;
|
|
}
|
|
public function getOriginalCriterions()
|
|
{
|
|
return $this->originalCriterions;
|
|
}
|
|
}
|