Files

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;
}
}