- http://www.presta-module.com * @copyright Presta-Module 2019 - http://www.presta-module.com * @license Commercial * @version 4.12.7 * * ____ __ __ * | _ \ | \/ | * | |_) | | |\/| | * | __/ | | | | * |_| |_| |_| */ if (!defined('_PS_VERSION_')) { exit; } if (version_compare(_PS_VERSION_, '1.7.0.0', '<')) { include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/LinkPM.php'); } include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/As4SearchEngineLogger.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/As4SearchEngineDb.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/As4SearchEngine.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/As4SearchEngineIndexation.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/As4SearchEngineSeo.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/AdvancedSearchClass.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/AdvancedSearchCriterionGroupClass.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/AdvancedSearchCriterionClass.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/AdvancedSearchSeoClass.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/AdvancedSearchCoreClass.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/AdvancedSearchWidgetProxy.php'); if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/controllers/front/AdvancedSearchProductListingFrontController.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/search_provider/As4SearchProvider.php'); include_once(_PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/classes/search_provider/As4FullTreeSearchProvider.php'); } class PM_AdvancedSearch4 extends AdvancedSearchWidgetProxy { protected $errors = array(); private $options_show_hide_crit_method; private $options_launch_search_method; private $options_defaut_order_by; private $options_defaut_order_way; private $options_criteria_group_type; protected $allowFileExtension = array('gif', 'jpg', 'jpeg', 'png' ); private $sortableCriterion = array('attribute', 'feature', 'manufacturer', 'supplier', 'category', 'subcategory', 'weight', 'width', 'height', 'depth', 'condition'); private $originalPositionSortableCriterion = array('attribute', 'category', 'subcategory'); private $criteriaGroupLabels; private $criterionGroupIsTemplatisable = array('attribute', 'feature', 'manufacturer', 'supplier', 'category' ); private $display_vertical_search_block = array(); public $_require_maintenance = true; public static $_module_prefix = 'as4'; protected $_defaultConfiguration = array( 'fullTree' => true, 'autoReindex' => true, 'autoSyncActiveStatus' => true, 'moduleCache' => false, 'blurEffect' => true, 'sortOrders' => array(), ); protected $_copyright_link = array( 'link' => '', 'img' => '//www.presta-module.com/img/logo-module.JPG' ); protected $_support_link = false; protected $_css_js_to_load = array( 'core', 'jquerytiptip', 'plupload', 'codemirrorcore', 'codemirrorcss', 'datatables', 'colorpicker', 'jgrowl', 'multiselect', 'tiny_mce', 'form', 'chosen', ); protected $_file_to_check = array( 'views/css', 'views/css/pm_advancedsearch4_dynamic.css', 'search_files', 'search_files/criterions', 'search_files/criterions_group', 'uploads/temp', ); public $templatePrefix = ''; const INSTALL_SQL_BASE_FILE = 'install_base.sql'; const INSTALL_SQL_DYN_FILE = 'install_dyn.sql'; const DYN_CSS_FILE = 'views/css/pm_advancedsearch4_dynamic.css'; const ADVANCED_CSS_FILE = 'views/css/pm_advancedsearch4_advanced.css'; public function __construct() { As4SearchEngineLogger::log("Start"); $this->name = 'pm_advancedsearch4'; $this->author = 'Presta-Module'; $this->tab = 'search_filter'; $this->need_instance = 0; $this->module_key = 'e0578dd1826016f7acb8045ad15372b4'; $this->version = '4.12.7'; $this->ps_versions_compliancy['min'] = '1.6.0.1'; $this->controllers = array( 'advancedsearch4', 'seo', 'searchresults', ); parent::__construct(); if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $this->templatePrefix = Tools::substr(_PS_VERSION_, 0, 3) . '/'; } $this->registerFrontSmartyObjects(); if ($this->_onBackOffice()) { if (Configuration::get('PM_' . self::$_module_prefix . '_UPDATE_THEME')) { Configuration::updateValue('PM_' . self::$_module_prefix . '_UPDATE_THEME', 0); $this->registerToAllHooks(); $this->updateModulesHooksPositions(); $this->createOrUpdateAllControllers(true); } $this->displayName = $this->l('Advanced Search 4'); $this->description = $this->l('Multi-layered search engine and search by steps'); $this->options_show_hide_crit_method = array( 1 => $this->l('On mouse hover'), 2 => $this->l('On click'), 3 => $this->l('In an overflow block'), ); $this->options_launch_search_method = array( 1 => $this->l('Instant search (change)'), 2 => $this->l('Search on submit (submit)'), 3 => $this->l('When the last criterion is selected'), ); $this->options_defaut_order_by = array( 0 => $this->l('Name'), 1 => $this->l('Price'), 4 => $this->l('Position inside category'), 5 => (version_compare(_PS_VERSION_, '1.7.0.0', '>=') ? $this->l('Brand') : $this->l('Manufacturer')), 6 => $this->l('Quantity'), 2 => $this->l('Added date') .' ('.$this->l('Recommended for heavy catalog').')', 3 => $this->l('Modified date').' ('.$this->l('Recommended for heavy catalog').')', 8 => $this->l('Sales'), ); $this->options_defaut_order_way = array( 0 => $this->l('Ascending'), 1 => $this->l('Descending'), ); $this->options_criteria_group_type = array( 1 => $this->l('Selectbox'), 3 => $this->l('Link'), 4 => $this->l('Checkbox'), 5 => $this->l('Slider'), 8 => $this->l('Numerical range'), //6 => $this->l('Search box'), 2 => $this->l('Image'), ); $doc_url_tab = array(); $doc_url_tab['fr'] = '#/fr/advancedsearch4/'; $doc_url_tab['en'] = '#/en/advancedsearch4/'; $doc_url = $doc_url_tab['en']; if ($this->_iso_lang == 'fr') { $doc_url = $doc_url_tab['fr']; } $forum_url_tab = array(); $forum_url_tab['fr'] = 'http://www.prestashop.com/forums/topic/113804-module-pm-advanced-search-4-elu-meilleur-module-2012/'; $forum_url_tab['en'] = 'http://www.prestashop.com/forums/topic/113831-module-pm-advancedsearch-4-winner-at-the-best-module-awards-2012/'; $forum_url = $forum_url_tab['en']; if ($this->_iso_lang == 'fr') { $forum_url = $forum_url_tab['fr']; } $this->_support_link = array( array('link' => $forum_url, 'target' => '_blank', 'label' => $this->l('Forum topic')), array('link' => 'http://addons.prestashop.com/contact-community.php?id_product=2778', 'target' => '_blank', 'label' => $this->l('Support contact')), ); $this->display_vertical_search_block = array(); foreach (array('displayLeftColumn', 'displayRightColumn') as $hookName) { if (Hook::getIdByName($hookName) !== false) { $this->display_vertical_search_block[] = Hook::getIdByName($hookName); } } $this->criteriaGroupLabels = array( 'category' => $this->l('category'), 'feature' => $this->l('feature'), 'attribute' => $this->l('attribute'), 'supplier' => $this->l('supplier'), 'manufacturer' => (version_compare(_PS_VERSION_, '1.7.0.0', '>=') ? $this->l('brand') : $this->l('manufacturer')), 'price' => $this->l('price'), 'weight' => $this->l('product properties'), 'on_sale' => $this->l('product properties'), 'stock' => $this->l('product properties'), 'available_for_order' => $this->l('product properties'), 'online_only' => $this->l('product properties'), 'condition' => $this->l('product properties'), 'width' => $this->l('product properties'), 'height' => $this->l('product properties'), 'depth' => $this->l('product properties'), 'pack' => $this->l('product properties'), 'new_products' => $this->l('product properties'), 'prices_drop' => $this->l('product properties'), 'subcategory' => $this->l('category') ); } register_shutdown_function(array($this, 'customShutdownProcess')); } private static $idProductToAdd = array(); private static $idProductToUpdate = array(); private static $idProductToDelete = array(); public function customShutdownProcess() { self::$idProductToAdd = array_unique(self::$idProductToAdd); self::$idProductToUpdate = array_unique(self::$idProductToUpdate); self::$idProductToDelete = array_unique(self::$idProductToDelete); As4SearchEngineIndexation::$processingAutoReindex = true; foreach (self::$idProductToAdd as $idProduct) { $product = new Product((int)$idProduct); if (Validate::isLoadedObject($product)) { As4SearchEngineIndexation::indexCriterionsFromProduct($product, true); } } foreach (self::$idProductToUpdate as $idProduct) { $product = new Product((int)$idProduct); if (Validate::isLoadedObject($product)) { As4SearchEngineIndexation::indexCriterionsFromProduct($product); } } foreach (self::$idProductToDelete as $idProduct) { $product = new Product((int)$idProduct); if (Validate::isLoadedObject($product)) { As4SearchEngineIndexation::desIndexCriterionsFromProduct($product->id); } } As4SearchEngineIndexation::$processingAutoReindex = false; } public function hookModuleRoutes() { $searchResultsCategoryPrefix = '{id}-{rewrite}'; $searchResultsSupplierPrefix = '{id}__{rewrite}'; $searchResultsManufacturerPrefix = '{id}_{rewrite}'; $categoryRoute = Configuration::get('PS_ROUTE_category_rule', null, null, $this->context->shop->id); $supplierRoute = Configuration::get('PS_ROUTE_supplier_rule', null, null, $this->context->shop->id); $manufacturerRoute = Configuration::get('PS_ROUTE_manufacturer_rule', null, null, $this->context->shop->id); if (!empty($categoryRoute) && preg_match('/{id}/', $categoryRoute)) { $searchResultsCategoryPrefix = $categoryRoute; } if (!empty($supplierRoute) && preg_match('/{id}/', $supplierRoute)) { $searchResultsSupplierPrefix = $supplierRoute; } if (!empty($manufacturerRoute) && preg_match('/{id}/', $manufacturerRoute)) { $searchResultsManufacturerPrefix = $manufacturerRoute; } $as4SqRegeXp = '[_a-zA-Z0-9\pL\pS/.:+-]*'; return array( 'module-pm_advancedsearch4-seo' => array( 'controller' => 'seo', 'rule' => 's/{id_seo}/{seo_url}', 'keywords' => array( 'id_seo' => array('regexp' => '[0-9]+', 'param' => 'id_seo'), 'seo_url' => array('regexp' => '.+', 'param' => 'seo_url'), ), 'params' => array( 'fc' => 'module', 'module' => 'pm_advancedsearch4', ) ), 'module-pm_advancedsearch4-seositemap' => array( 'controller' => 'seositemap', 'rule' => 'as4_seositemap-{id_search}.xml', 'keywords' => array( 'id_search' => array('regexp' => '[0-9]+', 'param' => 'id_search') ), 'params' => array( 'fc' => 'module', 'module' => 'pm_advancedsearch4', ) ), 'module-pm_advancedsearch4-cron' => array( 'controller' => 'cron', 'params' => array( 'fc' => 'module', 'module' => 'pm_advancedsearch4', ) ), 'module-pm_advancedsearch4-searchresults' => array( 'controller' => 'searchresults', 'rule' => 's-{id_search}/{as4_sq}', 'keywords' => array( 'id_search' => array('regexp' => '[0-9]+', 'param' => 'id_search'), 'as4_sq' => array('regexp' => $as4SqRegeXp, 'param' => 'as4_sq'), ), 'params' => array( 'fc' => 'module', 'module' => 'pm_advancedsearch4', ) ), 'module-pm_advancedsearch4-searchresults-categories' => array( 'controller' => 'searchresults', 'rule' => $searchResultsCategoryPrefix . '/s-{id_search}/{as4_sq}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_category_search'), 'id_search' => array('regexp' => '[0-9]+', 'param' => 'id_search'), 'as4_sq' => array('regexp' => $as4SqRegeXp, 'param' => 'as4_sq'), 'rewrite' => array('regexp' => '[_a-zA-Z0-9\pL\pS-]*'), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), 'params' => array( 'fc' => 'module', 'module' => 'pm_advancedsearch4', 'as4_from' => 'category', ) ), 'module-pm_advancedsearch4-searchresults-suppliers' => array( 'controller' => 'searchresults', 'rule' => $searchResultsSupplierPrefix . '/s-{id_search}/{as4_sq}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_supplier_search'), 'id_search' => array('regexp' => '[0-9]+', 'param' => 'id_search'), 'as4_sq' => array('regexp' => $as4SqRegeXp, 'param' => 'as4_sq'), 'rewrite' => array('regexp' => '[_a-zA-Z0-9\pL\pS-]*'), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), 'params' => array( 'fc' => 'module', 'module' => 'pm_advancedsearch4', 'as4_from' => 'supplier', ) ), 'module-pm_advancedsearch4-searchresults-manufacturers' => array( 'controller' => 'searchresults', 'rule' => $searchResultsManufacturerPrefix . '/s-{id_search}/{as4_sq}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_manufacturer_search'), 'id_search' => array('regexp' => '[0-9]+', 'param' => 'id_search'), 'as4_sq' => array('regexp' => $as4SqRegeXp, 'param' => 'as4_sq'), 'rewrite' => array('regexp' => '[_a-zA-Z0-9\pL\pS-]*'), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), 'params' => array( 'fc' => 'module', 'module' => 'pm_advancedsearch4', 'as4_from' => 'manufacturer', ) ), 'layered_rule' => array( 'controller' => '404', 'rule' => 'disablethisrule-'.uniqid(), 'keywords' => array(), 'params' => array() ), ); } private function registerToAllHooks() { $valid_hooks = As4SearchEngine::$valid_hooks; foreach ($valid_hooks as $hook_name) { if (!$this->registerHook($hook_name)) { return false; } } if (!$this->registerHook('moduleRoutes') || !$this->registerHook('header') || !$this->registerHook('updateProduct') || !$this->registerHook('addProduct') || !$this->registerHook('deleteProduct')) { return false; } if (!$this->registerHook('actionAdminProductsControllerSaveAfter')) { return false; } if (!$this->registerHook('actionObjectAddAfter') || !$this->registerHook('actionObjectUpdateAfter') || !$this->registerHook('actionObjectDeleteAfter')) { return false; } if (!$this->registerHook('actionProductListOverride')) { return false; } if (!$this->registerHook('actionObjectLanguageAddAfter')) { return false; } if (version_compare(_PS_VERSION_, '1.7.0.0', '>=') && !$this->registerHook('displayBeforeBodyClosingTag')) { return false; } if (version_compare(_PS_VERSION_, '1.7.0.0', '>=') && !$this->registerHook('actionAdminProductsControllerCoreSaveAfter')) { return false; } if (!$this->registerHook('actionShopDataDuplication') && !$this->registerHook('actionObjectShopDeleteAfter')) { return false; } return true; } private function updateModulesHooksPositions() { $hookList = array('displayLeftColumn', 'displayRightColumn'); if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $hookList[] = 'productSearchProvider'; } foreach ($hookList as $hookName) { $idHook = Hook::getIdByName($hookName); if ($idHook) { foreach (Shop::getContextListShopID() as $idShop) { Db::getInstance()->execute(' UPDATE `' . _DB_PREFIX_ . 'hook_module` SET `position`=0 WHERE `id_module` = ' . (int)$this->id . ' AND `id_hook` = ' . (int)$idHook . ' AND `id_shop` = ' . (int)$idShop); } $this->cleanPositions($idHook, Shop::getContextListShopID()); } } } private function createOrUpdateAllControllers($forceSetLayout = false) { if (method_exists($this, 'installControllers') && is_callable(array($this, 'installControllers'))) { $this->installControllers(); if ($forceSetLayout) { $this->updateControllersLayoutSettings(array('cron', 'seositemap')); } } } public function install() { if (!parent::install() || !$this->installDB()) { return false; } if (!$this->registerToAllHooks()) { return false; } $this->checkIfModuleIsUpdate(true, false); return true; } public function installDB() { if (!Tools::file_exists_cache(dirname(__FILE__) . '/sql/' . self::INSTALL_SQL_BASE_FILE)) { return (false); } elseif (!$sql = Tools::file_get_contents(dirname(__FILE__) . '/sql/' . self::INSTALL_SQL_BASE_FILE)) { return (false); } $sql = str_replace('PREFIX_', _DB_PREFIX_, $sql); $sql = str_replace('MYSQL_ENGINE', _MYSQL_ENGINE_, $sql); $sql = preg_split("/;\s*[\r\n]+/", $sql); foreach ($sql as $query) { if (!As4SearchEngineDb::execute(trim($query))) { return (false); } } return true; } public function installDBCache($id_search, $with_drop = true) { if (!Tools::file_exists_cache(dirname(__FILE__) . '/sql/' . self::INSTALL_SQL_DYN_FILE)) { return (false); } elseif (!$sql = Tools::file_get_contents(dirname(__FILE__) . '/sql/' . self::INSTALL_SQL_DYN_FILE)) { return (false); } $sql = str_replace('ID_SEARCH', $id_search, $sql); $sql = str_replace('PREFIX_', _DB_PREFIX_, $sql); $sql = str_replace('MYSQL_ENGINE', _MYSQL_ENGINE_, $sql); $sql = preg_split("/;\s*[\r\n]+/", $sql); foreach ($sql as $query) { if (!$with_drop && preg_match('#^DROP#i', trim($query))) { continue; } if (!As4SearchEngineDb::execute(trim($query))) { return (false); } } return true; } private static function removeOldHtAccessRules() { $path = _PS_ROOT_DIR_.'/.htaccess'; $htaccessContent = Tools::file_get_contents($path); $start = strpos($htaccessContent, '#START AS4 RULES (Do not remove)'); $end = strpos($htaccessContent, '#END AS4 RULES'); if ($start !== false && $end !== false) { $toReplace = Tools::substr($htaccessContent, $start, $end + Tools::strlen('#END AS4 RULES')); if (!empty($toReplace)) { $newHtaccesContent = trim(str_replace($toReplace, '', $htaccessContent)); file_put_contents($path, $newHtaccesContent); Tools::generateHtaccess(); } } } private function updateControllersLayoutSettings($ignoreList = array()) { if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $themeRepository = (new PrestaShop\PrestaShop\Core\Addon\Theme\ThemeManagerBuilder($this->context, Db::getInstance()))->buildRepository(); $themeManager = (new PrestaShop\PrestaShop\Core\Addon\Theme\ThemeManagerBuilder($this->context, Db::getInstance()))->build(); $theme = $themeRepository->getInstanceByName($this->context->shop->theme->getName()); $defaultCategoryLayout = $theme->getLayoutNameForPage('category'); $currentThemeLayouts = $theme->getPageLayouts(); if (empty($currentThemeLayouts) || empty($defaultCategoryLayout)) { return; } foreach ($this->controllers as $controllerName) { if (in_array($controllerName, $ignoreList)) { continue; } $completeControllerName = Tools::strtolower('module-' . $this->name . '-' . $controllerName); $currentThemeLayouts[$completeControllerName] = $defaultCategoryLayout; } $this->context->shop->theme->setPageLayouts($currentThemeLayouts); $themeManager->saveTheme($this->context->shop->theme); } else { if (isset($this->context) && !empty($this->context->theme) && is_object($this->context->theme) && Validate::isLoadedObject($this->context->theme) && method_exists($this->context->theme, 'hasColumns')) { $columnsSettingsCategory = $this->context->theme->hasColumns('category'); if (is_array($columnsSettingsCategory) && isset($columnsSettingsCategory['left_column']) && isset($columnsSettingsCategory['right_column'])) { foreach ($this->controllers as $controllerName) { if (in_array($controllerName, $ignoreList)) { continue; } $completeControllerName = Tools::strtolower('module-' . $this->name . '-' . $controllerName); $idMeta = (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT `id_meta` FROM `'._DB_PREFIX_.'meta` WHERE `page` = "'.pSQL($completeControllerName).'"'); if (!empty($idMeta)) { Db::getInstance()->autoExecute(_DB_PREFIX_ . 'theme_meta', array( array('id_theme' => (int)$this->context->theme->id, 'id_meta' => (int)$idMeta, 'left_column' => (int)$columnsSettingsCategory['left_column'], 'right_column' => (int)$columnsSettingsCategory['right_column']), ), 'REPLACE'); } } } } } } public function checkIfModuleIsUpdate($updateDb = false, $displayConfirm = true) { $isUpdate = true; $firstInstall = false; $currentModuleLastVersion = Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION'); if (empty($currentModuleLastVersion)) { $firstInstall = true; $this->updateModulesHooksPositions(); } if (Configuration::get('AS4_LAST_VERSION', false) !== false && Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false) === false) { Configuration::updateValue('PM_' . self::$_module_prefix . '_LAST_VERSION', Configuration::get('AS4_LAST_VERSION', false)); Configuration::deleteByName('AS4_LAST_VERSION'); } if (!$updateDb && $this->version != Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false)) { return false; } if ($updateDb) { $oldModuleVersion = Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false); if (Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false) !== false && version_compare(Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false), '4.8', '>=') && version_compare(Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false), '4.9.1', '<=')) { $updateShopTable = true; } else { $updateShopTable = false; } $this->createOrUpdateAllControllers($firstInstall); self::removeOldHtAccessRules(); $newHooksList = array( 'actionAdminProductsControllerSaveAfter', 'actionProductListOverride', 'moduleRoutes', 'actionObjectAddAfter', 'actionObjectUpdateAfter', 'actionObjectDeleteAfter', 'actionObjectLanguageAddAfter', 'displayAdvancedSearch4', 'actionShopDataDuplication', 'actionObjectShopDeleteAfter', ); if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $newHooksList[] = 'displayBeforeBodyClosingTag'; $newHooksList[] = 'productSearchProvider'; $newHooksList[] = 'displayNavFullWidth'; $newHooksList[] = 'actionAdminProductsControllerCoreSaveAfter'; } foreach ($newHooksList as $newHookName) { if (!$this->isRegisteredInHook($newHookName)) { $this->registerHook($newHookName); } } Configuration::updateValue('PM_' . self::$_module_prefix . '_LAST_VERSION', $this->version); if (!Configuration::getGlobalValue('PM_AS4_SECURE_KEY')) { Configuration::updateGlobalValue('PM_AS4_SECURE_KEY', Tools::strtoupper(Tools::passwdGen(16))); } if (!As4SearchEngine::getLocalStorageCacheKey()) { As4SearchEngine::setLocalStorageCacheKey(); } $this->installDB(); $config = $this->_getModuleConfiguration(); foreach ($this->_defaultConfiguration as $configKey => $configValue) { if (!isset($config[$configKey])) { $config[$configKey] = $configValue; } } $this->_setModuleConfiguration($config); $this->updateSearchTable($updateShopTable, $oldModuleVersion); $this->generateCss(); $this->pmClearCache(); if ($displayConfirm) { $this->context->controller->confirmations[] = $this->l('Module updated successfully'); } } return $isUpdate; } public function updateSearchTable($updateShopTable = false, $oldModuleVersion = false) { $advanced_searchs_id = As4SearchEngine::getSearchsId(false, false, false); $toAdd = array(); $toChange = array(); $toRemove = array(); $indexToAdd = array(); $primaryToAdd = array(); $toChange[] = array('pm_advancedsearch', 'id_hook', 'int(11) NOT NULL'); if (is_array($advanced_searchs_id) && count($advanced_searchs_id)) { foreach ($advanced_searchs_id as $idSearch) { $this->installDBCache($idSearch, false); $result = As4SearchEngineDb::queryNoCache('SHOW INDEX FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_product_price_' . (int)$idSearch . '` WHERE `column_name` = "id_criterion_group"'); if (self::_isFilledArray($result)) { As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_product_price_' . (int)$idSearch . '` DROP INDEX `id_product` , ADD INDEX `id_product` ( `id_currency` , `id_country` , `id_group` , `price` , `price_wt` , `from` , `to` ) '); } $result = As4SearchEngineDb::queryNoCache('SHOW INDEX FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_product_price_' . (int)$idSearch . '` WHERE `Key_name` = "PRIMARY" AND `Column_name` = "reduction_amount"'); $result2 = As4SearchEngineDb::queryNoCache('SHOW INDEX FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_product_price_' . (int)$idSearch . '` WHERE `Key_name` = "PRIMARY"'); if (!self::_isFilledArray($result) && self::_isFilledArray($result2)) { As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_product_price_' . (int)$idSearch . '` DROP PRIMARY KEY'); } $result = As4SearchEngineDb::queryNoCache('SHOW INDEX FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_criterion_' . (int)$idSearch . '` WHERE `key_name` = "id_criterion2"'); if (!self::_isFilledArray($result)) { As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_criterion_' . (int)$idSearch . '` ADD INDEX `id_criterion2` ( `id_criterion`)'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_criterion_' . (int)$idSearch . '` ADD INDEX `id_cache_product` ( `id_cache_product`)'); } $result = As4SearchEngineDb::queryNoCache('SHOW COLUMNS FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_product_price_' . (int)$idSearch . '` WHERE `Field` = "price"'); if (self::_isFilledArray($result)) { As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_product_price_' . (int)$idSearch . '` DROP `price`'); } $toAdd[] = array('pm_advancedsearch_criterion_' . (int)$idSearch, 'visible', 'tinyint(4) NOT NULL DEFAULT "1"', 'level_depth' ); $toAdd[] = array('pm_advancedsearch_criterion_' . (int)$idSearch, 'id_parent', 'int(10) unsigned DEFAULT NULL', 'level_depth' ); $toAdd[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch, 'show_all_depth', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'is_multicriteria' ); $toAdd[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch, 'only_children', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'is_multicriteria' ); $toAdd[] = array('pm_advancedsearch_criterion_group_'. (int)$idSearch,'hidden','tinyint(3) unsigned NOT NULL DEFAULT "0"'); $toAdd[] = array('pm_advancedsearch_criterion_group_'. (int)$idSearch,'range_nb','decimal(10,2) unsigned NOT NULL DEFAULT "15"'); $toAdd[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch, 'range', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'is_multicriteria' ); $toAdd[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch, 'sort_by', 'varchar(10) default "position"', 'is_multicriteria' ); $toAdd[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch, 'sort_way', 'varchar(4) default "ASC"', 'is_multicriteria' ); $toAdd[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch.'_lang', 'range_sign', 'varchar(32) default NULL', 'icon' ); $toAdd[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch.'_lang', 'range_interval', 'varchar(255) default NULL', 'icon' ); $toAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'reduction_amount', 'decimal(20,6) NOT NULL default "0"', 'price_wt' ); $toAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'is_specific', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'to' ); $toAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'id_shop', 'int(10) unsigned DEFAULT "0"', 'id_criterion_group' ); $toAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'id_specific_price', 'int(10) unsigned DEFAULT "0"', 'is_specific' ); $toAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'valid_id_specific_price', 'int(10) unsigned DEFAULT "0"', 'id_specific_price' ); $toAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'reduction_type', 'enum(\'amount\',\'percentage\')', 'reduction_amount' ); $toAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'has_no_specific', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'is_specific' ); $toAdd[] = array('pm_advancedsearch_criterion_' . (int)$idSearch, 'is_custom', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'visible' ); $toAdd[] = array('pm_advancedsearch_criterion_group_'. (int)$idSearch, 'filter_option','tinyint(3) unsigned NOT NULL DEFAULT "0"', 'is_multicriteria'); $toAdd[] = array('pm_advancedsearch_criterion_group_'. (int)$idSearch, 'is_combined','tinyint(3) unsigned NOT NULL DEFAULT "0"', 'filter_option'); $toAdd[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch.'_lang', 'all_label', 'varchar(255) default NULL'); $toAdd[] = array('pm_advancedsearch_criterion_group_'. (int)$idSearch, 'css_classes','varchar(255) DEFAULT "col-xs-12 col-sm-3"', 'max_display'); $toAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'reduction_tax', 'tinyint(1) unsigned NOT NULL DEFAULT "1"', 'reduction_type' ); $toAdd[] = array('pm_advancedsearch_criterion_group_'. (int)$idSearch . '_lang', 'url_identifier', 'varchar(255) DEFAULT NULL', 'name'); $toAdd[] = array('pm_advancedsearch_criterion_group_'. (int)$idSearch . '_lang', 'url_identifier_original', 'varchar(255) DEFAULT NULL', 'url_identifier'); $toAdd[] = array('pm_advancedsearch_criterion_'. (int)$idSearch . '_lang', 'url_identifier', 'varchar(255) DEFAULT NULL', 'value'); $toAdd[] = array('pm_advancedsearch_criterion_'. (int)$idSearch . '_lang', 'url_identifier_original', 'varchar(255) DEFAULT NULL', 'url_identifier'); $toAdd[] = array('pm_advancedsearch_criterion_'. (int)$idSearch . '_lang', 'decimal_value', 'decimal(20,6) DEFAULT NULL', 'value'); $toAdd[] = array('pm_advancedsearch_criterion_group_'. (int)$idSearch, 'context_type', 'tinyint(3) unsigned NOT NULL DEFAULT "2"', 'display_type'); $toChange[] = array('pm_advancedsearch_criterion_' . (int)$idSearch, 'position', 'int(10) unsigned DEFAULT "0"' ); $toChange[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch . '_lang', 'icon', 'varchar(32) NOT NULL'); $toChange[] = array('pm_advancedsearch_criterion_' . (int)$idSearch . '_lang', 'icon', 'varchar(32) NOT NULL'); $indexToAdd[] = array('pm_advancedsearch_criterion_' . (int)$idSearch . '_lang', 'value','`value`'); $indexToAdd[] = array('pm_advancedsearch_criterion_' . (int)$idSearch . '_lang', 'decimal_value','`decimal_value`'); $indexToAdd[] = array('pm_advancedsearch_criterion_' . (int)$idSearch . '_lang', 'url_identifier','`url_identifier`'); $indexToAdd[] = array('pm_advancedsearch_criterion_' . (int)$idSearch . '_lang', 'url_identifier_original','`url_identifier_original`'); $indexToAdd[] = array('pm_advancedsearch_criterion_' . (int)$idSearch, 'is_custom', '`is_custom`'); $indexToAdd[] = array('pm_advancedsearch_criterion_' . (int)$idSearch, 'gcfsb_1', '`id_criterion`, `id_criterion_group`, `visible`, `position`'); $indexToAdd[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch . '_lang', 'url_identifier','`url_identifier`'); $indexToAdd[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch . '_lang', 'url_identifier_original','`url_identifier_original`'); $indexToAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'is_specific','`is_specific`'); $indexToAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'valid_id_specific_price','`valid_id_specific_price`'); $indexToAdd[] = array('pm_advancedsearch_product_price_' . (int)$idSearch, 'has_no_specific','`has_no_specific`'); $indexToAdd[] = array('feature_value_lang', 'id_feature_value','`id_feature_value`'); $indexToAdd[] = array('feature_value_lang', 'id_lang','`id_lang`'); $indexToAdd[] = array('pm_advancedsearch', 'position', '`position`'); $primaryToAdd[] = array( 'pm_advancedsearch_criterion_group_' . (int)$idSearch.'_lang', '`id_criterion_group`, `id_lang`', 'id_criterion_group', ); $primaryToAdd[] = array( 'pm_advancedsearch_criterion_' . (int)$idSearch.'_lang', '`id_criterion`, `id_lang`', 'id_criterion', ); $primaryToAdd[] = array( 'pm_advancedsearch_cache_product_criterion_' . (int)$idSearch, '`id_criterion`, `id_cache_product`', 'id_criterion', ); $primaryToAdd[] = array( 'pm_advancedsearch_product_price_' . (int)$idSearch, '`id_cache_product` , `id_currency` , `id_country` , `id_group` , `price_wt` , `reduction_amount` , `from` , `to`', 'id_product', ); $toRemove[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch, 'is_collapsed'); $toRemove[] = array('pm_advancedsearch_criterion_group_' . (int)$idSearch, 'width'); } } $toAdd[] = array('pm_advancedsearch', 'keep_category_information', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'step_search' ); $toAdd[] = array('pm_advancedsearch', 'display_empty_criteria', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'step_search' ); $toAdd[] = array('pm_advancedsearch', 'recursing_indexing', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'step_search' ); $toAdd[] = array('pm_advancedsearch', 'search_results_selector', 'varchar(64) NOT NULL DEFAULT "#center_column"', 'step_search' ); $toAdd[] = array('pm_advancedsearch', 'smarty_var_name', 'varchar(64) NOT NULL', 'step_search' ); $toAdd[] = array('pm_advancedsearch', 'insert_in_center_column', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'step_search' ); $toAdd[] = array('pm_advancedsearch', 'reset_group', 'tinyint(3) unsigned NOT NULL DEFAULT "1"', 'step_search' ); $toAdd[] = array('pm_advancedsearch', 'unique_search', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'step_search' ); $toAdd[] = array('pm_advancedsearch', 'scrolltop_active', 'tinyint(3) unsigned NOT NULL DEFAULT "1"', 'unique_search' ); $toAdd[] = array('pm_advancedsearch', 'id_category_root', 'int(10) unsigned NOT NULL DEFAULT "0"', 'scrolltop_active' ); $toAdd[] = array('pm_advancedsearch', 'redirect_one_product', 'tinyint(3) unsigned NOT NULL DEFAULT "1"', 'id_category_root' ); $toAdd[] = array('pm_advancedsearch', 'add_anchor_to_url', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'redirect_one_product' ); $toAdd[] = array('pm_advancedsearch', 'step_search_next_in_disabled', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'step_search' ); $toAdd[] = array('pm_advancedsearch', 'position', 'smallint(4) unsigned NULL DEFAULT "0"', 'step_search_next_in_disabled' ); $toAdd[] = array('pm_advancedsearch', 'hide_criterions_group_with_no_effect', 'tinyint(3) unsigned NOT NULL DEFAULT "0"', 'step_search' ); $toAdd[] = array('pm_advancedsearch', 'css_classes','varchar(255) DEFAULT "col-xs-12"', 'internal_name'); $toAdd[] = array('pm_advancedsearch', 'search_results_selector_css','varchar(255) DEFAULT ""', 'css_classes'); $toChange[] = array('pm_advancedsearch_seo', 'criteria', 'TEXT NOT NULL' ); $toRemove[] = array('pm_advancedsearch', 'dynamic_criterion'); $toRemove[] = array('pm_advancedsearch', 'share'); $toRemove[] = array('pm_advancedsearch', 'collapsable_criterias'); $toRemove[] = array('pm_advancedsearch', 'width'); $toRemove[] = array('pm_advancedsearch', 'height'); $toRemove[] = array('pm_advancedsearch', 'background_color'); $toRemove[] = array('pm_advancedsearch', 'border_radius'); $toRemove[] = array('pm_advancedsearch', 'border_size'); $toRemove[] = array('pm_advancedsearch', 'border_color'); $toRemove[] = array('pm_advancedsearch', 'font_size_title'); $toRemove[] = array('pm_advancedsearch', 'color_group_title'); $toRemove[] = array('pm_advancedsearch', 'font_size_group_title'); $toRemove[] = array('pm_advancedsearch', 'color_title'); $toRemove[] = array('pm_advancedsearch', 'save_selection'); $primaryToAdd[] = array( 'pm_advancedsearch_seo_lang', '`id_seo`, `id_lang`', 'id_seo', ); $primaryToAdd[] = array( 'pm_advancedsearch_lang', '`id_search`, `id_lang`', 'id_search', ); $primaryToAdd[] = array( 'pm_advancedsearch_category', '`id_search`, `id_category`', 'id_search', ); $primaryToAdd[] = array( 'pm_advancedsearch_seo_crosslinks', '`id_seo`, `id_seo_linked`', 'id_seo', ); if (is_array($toAdd) && count($toAdd)) { foreach ($toAdd as $infos) { $this->columnExists($infos[0], $infos[1], true, $infos[2], (isset($infos[3]) ? $infos[3] : false)); } } if (is_array($toChange) && count($toChange)) { foreach ($toChange as $infos) { $resultset = As4SearchEngineDb::queryNoCache("SHOW COLUMNS FROM `" . bqSQL(_DB_PREFIX_ . $infos[0]) . "` WHERE `Field` = '" . pSQL($infos[1]) . "'"); foreach ($resultset as $row) { if ($row['Type'] != $infos[2]) { As4SearchEngineDb::execute('ALTER TABLE `' . bqSQL(_DB_PREFIX_ . $infos[0]) . '` CHANGE `' . bqSQL($infos[1]) . '` `' . bqSQL($infos[1]) . '` ' . $infos[2] . ''); } } } } if (is_array($indexToAdd) && count($indexToAdd)) { foreach ($indexToAdd as $infos) { $result = As4SearchEngineDb::queryNoCache('SHOW INDEX FROM `' . bqSQL(_DB_PREFIX_ . $infos[0]) . '` WHERE `Key_name` = "'.pSQL($infos[1]).'"'); if (!self::_isFilledArray($result)) { As4SearchEngineDb::execute('ALTER TABLE `' . bqSQL(_DB_PREFIX_ . $infos[0]) . '` ADD INDEX `' . bqSQL($infos[1]) . '` ( '.$infos[2].' )'); } } } if (is_array($primaryToAdd) && count($primaryToAdd)) { foreach ($primaryToAdd as $infos) { $result = As4SearchEngineDb::queryNoCache('SHOW INDEX FROM `' . bqSQL(_DB_PREFIX_ . $infos[0]) . '` WHERE `Key_name` = "PRIMARY"'); if (!self::_isFilledArray($result)) { if (isset($infos[2])) { $result = As4SearchEngineDb::queryNoCache('SHOW INDEX FROM `' . bqSQL(_DB_PREFIX_ . $infos[0]) . '` WHERE `column_name` = "'.pSQL($infos[2]).'"'); if (self::_isFilledArray($result)) { As4SearchEngineDb::execute('ALTER TABLE `' . bqSQL(_DB_PREFIX_ . $infos[0]) . '` DROP INDEX `'.bqSQL($infos[2]).'`'); } } As4SearchEngineDb::execute('ALTER TABLE `' . bqSQL(_DB_PREFIX_ . $infos[0]) . '` ADD PRIMARY KEY ('.$infos[1].')'); } } } if (is_array($toRemove) && count($toRemove)) { foreach ($toRemove as $infos) { if ($this->columnExists($infos[0], $infos[1])) { As4SearchEngineDb::execute('ALTER TABLE `' . bqSQL(_DB_PREFIX_ . $infos[0]) . '` DROP `'.bqSQL($infos[1]).'`'); } } } $seo = AdvancedSearchSeoClass::getSeoSearchs(false, true); $seo_url_updated = false; foreach ($seo as $row) { if (preg_match('#\{i:#', $row['criteria'])) { break; } $newCriteria = array(); $criteria = explode(',', $row['criteria']); if (count($criteria)) { foreach ($criteria as $value) { if (preg_match('/~/', $value)) { $id_criterion_group = AdvancedSearchCriterionGroupClass::getIdCriterionGroupByTypeAndIdLinked($row['id_search'], 'price', 0); } else { $id_criterion_group = AdvancedSearchCriterionClass::getIdCriterionGroupByIdCriterion($row['id_search'], $value); } if (!$id_criterion_group) { continue; } $newCriteria[] = $id_criterion_group.'_'.$value; } } if (count($newCriteria)) { $row['criteria'] = serialize($newCriteria); Db::getInstance()->update('pm_advancedsearch_seo', $row, 'id_seo = ' . (int)$row['id_seo']); if ($seo_url_updated) { As4SearchEngineDb::execute('UPDATE `' . _DB_PREFIX_ . 'pm_advancedsearch_seo_lang` SET `seo_url` = REPLACE(`seo_url`,"/","-")'); $seo_url_updated = true; } } } if ($updateShopTable) { $result = As4SearchEngineDb::query('SELECT * FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_shop` ORDER BY `id_search` , `id_shop`'); if ($result && self::_isFilledArray($result)) { $first_shop = array(); foreach ($result as $row) { if (!isset($first_shop[$row['id_search']])) { $first_shop[$row['id_search']] = $row['id_shop']; } else { continue; } } foreach ($first_shop as $id_search => $id_shop) { As4SearchEngineDb::execute('DELETE FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_shop` WHERE `id_search`='.(int)$id_search.' AND `id_shop`!='.(int)$id_shop); } } } if ($oldModuleVersion !== false && version_compare($oldModuleVersion, '4.10.0', '<=')) { $result = As4SearchEngineDb::query('SELECT * FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_seo`'); if ($result && self::_isFilledArray($result)) { foreach ($result as $row) { $criteria = unserialize($row['criteria']); $newSeoKey = As4SearchEngineSeo::getSeoKeyFromCriteria($row['id_search'], $criteria, $row['id_currency']); if ($newSeoKey != $row['seo_key']) { As4SearchEngineDb::execute('UPDATE `' . _DB_PREFIX_ . 'pm_advancedsearch_seo` SET `seo_key`="' . pSQL($newSeoKey) . '" WHERE id_seo="' . (int)$row['id_seo'] . '"'); } } } } if ($oldModuleVersion !== false && version_compare($oldModuleVersion, '4.10.1', '<=')) { if (is_array($advanced_searchs_id) && sizeof($advanced_searchs_id)) { foreach ($advanced_searchs_id as $idSearch) { $result = As4SearchEngineDb::queryNoCache('SHOW COLUMNS FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '` WHERE `Field` = "id_criterion_linked"'); if (self::_isFilledArray($result)) { if (As4SearchEngineDb::execute('INSERT IGNORE INTO `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int)$idSearch.'_link` (`id_criterion`, `id_criterion_linked`) (SELECT `id_criterion`, `id_criterion_linked` FROM `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int)$idSearch.'`)')) { As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '` DROP `id_criterion_linked`'); } } $criterionsCount = (int)As4SearchEngineDb::value('SELECT COUNT(*) FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '`'); $criterionsListCount = (int)As4SearchEngineDb::value('SELECT COUNT(*) FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '_list`'); if ($criterionsCount > 0 && $criterionsListCount == 0) { As4SearchEngineDb::execute('INSERT IGNORE INTO `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int)$idSearch.'_list` (`id_criterion_parent`, `id_criterion`) (SELECT `id_criterion` AS `id_criterion_parent`, `id_criterion` FROM `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int)$idSearch.'`)'); } $result = As4SearchEngineDb::queryNoCache('SHOW COLUMNS FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '` WHERE `Field` = "criterions_list"'); if (self::_isFilledArray($result)) { $result = As4SearchEngineDb::query('SELECT `id_criterion`, `criterions_list` FROM `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int)$idSearch.'`'); if ($result && self::_isFilledArray($result)) { foreach ($result as $criterionRow) { if ($criterionRow['criterions_list'] != '' && !empty($criterionRow['criterions_list'])) { $criterionRow['criterions_list'] = array_unique(explode(',', $criterionRow['criterions_list'])); if (self::_isFilledArray($criterionRow['criterions_list'])) { foreach ($criterionRow['criterions_list'] as $k => $idCriterionToAdd) { if (empty($idCriterionToAdd) || !is_numeric($idCriterionToAdd)) { unset($criterionRow['criterions_list'][$k]); } } } } if (self::_isFilledArray($criterionRow['criterions_list'])) { $idCriterionToAddList = array(); foreach ($criterionRow['criterions_list'] as $idCriterionToAdd) { $idCriterionToAddList[] = (int)$idCriterionToAdd; AdvancedSearchCriterionClass::addCriterionToList((int)$idSearch, $criterionRow['id_criterion'], $idCriterionToAdd); } AdvancedSearchCriterionClass::populateCriterionsLink((int)$idSearch, $criterionRow['id_criterion'], false, $idCriterionToAddList); } else { AdvancedSearchCriterionClass::addCriterionToList((int)$idSearch, $criterionRow['id_criterion'], $criterionRow['id_criterion']); } } } As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '` DROP `criterions_list`'); } } } } if (version_compare($oldModuleVersion, '4.10.6', '<=')) { As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_shop` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_category` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_cms` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_products` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_manufacturers` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_suppliers` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_special_pages` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_seo` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_seo_crosslinks` DEFAULT CHARACTER SET=latin1'); if (is_array($advanced_searchs_id) && sizeof($advanced_searchs_id)) { foreach ($advanced_searchs_id as $idSearch) { As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_group_' . (int)$idSearch . '` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_criterion_' . (int)$idSearch . '` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_' . (int)$idSearch . '` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_product_price_' . (int)$idSearch . '` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '_link` DEFAULT CHARACTER SET=latin1'); As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '_list` DEFAULT CHARACTER SET=latin1'); } } } if (version_compare($oldModuleVersion, '4.11.0', '<')) { if (is_array($advanced_searchs_id) && sizeof($advanced_searchs_id)) { $result = As4SearchEngineDb::queryNoCache('SHOW COLUMNS FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '` WHERE `Field` = "single_value"'); if (self::_isFilledArray($result)) { foreach ($advanced_searchs_id as $idSearch) { foreach (Language::getLanguages(false) as $row_lang) { As4SearchEngineDb::execute(' INSERT IGNORE INTO `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '_lang` ( SELECT id_criterion, "' . (int)$row_lang['id_lang'] . '" as id_lang, single_value as value, 0 as decimal_value, "" as url_identifier, "" as url_identifier_original, "" as icon FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '` WHERE single_value!="" ) '); } As4SearchEngineDb::execute('ALTER TABLE `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '` DROP `single_value`'); } } foreach ($advanced_searchs_id as $idSearch) { As4SearchEngineDb::execute(' UPDATE `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '_lang` SET `decimal_value`=CAST(REPLACE(`value`, ",", ".") AS DECIMAL(20,6)) '); } foreach ($advanced_searchs_id as $idSearch) { As4SearchEngineDb::execute(' UPDATE `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_group_' . (int)$idSearch . '_lang` SET `url_identifier` = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(`name`), "-", "_"), "/", "_"), " ", "_"), "\'", "_"), "\"", "_"), "&", "_"), "%", "_"), ":", "_"), `url_identifier_original` = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(`name`), "-", "_"), "/", "_"), " ", "_"), "\'", "_"), "\"", "_"), "&", "_"), "%", "_"), ":", "_") '); As4SearchEngineDb::execute(' UPDATE `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int)$idSearch . '_lang` SET `url_identifier` = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(`value`), "-", "_"), "/", "_"), " ", "_"), "\'", "_"), "\"", "_"), "&", "_"), "%", "_"), ":", "_"), `url_identifier_original` = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(`value`), "-", "_"), "/", "_"), " ", "_"), "\'", "_"), "\"", "_"), "&", "_"), "%", "_"), ":", "_") '); } } } } private function columnExists($table, $column, $createIfNotExist = false, $type = false, $insertAfter = false) { $resultset = As4SearchEngineDb::queryNoCache("SHOW COLUMNS FROM `" . bqSQL(_DB_PREFIX_ . $table) . "`"); foreach ($resultset as $row) { if ($row['Field'] == $column) { return true; } } if ($createIfNotExist && As4SearchEngineDb::execute('ALTER TABLE `' . bqSQL(_DB_PREFIX_ . $table) . '` ADD `' . bqSQL($column) . '` ' . $type . ' ' . ($insertAfter ? ' AFTER `' . bqSQL($insertAfter) . '`' : '') . '')) { return true; } return false; } public function updateAdvancedStyles($css_styles) { if (Shop::isFeatureActive()) { Configuration::updateGlobalValue('PM_'.self::$_module_prefix.'_ADVANCED_STYLES', self::getDataSerialized($css_styles)); } else { Configuration::updateValue('PM_'.self::$_module_prefix.'_ADVANCED_STYLES', self::getDataSerialized($css_styles)); } $this->generateCss(); } public function getAdvancedStylesDb() { if (Shop::isFeatureActive()) { $advanced_css_file_db = Configuration::getGlobalValue('PM_'.self::$_module_prefix.'_ADVANCED_STYLES'); } else { $advanced_css_file_db = Configuration::get('PM_'.self::$_module_prefix.'_ADVANCED_STYLES'); } if ($advanced_css_file_db !== false) { return self::getDataUnserialized($advanced_css_file_db); } return false; } public function displayAdvancedConfig() { if (Shop::isFeatureActive()) { $advanced_css_file = str_replace('.css', '-'.$this->context->shop->id.'.css', dirname(__FILE__) . '/' . self::ADVANCED_CSS_FILE); } else { $advanced_css_file = dirname(__FILE__) . '/' . self::ADVANCED_CSS_FILE; } if ($this->getAdvancedStylesDb() == false) { if (Tools::file_exists_cache($advanced_css_file) && is_readable($advanced_css_file) && Tools::strlen(Tools::file_get_contents($advanced_css_file)) > 0) { $this->updateAdvancedStyles(Tools::file_get_contents($advanced_css_file)); } else { $this->updateAdvancedStyles("/* Advanced Search 4 - Advanced Styles Content */\n"); } } $vars = array( 'advanced_styles' => $this->getAdvancedStylesDb() ); return $this->fetchTemplate('module/tabs/advanced_styles.tpl', $vars); } public function displayMaintenance() { $advanced_searchs_id = As4SearchEngine::getSearchsId(false, $this->context->shop->id); $criteriaGroupToReindex = array(); if (self::_isFilledArray($advanced_searchs_id)) { $key = 0; foreach ($advanced_searchs_id as $idSearch) { $criterions_groups_indexed = As4SearchEngineIndexation::getCriterionsGroupsIndexed($idSearch, (int)$this->context->language->id, false); if (self::_isFilledArray($criterions_groups_indexed)) { foreach ($criterions_groups_indexed as $criterions_group_indexed) { $criteriaGroupToReindex[$key] = array( 'id_search' => (int)$idSearch, 'id_criterion_group' => (int)$criterions_group_indexed['id_criterion_group'], ); $key++; } } } } $vars = array( 'groups_to_reindex' => $criteriaGroupToReindex, ); return $this->fetchTemplate('module/tabs/maintenance.tpl', $vars); } public function generateCss() { $advanced_searchs = As4SearchEngine::getAllSearchs((int)$this->context->language->id, false, false); $css = array(); foreach ($advanced_searchs as $advanced_search) { $criterions_groups_indexed = As4SearchEngineIndexation::getCriterionsGroupsIndexed($advanced_search['id_search'], (int)$this->context->language->id); if (self::_isFilledArray($criterions_groups_indexed)) { foreach ($criterions_groups_indexed as $criterions_group) { if ($advanced_search['show_hide_crit_method'] == 3 && $criterions_group['overflow_height']) { $css[] = '#PM_ASCriterions_' . $advanced_search['id_search'] . '_' . $criterions_group['id_criterion_group'] . ' .PM_ASCriterionsGroupOuter {overflow:auto;max-height:' . (int)$criterions_group['overflow_height'] . 'px;}'; } } } } $advanced_styles = "\n".$this->getAdvancedStylesDb(); if (is_writable(dirname(__FILE__) . '/views/css/') && is_writable(dirname(__FILE__) . '/' . self::DYN_CSS_FILE)) { if (sizeof($css)) { file_put_contents(dirname(__FILE__) . '/' . self::DYN_CSS_FILE, implode(" ", $css).$advanced_styles); } else { file_put_contents(dirname(__FILE__) . '/' . self::DYN_CSS_FILE, ''.$advanced_styles); } } else { if (!is_writable(dirname(__FILE__) . '/views/css/')) { $this->errors[] = $this->_showWarning($this->l('Please set write permision to folder:'). ' '.dirname(__FILE__) . '/views/css/'); } if (!is_writable(dirname(__FILE__) . '/' . self::DYN_CSS_FILE)) { $this->errors[] = $this->l('Please set write permision to file:'). ' '.dirname(__FILE__) . '/' . self::DYN_CSS_FILE; } } } public function getCriterionUnitByType($criterionGroupType) { foreach ($this->getCriterionsGroupsValue() as $groupUnit => $groups) { foreach ($groups as $group) { if ($group['type'] == $criterionGroupType) { return $groupUnit; } } } return false; } public function getCriterionUnitTranslations() { return array( 'associations' => $this->l('Product associations'), 'attribute' => $this->l('Product attributes'), 'feature' => $this->l('Product features'), 'product_properties' => $this->l('Product properties'), 'shipping' => $this->l('Product package'), ); } public function getCriterionsGroupsValue() { static $criterions_groups = null; if ($criterions_groups !== null) { return $criterions_groups; } $id_lang = (int)$this->context->language->id; $criterions_groups = array(); $criterions_groups['associations'][] = array('id' => 0, 'name' => $this->l('All category levels'), 'type' => 'category'); $criterions_groups['associations'][] = array('id' => 0, 'name' => $this->l('Subcategories'), 'type' => 'subcategory'); $categories_level_depth = As4SearchEngineIndexation::getAvailableCategoriesLevelDepth(); foreach ($categories_level_depth as $category_level_depth) { $criterions_groups['associations'][] = array('id' => $category_level_depth['level_depth'], 'name' => $this->l('Categories level') . ' ' . $category_level_depth['level_depth'], 'type' => 'category'); } $criterions_groups['associations'][] = array('id' => 0, 'name' => (version_compare(_PS_VERSION_, '1.7.0.0', '>=') ? $this->l('Brand') : $this->l('Manufacturer')), 'type' => 'manufacturer'); $criterions_groups['associations'][] = array('id' => 0, 'name' => $this->l('Supplier'), 'type' => 'supplier'); $attributes_groups = As4SearchEngineIndexation::getAvailableAttributesGroups($id_lang); foreach ($attributes_groups as $row) { $criterions_groups['attribute'][] = array('id' => $row['id_attribute_group'], 'name' => $row['public_name'], 'internal_name' => (!empty($row['name']) ? $row['name'] : ''), 'type' => 'attribute'); } $features = As4SearchEngineIndexation::getAvailableFeaturesGroups($id_lang); foreach ($features as $row) { $criterions_groups['feature'][] = array('id' => $row['id_feature'], 'name' => $row['name'], 'type' => 'feature'); } $criterions_groups['product_properties'][] = array('id' => 0, 'name' => $this->l('Price'), 'type' => 'price'); $criterions_groups['product_properties'][] = array('id' => 0, 'name' => $this->l('Prices drop'), 'type' => 'prices_drop'); $criterions_groups['product_properties'][] = array('id' => 0, 'name' => $this->l('On sale'), 'type' => 'on_sale'); $criterions_groups['product_properties'][] = array('id' => 0, 'name' => $this->l('New products'), 'type' => 'new_products'); $ap5ModuleInstance = Module::getInstanceByName('pm_advancedpack'); if (Validate::isLoadedObject($ap5ModuleInstance)) { $criterions_groups['product_properties'][] = array('id' => 0, 'name' => $this->l('Is a pack'), 'type' => 'pack'); } $criterions_groups['product_properties'][] = array('id' => 0, 'name' => $this->l('In stock'), 'type' => 'stock'); $criterions_groups['product_properties'][] = array('id' => 0, 'name' => $this->l('Available for order'), 'type' => 'available_for_order'); $criterions_groups['product_properties'][] = array('id' => 0, 'name' => $this->l('Online only'), 'type' => 'online_only'); $criterions_groups['product_properties'][] = array('id' => 0, 'name' => $this->l('Condition'), 'type' => 'condition'); $criterions_groups['shipping'][] = array('id' => 0, 'name' => $this->l('Width'), 'type' => 'width'); $criterions_groups['shipping'][] = array('id' => 0, 'name' => $this->l('Height'), 'type' => 'height'); $criterions_groups['shipping'][] = array('id' => 0, 'name' => $this->l('Depth'), 'type' => 'depth'); $criterions_groups['shipping'][] = array('id' => 0, 'name' => $this->l('Weight'), 'type' => 'weight'); return $criterions_groups; } private function _postProcessSearch() { $id_search = Tools::getValue('id_search', false); $ObjAdvancedSearchClass = new AdvancedSearchClass($id_search); $reindexing_categories = false; $this->_cleanOutput(true); $this->errors = self::_retroValidateController($ObjAdvancedSearchClass); if ($id_search && Tools::getValue('recursing_indexing') != $ObjAdvancedSearchClass->recursing_indexing) { $reindexing_categories = true; } if (!sizeof($this->errors)) { $this->copyFromPost($ObjAdvancedSearchClass); if (empty($ObjAdvancedSearchClass->internal_name) || trim($ObjAdvancedSearchClass->internal_name) == '') { $ObjAdvancedSearchClass->internal_name = ' '; } $ObjAdvancedSearchClass->remind_selection = 0; if (Tools::getValue('remind_selection_results') && Tools::getValue('remind_selection_block')) { $ObjAdvancedSearchClass->remind_selection = 3; } elseif (Tools::getValue('remind_selection_results') && !Tools::getValue('remind_selection_block')) { $ObjAdvancedSearchClass->remind_selection = 1; } elseif (!Tools::getValue('remind_selection_results') && Tools::getValue('remind_selection_block')) { $ObjAdvancedSearchClass->remind_selection = 2; } if (version_compare(_PS_VERSION_, '1.7.0.0', '>=') && Tools::getValue('id_hook_widget') && $ObjAdvancedSearchClass->id_hook == -2) { $ObjAdvancedSearchClass->id_hook = (int)Tools::getValue('id_hook_widget'); } if (!$ObjAdvancedSearchClass->save()) { $this->errors[] = $this->l('Error while saving'); } if (!sizeof($this->errors)) { if (!$id_search) { if (!$this->installDBCache($ObjAdvancedSearchClass->id)) { $this->errors[] = $this->l('Error while making cache table'); } if (!sizeof($this->errors) && !As4SearchEngineIndexation::addCacheProduct($ObjAdvancedSearchClass->id)) { $this->errors[] = $this->l('Error while creating products index'); } } else { if (!As4SearchEngineIndexation::updateCacheProduct($id_search)) { $this->errors[] = $this->l('Error while creating products index'); } } if (trim($ObjAdvancedSearchClass->internal_name) == '') { $ObjAdvancedSearchClass->internal_name = $this->l('Search engine') . ' ' . $ObjAdvancedSearchClass->id; $ObjAdvancedSearchClass->save(); } As4SearchEngineIndexation::indexFilterByEmplacement($ObjAdvancedSearchClass->id); if ($reindexing_categories) { As4SearchEngineIndexation::reindexingCategoriesGroups($ObjAdvancedSearchClass); } $this->generateCss(); self::clearSmartyCache((int)$ObjAdvancedSearchClass->id); $this->_html .= ''; } } $this->_displayErrorsJs(true); $this->_echoOutput(true); } private function _postProcessSearchVisibility() { $id_search = Tools::getValue('id_search', false); $ObjAdvancedSearchClass = new AdvancedSearchClass($id_search); $this->_cleanOutput(true); $this->errors = self::_retroValidateController($ObjAdvancedSearchClass); if (!sizeof($this->errors)) { $this->copyFromPost($ObjAdvancedSearchClass); if (Tools::getValue('bool_cat')) { $ObjAdvancedSearchClass->categories_association = Tools::getValue('categories_association'); } else { $ObjAdvancedSearchClass->categories_association = array(); } if (Tools::getValue('bool_prod')) { $ObjAdvancedSearchClass->products_association = Tools::getValue('products_association'); } else { $ObjAdvancedSearchClass->products_association = array(); } if (Tools::getValue('bool_cat_prod')) { $ObjAdvancedSearchClass->product_categories_association = Tools::getValue('product_categories_association'); } else { $ObjAdvancedSearchClass->product_categories_association = array(); } if (Tools::getValue('bool_manu')) { $ObjAdvancedSearchClass->manufacturers_association = Tools::getValue('manufacturers_association'); } else { $ObjAdvancedSearchClass->manufacturers_association = array(); } if (Tools::getValue('bool_supp')) { $ObjAdvancedSearchClass->suppliers_association = Tools::getValue('suppliers_association'); } else { $ObjAdvancedSearchClass->suppliers_association = array(); } if (Tools::getValue('bool_cms')) { $ObjAdvancedSearchClass->cms_association = Tools::getValue('cms_association'); } else { $ObjAdvancedSearchClass->cms_association = array(); } if (Tools::getValue('bool_spe')) { $ObjAdvancedSearchClass->special_pages_association = Tools::getValue('special_pages_association'); } else { $ObjAdvancedSearchClass->special_pages_association = array(); } if (!$ObjAdvancedSearchClass->save()) { $this->errors[] = $this->l('Error while saving'); } if (!sizeof($this->errors)) { self::clearSmartyCache((int)$ObjAdvancedSearchClass->id); $this->_html .= ''; } } $this->_displayErrorsJs(true); $this->_echoOutput(true); } private function _postProcessCriteria() { $id_search = Tools::getValue('id_search', false); $id_criterion = Tools::getValue('id_criterion', false); $key_criterions_group = Tools::getValue('key_criterions_group', false); $return = ''; if (!$id_search || !$id_criterion) { $return .= ''; } else { $objAdvancedSearchCriterionClass = new AdvancedSearchCriterionClass($id_criterion, $id_search); $update = $this->_uploadImageLang($objAdvancedSearchCriterionClass, 'icon', '/modules/pm_advancedsearch4/search_files/criterions/', '-' . $id_search); if (is_array($update) && sizeof($update)) { foreach ($update as $error) { $return .= ''; } } elseif ($update) { $objAdvancedSearchCriterionClass->save(); } $return .= ' '; } self::_cleanBuffer(); echo $return; die(); } private function _postProcessSeoSearch() { $id_search = Tools::getValue('id_search', false); $id_seo = Tools::getValue('id_seo', false); $id_currency = Tools::getValue('id_currency', false); if (!$id_currency) { $id_currency = Configuration::get('PS_CURRENCY_DEFAULT'); } self::_cleanBuffer(); $return = ''; if (!$id_search) { $return .= ''; } else { $seo_key = As4SearchEngineSeo::getSeoKeyFromCriteria($id_search, explode(',', Tools::getValue('criteria')), $id_currency); if (!$id_seo) { $id_seo = AdvancedSearchSeoClass::seoDeletedExists($seo_key); } if (!$id_seo && AdvancedSearchSeoClass::seoExists($seo_key)) { $return .= ''; } else { $objAdvancedSearchSeoClass = new AdvancedSearchSeoClass($id_seo); $this->copyFromPost($objAdvancedSearchSeoClass); $objAdvancedSearchSeoClass->seo_key = $seo_key; $objAdvancedSearchSeoClass->deleted = 0; $error = $objAdvancedSearchSeoClass->validateFields(false, true); $errorLang = $objAdvancedSearchSeoClass->validateFieldsLang(false, true); if ($error !== true) { $return .= ''; } if ($errorLang !== true) { $return .= ''; } elseif ($objAdvancedSearchSeoClass->save()) { $return .= ''; } else { $return .= ''; } } } echo $return; die(); } public function getSeoStrings($criteria, $id_search, $id_currency, $fields_to_get = false) { $fieldToFill = array('meta_title', 'meta_description', 'meta_keywords', 'title', 'seo_url' ); $fieldWithGroupName = array('meta_title', 'meta_description' ); $groupTypeWithoutGroupName = array('category', 'supplier', 'manufacturer' ); $offersSelectionStr = $this->translateMultiple('offers_selection'); $betweenLangStr = $this->translateMultiple('from'); $andLangStr = $this->translateMultiple('to'); $moreThanLangStr = $this->translateMultiple('more_than'); $defaultReturnSeoStr = array(); $newCriteria = array(); foreach ($criteria as $value) { $info_criterion = explode('_', $value); if (isset($info_criterion[2])) { $id_criterion_group = $info_criterion[1]; $id_criterion = $info_criterion[2]; } else { $id_criterion_group = $info_criterion[0]; $id_criterion = $info_criterion[1]; } if (!isset($newCriteria[$id_criterion_group])) { $newCriteria[$id_criterion_group] = array(); } $newCriteria[$id_criterion_group][] = $id_criterion; } foreach ($this->_languages as $language) { foreach ($criteria as $k => $criterion) { $endLoop = (($k + 1) == sizeof($criteria)); $info_criterion = explode('_', $criterion); if (isset($info_criterion[2])) { $id_criterion_group = $info_criterion[1]; $id_criterion = $info_criterion[2]; } else { $id_criterion_group = $info_criterion[0]; $id_criterion = $info_criterion[1]; } $objAdvancedSearchCriterionGroupClass = new AdvancedSearchCriterionGroupClass($id_criterion_group, $id_search); if (preg_match('#~#', $id_criterion)) { $range = explode('~', $id_criterion); $min = $range[0]; if ($objAdvancedSearchCriterionGroupClass->criterion_group_type == 'price') { $currency = new Currency($id_currency); if (!empty($range[1])) { $max = Tools::displayPrice($range[1], (Validate::isLoadedObject($currency) ? $currency : null)); $criterion_value = $betweenLangStr[$language['id_lang']] . ' ' . $min . ' ' . $andLangStr[$language['id_lang']] . ' ' . $max; } else { $min = Tools::displayPrice($min, (Validate::isLoadedObject($currency) ? $currency : null)); $criterion_value = $moreThanLangStr[$language['id_lang']] . ' ' . $min; } } else { if (!empty($range[1])) { $max = (float)$range[1] . (!empty($objAdvancedSearchCriterionGroupClass->range_sign[$language['id_lang']]) ? ' ' . $objAdvancedSearchCriterionGroupClass->range_sign[$language['id_lang']] : ''); $criterion_value = $betweenLangStr[$language['id_lang']] . ' ' . $min . ' ' . $andLangStr[$language['id_lang']] . ' ' . $max; } else { $min = (float)$min . (!empty($objAdvancedSearchCriterionGroupClass->range_sign[$language['id_lang']]) ? ' ' . $objAdvancedSearchCriterionGroupClass->range_sign[$language['id_lang']] : ''); $criterion_value = $moreThanLangStr[$language['id_lang']] . ' ' . $min; } } } else { $objAdvancedSearchCriterionClass = new AdvancedSearchCriterionClass($id_criterion, $id_search, $language['id_lang']); $criterion_value = trim($objAdvancedSearchCriterionClass->value); } foreach ($fieldToFill as $field) { if ($fields_to_get && ! in_array($field, $fields_to_get)) { continue; } if (!isset($defaultReturnSeoStr[$language['id_lang']])) { $defaultReturnSeoStr[$language['id_lang']] = array(); } if (!isset($defaultReturnSeoStr[$language['id_lang']][$field])) { $defaultReturnSeoStr[$language['id_lang']][$field] = ''; } if (!$k && $field == 'meta_description') { $defaultReturnSeoStr[$language['id_lang']][$field] .= Configuration::get('PS_SHOP_NAME') . ' ' . $offersSelectionStr[$language['id_lang']] . ' '; } if ($objAdvancedSearchCriterionGroupClass->criterion_group_type != 'price' && in_array($field, $fieldWithGroupName) and ! in_array($objAdvancedSearchCriterionGroupClass->criterion_group_type, $groupTypeWithoutGroupName)) { $defaultReturnSeoStr[$language['id_lang']][$field] .= $objAdvancedSearchCriterionGroupClass->name[$language['id_lang']] . ' '; } if ($field == 'seo_url') { $defaultReturnSeoStr[$language['id_lang']][$field] .= Tools::str2url($criterion_value) . (!$endLoop ? '-' : ''); } else { $defaultReturnSeoStr[$language['id_lang']][$field] .= $criterion_value . (!$endLoop && ($field == 'meta_title' || $field == 'meta_description' || $field == 'meta_keywords') ? ', ' : ($endLoop ? '' : ' ')); } } } } return $defaultReturnSeoStr; } private function _cartesianReOrder($array) { $current = array_shift($array); if (count($array) > 0) { $results = array(); $temp = $this->_cartesianReOrder($array); foreach ($current as $value) { foreach ($temp as $value2) { $results[] = $value . ',' . $value2; } } return $results; } else { return $current; } } public static function getArrayCriteriaFromSeoArrayCriteria($criteria) { $newCriteria = array(); foreach ($criteria as $value) { $info_criterion = explode('_', $value); if (isset($info_criterion[2])) { $id_criterion_group = (int)$info_criterion[1]; $id_criterion = $info_criterion[2]; } else { $id_criterion_group = (int)$info_criterion[0]; $id_criterion = $info_criterion[1]; } $id_criterion = preg_replace('/[^0-9.,-~]/', '', $id_criterion); if (!isset($newCriteria[$id_criterion_group])) { $newCriteria[$id_criterion_group] = array(); } $newCriteria[$id_criterion_group][] = $id_criterion; } return $newCriteria; } private function countProductFromSeoCriteria($id_search, $criteria, $id_currency) { if (self::_isFilledArray($criteria) && $criteria[0]) { $selected_criteria_groups_type = array(); $newCriteria = self::getArrayCriteriaFromSeoArrayCriteria($criteria); if (sizeof($newCriteria)) { $selected_criteria_groups_type = As4SearchEngine::getCriterionGroupsTypeAndDisplay($id_search, array_keys($newCriteria)); } $search = As4SearchEngine::getSearch($id_search, (int)$this->context->language->id, false); $search = $search[0]; $resultTotalProducts = As4SearchEngineDb::row(As4SearchEngine::getQueryCountResults($search, (int)$this->context->language->id, $newCriteria, $selected_criteria_groups_type, $id_currency)); } $total_product = isset($resultTotalProducts) ? $resultTotalProducts['total'] : 0; return $total_product; } private function _postProcessMassSeoSearch() { $id_search = Tools::getValue('id_search', false); $id_currency = Tools::getValue('id_currency', false); if (!$id_currency) { $id_currency = Configuration::get('PS_CURRENCY_DEFAULT'); } self::_cleanBuffer(); $return = ''; if (!$id_search) { $return .= ''; } else { $criteria_groups = explode(',', Tools::getValue('criteria_groups', '')); $criteria = Tools::getValue('criteria', false); $seoIds = array(); if (!sizeof($criteria_groups) || ! sizeof($criteria)) { $return .= ''; } else { $criteria_reorder = array(); foreach ($criteria_groups as $key_criterion_group) { $id_criterion_group = self::parseInt($key_criterion_group); if (isset($criteria[$id_criterion_group]) && sizeof($criteria[$id_criterion_group])) { $criteria_reorder[] = $criteria[$id_criterion_group]; } } $criteria_cartesian = $this->_cartesianReOrder($criteria_reorder); foreach ($criteria_cartesian as $criteria_final_str) { $criteria_final = explode(',', $criteria_final_str); $resultTotalProducts = $this->countProductFromSeoCriteria($id_search, $criteria_final, $id_currency); if (!$resultTotalProducts) { continue; } $seo_key = As4SearchEngineSeo::getSeoKeyFromCriteria($id_search, $criteria_final, $id_currency); $cur_id_seo = AdvancedSearchSeoClass::seoDeletedExists($seo_key); if ($cur_id_seo) { AdvancedSearchSeoClass::undeleteSeoBySeoKey($seo_key); } if (!$cur_id_seo && AdvancedSearchSeoClass::seoExists($seo_key)) { continue; } $defaultReturnSeoStr = $this->getSeoStrings($criteria_final, $id_search, $id_currency); $objAdvancedSearchSeoClass = new AdvancedSearchSeoClass($cur_id_seo); $objAdvancedSearchSeoClass->id_search = $id_search; $objAdvancedSearchSeoClass->criteria = $criteria_final_str; $objAdvancedSearchSeoClass->seo_key = $seo_key; foreach ($defaultReturnSeoStr as $id_lang => $fields) { foreach ($fields as $field => $fieldValue) { $objAdvancedSearchSeoClass->{$field}[$id_lang] = $fieldValue; } } $error = $objAdvancedSearchSeoClass->validateFields(false, true); $errorLang = $objAdvancedSearchSeoClass->validateFieldsLang(false, true); if ($error !== true) { $return .= ''; } elseif ($errorLang !== true) { $return .= ''; } else { $objAdvancedSearchSeoClass->save(); $seoIds[] = $objAdvancedSearchSeoClass->id; } } if (Tools::getValue('massSeoSearchCrossLinks', true) && sizeof($seoIds)) { foreach ($seoIds as $id_seo) { foreach ($seoIds as $id_seo2) { if ($id_seo == $id_seo2) { continue; } $row = array('id_seo' => (int)$id_seo, 'id_seo_linked' => (int)$id_seo2); Db::getInstance()->insert('pm_advancedsearch_seo_crosslinks', $row); } } } $return .= ''; } } echo $return; die(); } private function _postProcessSeoRegenerate() { $id_search = Tools::getValue('id_search', false); $fields_to_regenerate = Tools::getValue('fields_to_regenerate', false); self::_cleanBuffer(); if (!$id_search) { $this->_html .= ''; } if (!$fields_to_regenerate || ! sizeof($fields_to_regenerate)) { $this->_html .= ''; } else { $seoSearchs = AdvancedSearchSeoClass::getSeoSearchs((int)$this->context->language->id, false, $id_search); foreach ($seoSearchs as $row) { $defaultReturnSeoStr = $this->getSeoStrings(unserialize($row['criteria']), $id_search, $row['id_currency'], $fields_to_regenerate); if ($defaultReturnSeoStr && is_array($defaultReturnSeoStr) && sizeof($defaultReturnSeoStr)) { $objAdvancedSearchSeoClass = new AdvancedSearchSeoClass($row['id_seo']); $objAdvancedSearchSeoClass->id_search = $id_search; foreach ($defaultReturnSeoStr as $id_lang => $fields) { foreach ($fields as $field => $fieldValue) { $objAdvancedSearchSeoClass->{$field}[$id_lang] = $fieldValue; } } $error = $objAdvancedSearchSeoClass->validateFields(false, true); $errorLang = $objAdvancedSearchSeoClass->validateFieldsLang(false, true); if ($error !== true) { $this->_html .= ''; } elseif ($errorLang !== true) { $this->_html .= ''; } else { if (!$objAdvancedSearchSeoClass->save()) { $this->_html .= ''; } } } } $this->_html .= ''; } echo $this->_html; die(); } public static function parseInt($string) { if (preg_match('/(\d+)/', $string, $array)) { return $array[1]; } else { return 0; } } public function saveAdvancedConfig() { $this->_cleanOutput(); $this->updateAdvancedStyles(Tools::getValue('advancedConfig')); $this->_html .= $this->displayConfirmation($this->l('Styles updated successfully')); } protected function _postProcess() { if (Tools::getValue('submitAdvancedConfig')) { $this->saveAdvancedConfig(); } elseif (Tools::getIsset('submitSearch')) { $this->_postProcessSearch(); } elseif (Tools::getIsset('submitSearchVisibility')) { $this->_postProcessSearchVisibility(); } elseif (Tools::getIsset('submitCriteria')) { $this->_postProcessCriteria(); } elseif (Tools::getIsset('submitSeoSearchForm')) { $this->_postProcessSeoSearch(); } elseif (Tools::getIsset('submitMassSeoSearchForm')) { $this->_postProcessMassSeoSearch(); } elseif (Tools::getIsset('submitSeoRegenerate')) { $this->_postProcessSeoRegenerate(); } elseif (Tools::getIsset('action') && Tools::getValue('action') == 'orderSearchEngine') { $this->_cleanOutput(); $order = Tools::getValue('order') ? explode(',', Tools::getValue('order')) : array(); foreach ($order as $position => $searchIdentifier) { $idSearch = self::parseInt($searchIdentifier); if (!empty($idSearch)) { Db::getInstance()->update('pm_advancedsearch', array('position' => (int)$position), 'id_search = ' . (int)$idSearch); } } $this->_html .= $this->l('Saved'); $this->_echoOutput(true); } elseif (Tools::getIsset('action') && Tools::getValue('action') == 'orderCriterion') { $this->_cleanOutput(); $order = Tools::getValue('order') ? explode(',', Tools::getValue('order')) : array(); $id_search = Tools::getValue('id_search'); foreach ($order as $position => $id_criterion) { if (!trim($id_criterion)) { continue; } $row = array('position' => (int)$position); Db::getInstance()->update('pm_advancedsearch_criterion_' . (int)$id_search, $row, 'id_criterion = ' . (int)self::parseInt($id_criterion)); self::clearSmartyCache((int)$id_search); } $this->_html .= $this->l('Saved'); $this->_echoOutput(true); } elseif (Tools::getIsset('action') && Tools::getValue('action') == 'orderCriterionGroup') { $this->_cleanOutput(); $order = Tools::getValue('order') ? explode(',', Tools::getValue('order')) : array(); $id_search = Tools::getValue('id_search'); $auto_hide = Tools::getValue('auto_hide'); $hidden = false; foreach ($order as $position => $key_criterions_group) { if ($key_criterions_group == "hide_after_".$id_search) { if ($auto_hide == 'true') { $hidden = true; } continue; } if (!trim($key_criterions_group)) { continue; } $row = array('position' => (int)$position, 'hidden' => (int)$hidden); $infos_criterions_group = explode('-', $key_criterions_group); list($criterions_group_type, $id_criterion_group_linked, $id_search, $id_criterion_group) = $infos_criterions_group; if (!$criterions_group_type || !$id_search || !$id_criterion_group) { continue; } Db::getInstance()->update('pm_advancedsearch_criterion_group_' . (int)$id_search, $row, 'id_criterion_group = ' . (int)$id_criterion_group); self::clearSmartyCache((int)$id_search); } $this->_html .= $this->l('Saved'); $this->_echoOutput(true); } elseif (Tools::getIsset('submitModuleConfiguration') && Tools::isSubmit('submitModuleConfiguration')) { $config = $this->_getModuleConfiguration(); foreach (array('fullTree', 'autoReindex', 'autoSyncActiveStatus', 'moduleCache', 'blurEffect') as $configKey) { $config[$configKey] = (bool)Tools::getValue($configKey); } if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $as4SearchProvider = new As4SearchProvider( $this, $this->getTranslator(), new AdvancedSearchClass(), null ); $sortOrders = $as4SearchProvider->getSortOrders(true, false); $config['sortOrders'] = array(); foreach ($sortOrders as $sortOrder) { $config['sortOrders'][$sortOrder->toString()] = (bool)Tools::getValue(str_replace('.', '_', $sortOrder->toString())); } } $this->_setModuleConfiguration($config); $this->context->controller->confirmations[] = $this->l('Module configuration successfully saved'); $this->processClearAllCache(false); } parent::_postProcess(); } protected function _postSaveProcess($params) { parent::_postSaveProcess($params); if ($params['class'] == 'AdvancedSearchCriterionGroupClass' && Tools::isSubmit('submitCriteriaGroupOptions')) { $this->generateCss(); if (Validate::isLoadedObject($params['obj'])) { $this->_html .= ''; } $this->_html .= ''; } } protected function _postDuplicateProcess($params) { parent::_postDuplicateProcess($params); if ($params['class'] == 'AdvancedSearchClass') { $this->generateCss(); $this->_html .= 'addTabPanel("#wrapAsTab","' . $params['obj']->internal_name . '",' . (int)$params['obj']->id . ', true);'; } } protected function _postDeleteProcess($params) { parent::_postDeleteProcess($params); if ($params['class'] == 'AdvancedSearchClass') { $this->_html .= 'removeTabPanel("#wrapAsTab","li#TabSearchAdminPanel' . Tools::getValue('id_search') . '","ul#asTab");'; if (!sizeof(As4SearchEngine::getSearchsId(false, $this->context->shop->id))) { $this->_html .= 'parent.parent.location.reload();'; } } } private function _renderConfigurationForm() { $config = $this->_getModuleConfiguration(); $sortOrders = array(); if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $as4SearchProvider = new As4SearchProvider( $this, $this->getTranslator(), new AdvancedSearchClass(), null ); $sortOrders = $as4SearchProvider->getSortOrders(true, false); } $vars = array( 'config' => $config, 'sort_orders' => $sortOrders, 'default_config' => $this->_defaultConfiguration, ); return $this->fetchTemplate('module/tabs/configuration.tpl', $vars); } protected function checkSeoCriteriaCombination() { $criteria = Tools::getValue('criteria', false); $id_search = Tools::getValue('id_search', false); $id_currency = Tools::getValue('id_currency', false); $resultTotalProducts = false; if ($criteria && $id_search) { $criteria = explode(',', $criteria); $resultTotalProducts = $this->countProductFromSeoCriteria($id_search, $criteria, $id_currency); } if (!$resultTotalProducts) { $this->_html .= '$("input[name=submitSeoSearchForm]").hide();$("#errorCombinationSeoSearchForm").show();'; $this->_html .= '$("#nbProductsCombinationSeoSearchForm").html(\'
0 ' . $this->l('result found') . '
\');'; } else { $this->_html .= '$("input[name=submitSeoSearchForm]").show();$("#errorCombinationSeoSearchForm").hide();'; $this->_html .= '$("#nbProductsCombinationSeoSearchForm").html(\'' . $resultTotalProducts . ' ' . $this->l('result(s) found(s)') . '
\');'; } } public function displaySearchAdminPanel() { $id_search = (int) Tools::getValue('id_search'); $advanced_search = As4SearchEngine::getSearch($id_search, (int)$this->context->language->id, false); if (!isset($advanced_search[0])) { return; } $advanced_search = $advanced_search[0]; $criterions_groups = $this->getCriterionsGroupsValue(); $criterionsUnitGroupsTranslations = $this->getCriterionUnitTranslations(); $criterions_groups_indexed = As4SearchEngineIndexation::getCriterionsGroupsIndexed($advanced_search['id_search'], (int)$this->context->language->id); $keys_criterions_group_indexed = array(); $criterions_groups_to_reindex = As4SearchEngineIndexation::getCriterionsGroupsIndexed($advanced_search['id_search'], (int)$this->context->language->id, false); $criteriaGroupToReindex = array(); if (self::_isFilledArray($criterions_groups_to_reindex)) { foreach ($criterions_groups_to_reindex as $criterions_group_indexed) { $criteriaGroupToReindex[] = array( 'id_search' => (int)$id_search, 'id_criterion_group' => (int)$criterions_group_indexed['id_criterion_group'], ); } } foreach ($criterions_groups_indexed as $k => $criterions_group_indexed) { $criterionGroupUnit = $this->getCriterionUnitByType($criterions_group_indexed['criterion_group_type']); $criterions_groups_indexed[$k]['criterion_group_unit'] = $criterionGroupUnit; $criterions_groups_indexed[$k]['unique_id'] = $criterions_group_indexed['criterion_group_type'] . '-' . (int)$criterions_group_indexed['id_criterion_group_linked'] . '-' . (int)$advanced_search['id_search'] . '-' . (int)$criterions_group_indexed['id_criterion_group']; $keys_criterions_group_indexed[] = $criterions_group_indexed['criterion_group_type'].'-'.(int)$criterions_group_indexed['id_criterion_group_linked']; } foreach ($criterions_groups as &$groupList) { foreach ($groupList as $k => $criterions_group) { if ($criterions_group['type'] != 'category' && in_array($criterions_group['type'].'-'.(int)$criterions_group['id'], $keys_criterions_group_indexed)) { unset($groupList[$k]); continue; } $groupList[$k]['unique_id'] = $criterions_group['type'] . '-' . (int)$criterions_group['id'] . '-' . (int)$advanced_search['id_search']; } } $vars = array( 'id_search' => (int)$id_search, 'search_engine' => $advanced_search, 'groups_to_reindex' => $criteriaGroupToReindex, 'criterions_groups_indexed' => $criterions_groups_indexed, 'criteria_group_labels' => $this->criteriaGroupLabels, 'criterions_groups' => $criterions_groups, 'criterions_unit_groups_translations' => $criterionsUnitGroupsTranslations, ); $this->_html .= $this->fetchTemplate('module/tabs/search_engine.tpl', $vars); } protected function processIndexCriterionsGroup() { self::_changeTimeLimit(0); $key_criterions_group = Tools::getValue('key_criterions_group', false); if (!$key_criterions_group) { die; } $infos_criterions_group = explode('-', $key_criterions_group); list($criterions_group_type, $id_criterion_group_linked, $id_search) = $infos_criterions_group; if (!$criterions_group_type || !$id_search) { die; } $id_criterion_group = As4SearchEngineIndexation::indexCriterionsGroup($id_search, $criterions_group_type, $id_criterion_group_linked, false, true, false); As4SearchEngineIndexation::optimizedSearchTables($id_search); self::clearSmartyCache((int)$id_search); $new_key_criterions_group_indexed = $criterions_group_type . '-' . (int)$id_criterion_group_linked . '-' . (int)$id_search . '-' . (int)$id_criterion_group; $this->_html .= '$("#'.$key_criterions_group.'").attr("id", "'.$new_key_criterions_group_indexed.'");'; $key_criterions_group = $new_key_criterions_group_indexed; $this->_html .= '$("#'.$key_criterions_group.' .loadingOnConnectList").hide().remove();'; $this->_html .= 'setCriterionGroupActions("'.$key_criterions_group.'");'; $this->_html .= '$("#'.$key_criterions_group.'").attr("rel",'.(int)$id_criterion_group.');'; $this->_html .= 'getCriterionGroupActions("'.$key_criterions_group.'");'; $this->_html .= 'saveCriterionsGroupSorting('. (int)$id_search .');'; $criterions_groups_to_reindex = As4SearchEngineIndexation::getCriterionsGroupsIndexed((int)$id_search, (int)$this->context->language->id, false); $criteriaGroupToReindex = array(); if (self::_isFilledArray($criterions_groups_to_reindex)) { foreach ($criterions_groups_to_reindex as $criterions_group_indexed) { $criteriaGroupToReindex[] = array( 'id_search' => (int)$id_search, 'id_criterion_group' => (int)$criterions_group_indexed['id_criterion_group'], ); } } $this->_html .= 'var criteriaGroupToReindex'.(int)$id_search.' = '. Tools::jsonEncode($criteriaGroupToReindex) .';'; } protected function processDesindexCriterionsGroup() { $key_criterions_group = Tools::getValue('key_criterions_group', false); if (!$key_criterions_group) { die; } $infos_criterions_group = explode('-', $key_criterions_group); list($criterions_group_type, $id_criterion_group_linked, $id_search, $id_criterion_group) = $infos_criterions_group; if (!$criterions_group_type || !$id_search) { die; } As4SearchEngineIndexation::desIndexCriterionsGroup($id_search, $criterions_group_type, $id_criterion_group_linked, $id_criterion_group); As4SearchEngineIndexation::optimizedSearchTables($id_search); self::clearSmartyCache((int)$id_search); $this->_html .= '$("#'.$key_criterions_group.' .loadingOnConnectList").hide().remove();'; $criterions_groups_to_reindex = As4SearchEngineIndexation::getCriterionsGroupsIndexed((int)$id_search, (int)$this->context->language->id, false); $criteriaGroupToReindex = array(); if (self::_isFilledArray($criterions_groups_to_reindex)) { foreach ($criterions_groups_to_reindex as $criterions_group_indexed) { $criteriaGroupToReindex[] = array( 'id_search' => (int)$id_search, 'id_criterion_group' => (int)$criterions_group_indexed['id_criterion_group'], ); } } $this->_html .= 'var criteriaGroupToReindex'.(int)$id_search.' = '. Tools::jsonEncode($criteriaGroupToReindex) .';'; } protected function processRemoveEmptySeo() { $id_search = Tools::getValue('id_search', false); if (!$id_search) { die(); } $seoSearchs = AdvancedSearchSeoClass::getSeoSearchs((int)$this->context->language->id, false, $id_search); foreach ($seoSearchs as $row) { $resultTotalProducts = $this->countProductFromSeoCriteria($id_search, unserialize($row['criteria']), $row['id_currency']); if (!$resultTotalProducts) { $objAdvancedSearchSeoClass = new AdvancedSearchSeoClass($row['id_seo']); if (!$objAdvancedSearchSeoClass->delete()) { $this->_html .= 'show_error("' . $this->l('Error while deleting results page') . ' ' . $row['id_seo'] . '");'; } } } $this->_html .= 'show_info("' . $this->l('Empty results pages have been deleted') . '");reloadPanel("seo_search_panel_' . (int)$id_search . '");'; } protected function processFillSeoFields() { $criteria = Tools::getValue('criteria', false); $id_search = Tools::getValue('id_search', false); $id_currency = Tools::getValue('id_currency', false); if (!$criteria || !$id_search) { die; } $criteria = explode(',', $criteria); $defaultReturnSeoStr = $this->getSeoStrings($criteria, $id_search, $id_currency); foreach ($defaultReturnSeoStr as $id_lang => $fields) { foreach ($fields as $field => $fieldValue) { $this->_html .= '$("input[name='.$field.'_'.$id_lang.']").val("'.addcslashes($fieldValue, '"').'");'; } } } protected function processClearAllCache($outputConfirmation = true) { $advanced_searchs_id = As4SearchEngine::getSearchsId(false); foreach ($advanced_searchs_id as $idSearch) { self::clearSmartyCache($idSearch); } As4SearchEngine::setLocalStorageCacheKey(); if ($outputConfirmation) { $this->_html .= 'show_info("'.addcslashes($this->l('Cache has been flushed'), '"').'");'; } } protected function processClearAllTables() { $advanced_searchs_id = As4SearchEngine::getSearchsId(false); As4SearchEngine::clearAllTables(); foreach ($advanced_searchs_id as $idSearch) { $this->_html .= 'removeTabPanel("#wrapAsTab","li#TabSearchAdminPanel'.$idSearch.'","ul#asTab");'; } $this->_html .= 'show_info("'.addcslashes($this->l('Clear done'), '"').'"); $("#msgNoResults").slideDown();'; } protected function processReindexSpecificSearch() { self::_changeTimeLimit(0); $id_search = Tools::getValue('id_search'); As4SearchEngineIndexation::reindexSpecificSearch($id_search); $this->_html .= '$( "#progressbarReindexSpecificSearch'.(int)$id_search.'" ).progressbar( "option", "value", 100 );show_info("'.addcslashes($this->l('Indexation done'), '"').'")'; } protected function processDeleteCriterionImg() { $id_search = Tools::getValue('id_search'); $id_criterion = Tools::getValue('id_criterion'); $id_lang = Tools::getValue('id_lang'); $objCriterion = new AdvancedSearchCriterionClass($id_criterion, $id_search); $file_name = $objCriterion->icon[$id_lang]; $file_name_final_path = _PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/search_files/criterions/'.$file_name; $objCriterion->icon[$id_lang] = ''; if (AdvancedSearchCoreClass::_isRealFile($file_name_final_path)) { unlink($file_name_final_path); } if ($objCriterion->save()) { $this->_html .= 'show_info("'.addcslashes($this->l('Criterion image deleted'), '"').'");'; } else { $this->_html .= 'show_info("'.addcslashes($this->l('An error occured'), '"').'");'; } } protected function processSaveCriterionImg() { $id_search = Tools::getValue('id_search'); $id_criterion = Tools::getValue('id_criterion'); $id_lang = Tools::getValue('id_lang'); $file_name = Tools::getValue('file_name'); $file_name_temp_path = _PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/uploads/temp/'.$file_name; $file_name_final_path = _PS_ROOT_DIR_ . '/modules/pm_advancedsearch4/search_files/criterions/'; if (AdvancedSearchCoreClass::_isRealFile($file_name_temp_path)) { rename($file_name_temp_path, $file_name_final_path . $file_name); $objCriterion = new AdvancedSearchCriterionClass($id_criterion, $id_search); $objCriterion->icon[$id_lang] = $file_name; foreach (Language::getLanguages(false) as $lang) { if (empty($objCriterion->icon[$lang['id_lang']])) { $new_temp_file_lang = uniqid(self::$_module_prefix . mt_rand()).'.'.self::_getFileExtension($file_name); copy($file_name_final_path . $file_name, $file_name_final_path . $new_temp_file_lang); $objCriterion->icon[$lang['id_lang']] = $new_temp_file_lang; } } if ($objCriterion->save()) { $this->_html .= 'ok'; } else { $this->_html .= 'ko'; } } else { $this->_html .= 'ko'; } } protected function processDeleteCustomCriterion() { $objCriterion = new AdvancedSearchCriterionClass((int)Tools::getValue('id_criterion'), (int)Tools::getValue('id_search')); if (Validate::isLoadedObject($objCriterion)) { if ($objCriterion->delete()) { $this->_html .= 'parent.show_info("' . $this->l('Successfully deleted') . '");'; $this->_html .= 'this.location.reload(true);'; } else { $this->_html .= 'parent.show_error("' . $this->l('Error while updating criterion') . '");'; } } else { $this->_html .= 'parent.show_error("' . $this->l('Error while deleting criterion') . '");'; } } protected function processAddCustomCriterion() { $objCriterion = new AdvancedSearchCriterionClass(null, (int)Tools::getValue('id_search')); $objCriterion->id_criterion_group = (int)Tools::getValue('id_criterion_group'); $objCriterion->id_criterion_linked = 0; $objCriterion->is_custom = 1; $this->copyFromPost($objCriterion); $validationErrors = AdvancedSearchCoreClass::_retroValidateController($objCriterion); if (!self::_isFilledArray($validationErrors)) { if ($objCriterion->save()) { $this->_html .= 'parent.show_info("' . $this->l('Saved') . '");'; $this->_html .= 'this.location.reload(true);'; } else { $this->_html .= 'parent.show_error("' . $this->l('Error while adding criterion') . '");'; } } else { $this->_html .= 'parent.show_error("' . $this->l('Error while adding criterion') . '");'; foreach ($validationErrors as $error) { $this->_html .= 'parent.show_error("' . $error . '");'; } } } protected function processUpdateCustomCriterion() { $objCriterion = new AdvancedSearchCriterionClass((int)Tools::getValue('id_criterion'), (int)Tools::getValue('id_search')); $this->copyFromPost($objCriterion); if (Validate::isLoadedObject($objCriterion)) { if ($objCriterion->save()) { $this->_html .= 'parent.show_info("' . $this->l('Saved') . '");'; $this->_html .= 'this.location.reload(true);'; } else { $this->_html .= 'parent.show_error("' . $this->l('Error while updating criterion') . '");'; } } else { $this->_html .= 'parent.show_error("' . $this->l('Error while updating criterion') . '");'; } } protected function processAddCustomCriterionToGroup() { $idSearch = (int)Tools::getValue('id_search'); $idCriterionGroup = (int)Tools::getValue('id_criterion_group'); $criterionsGroupList = explode(',', Tools::getValue('criterionsGroupList')); $newCriterionsGroupList = array(); if (self::_isFilledArray($criterionsGroupList)) { foreach ($criterionsGroupList as $criterionsGroupListRow) { $criterionsGroupListRow = explode('-', $criterionsGroupListRow); $idCriterion = (int)$criterionsGroupListRow[0]; $idCriterionParent = (int)$criterionsGroupListRow[1]; if (!$idCriterionParent) { continue; } $newCriterionsGroupList[$idCriterionParent][] = $idCriterion; } } $customCriterionList = AdvancedSearchCriterionClass::getCustomCriterionsLinkIdsByGroup($idSearch, $idCriterionGroup); $idCriterionParentToDelete = array(); foreach ($customCriterionList as $idCriterionParent => $currentCriterionsGroupList) { $idCriterionParentToDelete[] = (int)$idCriterionParent; } foreach ($newCriterionsGroupList as $idCriterionParent => $currentCriterionsGroupList) { $idCriterionParentToDelete[] = (int)$idCriterionParent; } if (sizeof($idCriterionParentToDelete)) { As4SearchEngineDb::execute('DELETE FROM `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int)$idSearch.'_list` WHERE `id_criterion_parent` IN (' . implode(',', array_map('intval', $idCriterionParentToDelete)) . ')'); } foreach ($customCriterionList as $idCriterionParent => $currentCriterionsGroupList) { AdvancedSearchCriterionClass::populateCriterionsLink($idSearch, $idCriterionParent); } $sqlInsertMultiple = array(); $sqlInsertMultipleHeader = 'INSERT IGNORE INTO `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int)$idSearch.'_list` (`id_criterion_parent`, `id_criterion`) VALUES '; foreach ($newCriterionsGroupList as $idCriterionParent => $currentCriterionsGroupList) { if (self::_isFilledArray($currentCriterionsGroupList)) { foreach ($currentCriterionsGroupList as $idCriterion) { $sqlInsertMultiple[] = '('. (int)$idCriterionParent. ', '. (int)$idCriterion .')'; As4SearchEngineIndexation::sqlBulkInsert('pm_advancedsearch_criterion_'.(int)$idSearch.'_list', $sqlInsertMultipleHeader, $sqlInsertMultiple, 1000); } } } As4SearchEngineIndexation::sqlBulkInsert('pm_advancedsearch_criterion_'.(int)$idSearch.'_list', $sqlInsertMultipleHeader, $sqlInsertMultiple, 1); foreach ($newCriterionsGroupList as $idCriterionParent => $currentCriterionsGroupList) { AdvancedSearchCriterionClass::populateCriterionsLink($idSearch, $idCriterionParent, false, $currentCriterionsGroupList); } $this->_html .= 'parent.show_info("' . $this->l('Saved') . '");'; } protected function processEnableAllCriterions() { $objCriterionGoup = new AdvancedSearchCriterionGroupClass((int)Tools::getValue('id_criterion_group'), (int)Tools::getValue('id_search')); if (Validate::isLoadedObject($objCriterionGoup)) { if (AdvancedSearchCriterionGroupClass::enableAllCriterions((int)Tools::getValue('id_search'), (int)Tools::getValue('id_criterion_group'))) { $this->_html .= '$("img[id^=imgActiveCriterion]").attr("src","../img/admin/enabled.gif");'; $this->_html .= 'parent.show_info("' . $this->l('Saved') . '");'; } else { $this->_html .= 'parent.show_error("' . $this->l('Error while updating criterions status') . '");'; } } else { $this->_html .= 'parent.show_error("' . $this->l('Error while updating criterions status') . '");'; } } protected function processDisableAllCriterions() { $objCriterionGoup = new AdvancedSearchCriterionGroupClass((int)Tools::getValue('id_criterion_group'), (int)Tools::getValue('id_search')); if (Validate::isLoadedObject($objCriterionGoup)) { if (AdvancedSearchCriterionGroupClass::disableAllCriterions((int)Tools::getValue('id_search'), (int)Tools::getValue('id_criterion_group'))) { $this->_html .= '$("img[id^=imgActiveCriterion]").attr("src","../img/admin/disabled.gif");'; $this->_html .= 'parent.show_info("' . $this->l('Saved') . '");'; } else { $this->_html .= 'parent.show_error("' . $this->l('Error while updating criterions status') . '");'; } } else { $this->_html .= 'parent.show_error("' . $this->l('Error while updating criterions status') . '");'; } } protected function processActiveCriterion() { $ObjAdvancedSearchCriterionClass = new AdvancedSearchCriterionClass(Tools::getValue('id_criterion'), Tools::getValue('id_search')); $ObjAdvancedSearchCriterionClass->visible = ($ObjAdvancedSearchCriterionClass->visible ? 0 : 1); if ($ObjAdvancedSearchCriterionClass->save()) { $this->_html .= '$("#imgActiveCriterion' . $ObjAdvancedSearchCriterionClass->id . '").attr("src","../img/admin/' . ($ObjAdvancedSearchCriterionClass->visible ? 'enabled' : 'disabled') . '.gif");'; $this->_html .= 'parent.show_info("' . $this->l('Saved') . '");'; } else { $this->_html .= 'parent.show_error("' . $this->l('Error while updating search') . '");'; } } protected function processActiveSearch() { $ObjAdvancedSearchClass = new AdvancedSearchClass(Tools::getValue('id_search')); $ObjAdvancedSearchClass->active = ($ObjAdvancedSearchClass->active ? 0 : 1); if ($ObjAdvancedSearchClass->save()) { if ($ObjAdvancedSearchClass->active) { $this->_html .= ' $("#searchStatusLabel' . $ObjAdvancedSearchClass->id . '").html("' . $this->l('enabled') . '"); $(".status_search_' . $ObjAdvancedSearchClass->id . ' span").addClass("ui-icon-circle-check").removeClass("ui-icon-circle-close"); $(".status_search_' . $ObjAdvancedSearchClass->id . '").toggleClass("enabled_search"); '; } else { $this->_html .= ' $("#searchStatusLabel' . $ObjAdvancedSearchClass->id . '").html("' . $this->l('disabled') . '"); $(".status_search_' . $ObjAdvancedSearchClass->id . ' span").removeClass("ui-icon-circle-check").addClass("ui-icon-circle-close"); $(".status_search_' . $ObjAdvancedSearchClass->id . '").toggleClass("enabled_search"); '; } $this->_html .= 'show_info("' . $this->l('Saved') . '");'; } else { $this->_html .= 'show_error("' . $this->l('Error while updating search') . '");'; } } protected function processDeleteSeoSearch() { $ObjAdvancedSearchSeoClass = new AdvancedSearchSeoClass(Tools::getValue('id_seo')); $ObjAdvancedSearchSeoClass->deleted = 1; if ($ObjAdvancedSearchSeoClass->save()) { $this->_html .= 'show_info("' . $this->l('The results page has been deleted') . '");reloadPanel("seo_search_panel_' . (int)Tools::getValue('id_search') . '");'; } else { $this->_html .= 'show_error("' . $this->l('Error while deleting the results page') . '");'; } } protected function processDeleteMassSeo() { $id_seos = Tools::getValue('seo_group_action', false); $id_search = Tools::getValue('id_search', false); if (self::_isFilledArray($id_seos)) { foreach ($id_seos as $id_seo) { $objAdvancedSearchSeoClass = new AdvancedSearchSeoClass($id_seo); $objAdvancedSearchSeoClass->deleted = 1; $objAdvancedSearchSeoClass->save(); } $this->_html .= 'show_info("' . $this->l('The results page has been deleted') . '");reloadPanel("seo_search_panel_' . (int)$id_search . '");'; } else { $this->_html .= 'show_error("' . $this->l('Please select at least one results page') . '");'; } } protected function displaySeoPriceSlider() { $id_search = Tools::getValue('id_search', false); $id_criterion_group = Tools::getValue('id_criterion_group', false); $id_criterion_group_linked = Tools::getValue('id_criterion_group_linked', false); $id_currency = Tools::getValue('id_currency', false); $currency = new Currency($id_currency); if (!$id_search || !$id_currency) { die(); } $search = As4SearchEngine::getSearch($id_search, false); $price_range = As4SearchEngine::getPriceRangeForSearchBloc($search[0], (int)$id_criterion_group_linked, (int)$id_currency, (int)$this->getCurrentCustomerGroupId(), (int)$this->context->country->id, array(), array()); $min_price_id_currency = (int)$price_range[0]['min_price_id_currency']; $max_price_id_currency = (int)$price_range[0]['max_price_id_currency']; if (($min_price_id_currency == 0 && $min_price_id_currency != $id_currency) || ($min_price_id_currency != 0 && $min_price_id_currency != $id_currency)) { $price_range[0]['min_price'] = Tools::convertPrice($price_range[0]['min_price'], $id_currency); } if (($max_price_id_currency == 0 && $max_price_id_currency != $id_currency) || ($max_price_id_currency != 0 && $max_price_id_currency != $id_currency)) { $price_range[0]['max_price'] = Tools::convertPrice($price_range[0]['max_price'], $id_currency); } $price_range[0]['min_price'] = floor($price_range[0]['min_price']); $price_range[0]['max_price'] = ceil($price_range[0]['max_price']); $vars = array( 'id_criterion_group' => $id_criterion_group, 'price_range' => $price_range[0], 'currency' => $currency, ); $this->_html .= $this->fetchTemplate('module/seo/price_slider.tpl', $vars); } protected function displaySeoSearchOptions() { if (Tools::getValue('id_seo_excludes')) { $id_seo_excludes = explode(',', Tools::getValue('id_seo_excludes', false)); } else { $id_seo_excludes = array(); } if (Tools::getValue('id_seo_origin')) { $id_seo_excludes[] = (int)Tools::getValue('id_seo_origin'); } $query_search = Tools::getValue('q', false); $limit = Tools::getValue('limit', 100); $start = Tools::getValue('start', 0); $nbResults = AdvancedSearchSeoClass::getCrossLinksAvailable((int)$this->context->language->id, $id_seo_excludes, $query_search, true); $results = AdvancedSearchSeoClass::getCrossLinksAvailable((int)$this->context->language->id, $id_seo_excludes, $query_search, false, $limit, $start); foreach ($results as $key => $value) { $this->_html .= $key . '=' . $value . "\n"; } if ($nbResults > ($start + $limit)) { $this->_html .= 'DisplayMore' . "\n"; } } protected function displayCmsOptions() { $query = Tools::getValue('q', false); if (trim($query)) { $limit = Tools::getValue('limit', 100); $start = Tools::getValue('start', 0); $items = As4SearchEngineDb::query(' SELECT c.`id_cms`, cl.`meta_title` FROM `'._DB_PREFIX_.'cms` c LEFT JOIN `'._DB_PREFIX_.'cms_lang` cl ON (c.`id_cms` = cl.`id_cms`) WHERE (cl.`meta_title` LIKE \'%'.pSQL($query).'%\') AND cl.`id_lang` = '.(int)$this->context->language->id.' AND c.`active` = 1 ORDER BY cl.`meta_title` '.($limit? 'LIMIT '.$start.', '.(int)$limit : '')); if ($items) { foreach ($items as $row) { $this->_html .= $row['id_cms']. '=' .$row['meta_title']. "\n"; } } } } protected function displaySeoSearchPanelList() { $id_search = (int)Tools::getValue('id_search'); $seoSearchs = AdvancedSearchSeoClass::getSeoSearchs((int)$this->context->language->id, false, $id_search); foreach ($seoSearchs as &$row) { $row['total_products'] = $this->countProductFromSeoCriteria($id_search, unserialize($row['criteria']), $row['id_currency']); } $vars = array( 'id_search' => $id_search, 'rewrite_settings' => Configuration::get('PS_REWRITING_SETTINGS'), 'seo_searchs' => $seoSearchs, 'sitemap_url' => $this->context->link->getModuleLink('pm_advancedsearch4', 'seositemap', array('id_search' => (int)$id_search)), ); $this->_html .= $this->fetchTemplate('module/seo/search_panel.tpl', $vars); } protected function displaySeoUrl($id_search) { $id_search = Tools::getValue('id_search', false); $id_seo = Tools::getValue('id_seo', false); if (!$id_seo || !$id_search) { die; } $ObjAdvancedSearchSeoClass = new AdvancedSearchSeoClass($id_seo, null); $seo_url_by_lang = array(); foreach ($this->_languages as $language) { $seo_url_by_lang[(int)$language['id_lang']] = $this->context->link->getModuleLink('pm_advancedsearch4', 'seo', array('id_seo' => (int)$ObjAdvancedSearchSeoClass->id, 'seo_url' => $ObjAdvancedSearchSeoClass->seo_url[$language['id_lang']]), null, (int)$language['id_lang']); } $vars = array( 'seo_url_by_lang' => $seo_url_by_lang, 'pm_flags' => $this->displayPMFlags(), ); $this->_html .= $this->fetchTemplate('module/seo/url.tpl', $vars); } protected function displaySeoUrlList() { $id_search = Tools::getValue('id_search'); $seoSearchs = AdvancedSearchSeoClass::getSeoSearchs((int)$this->context->language->id, false, $id_search); if ($seoSearchs && self::_isFilledArray($seoSearchs)) { $new_SeoSearch = array(); foreach ($seoSearchs as $row) { $ObjAdvancedSearchSeoClass = new AdvancedSearchSeoClass($row['id_seo'], null); foreach ($this->_languages as $language) { $url = $this->context->link->getModuleLink('pm_advancedsearch4', 'seo', array('id_seo' => (int)$ObjAdvancedSearchSeoClass->id, 'seo_url' => $ObjAdvancedSearchSeoClass->seo_url[$language['id_lang']]), null, (int)$language['id_lang']); $title = htmlentities($ObjAdvancedSearchSeoClass->title[$language['id_lang']], ENT_COMPAT, 'UTF-8'); $new_SeoSearch[$language['id_lang']][$ObjAdvancedSearchSeoClass->id]['url'] = $url; $new_SeoSearch[$language['id_lang']][$ObjAdvancedSearchSeoClass->id]['title'] = $title; } } $seoSearchs = $new_SeoSearch; unset($new_SeoSearch); } $vars = array( 'seo_url_list' => $seoSearchs, 'pm_flags' => $this->displayPMFlags(), ); $this->_html .= $this->fetchTemplate('module/seo/url_list.tpl', $vars); } protected function displaySeoRegenerateForm() { $vars = array( 'id_search' => (int)Tools::getValue('id_search'), ); $this->_html .= $this->fetchTemplate('module/seo/regenerate_form.tpl', $vars); } protected function displaySeoSearchForm($params) { $id_search = (int)Tools::getValue('id_search'); $criterions_groups_indexed = As4SearchEngineSeo::getCriterionsGroupsIndexedForSEO($id_search, (int)$this->context->language->id); $search = As4SearchEngine::getSearch($id_search, false, false); $criteria = false; if ($params['obj'] && $params['obj']->criteria) { $criteria = unserialize($params['obj']->criteria); } if (Validate::isLoadedObject($params['obj']) && !empty($params['obj']->id_currency)) { $default_currency = new Currency($params['obj']->id_currency); } if (!Validate::isLoadedObject($default_currency)) { $default_currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); } foreach ($criterions_groups_indexed as &$criterions_group_indexed) { if ($criterions_group_indexed['range'] == 1) { if ($criterions_group_indexed['criterion_group_type'] == 'price') { $criterions_group_indexed['range_sign'] = $default_currency->sign; } $ranges = explode(',', $criterions_group_indexed['range_interval']); $criterions = array(); foreach ($ranges as $krange => $range) { $rangeUp = (isset($ranges[$krange+1]) ? $ranges[$krange+1]:''); $range1 = $range.'~'.$rangeUp; $range2 = $this->getTextualRangeValue($range, $rangeUp, $criterions_group_indexed, $default_currency); $criterions[] = array('id_criterion' => $range1, 'value' => $range2); } $criterions_group_indexed['criterions'] = $criterions; } elseif ($criterions_group_indexed['criterion_group_type'] == 'price') { $price_range = As4SearchEngine::getPriceRangeForSearchBloc($search[0], (int)$criterions_group_indexed['id_criterion_group_linked'], (int)$default_currency->id, (int)$this->getCurrentCustomerGroupId(), (int)$this->context->country->id, array(), array()); $criterions_group_indexed['price_range'] = $price_range[0]; } elseif ($criterions_group_indexed['display_type'] == 5 || $criterions_group_indexed['display_type'] == 8) { $range = As4SearchEngine::getCriterionsRange($search[0], (int)$criterions_group_indexed['id_criterion_group'], (int)$this->context->language->id, array(), array(), false, false, $criterions_group_indexed); $criterions_group_indexed['range'] = $range[0]; } else { $criterions = As4SearchEngine::getCriterionsFromCriterionGroup((int)$criterions_group_indexed['id_criterion_group'], $criterions_group_indexed['id_search'], $criterions_group_indexed['sort_by'], $criterions_group_indexed['sort_way'], (int)$this->context->language->id); $criterions_group_indexed['criterions'] = $criterions; } } $criteria_values = array(); if (self::_isFilledArray($criteria)) { foreach ($criteria as &$criterion) { $info_criterion = explode('_', $criterion); $id_criterion_group = $info_criterion[0]; $id_criterion = $info_criterion[1]; $objAdvancedSearchCriterionGroupClass = new AdvancedSearchCriterionGroupClass($id_criterion_group, $id_search, (int)$this->context->language->id); if (preg_match('#~#', $id_criterion)) { $range = explode('~', $id_criterion); $min = $range[0]; $max = (!empty($range[1]) ? $range[1] : ''); $currency = Context::getContext()->currency; if ($objAdvancedSearchCriterionGroupClass->criterion_group_type == 'price' && !empty($params['obj']->id_currency)) { $currency = new Currency($params['obj']->id_currency); if (!Validate::isLoadedObject($currency)) { $currency = Context::getContext()->currency; } } $criterion_value = $this->getTextualRangeValue($min, $max, $objAdvancedSearchCriterionGroupClass, $currency); } else { $objAdvancedSearchCriterionClass = new AdvancedSearchCriterionClass($id_criterion, $id_search, (int)$this->context->language->id); $criterion_value = trim($objAdvancedSearchCriterionClass->value); } $criteria_values[$criterion] = $criterion_value; } } $crossLinksSelected = false; if ($params['obj'] && Validate::isLoadedObject($params['obj'])) { $crossLinksSelected = $params['obj']->getCrossLinksOptionsSelected((int)$this->context->language->id); } $vars = array( 'params' => $params, 'cross_links_selected' => $crossLinksSelected, 'id_search' => $id_search, 'criterions_groups_indexed' => $criterions_groups_indexed, 'criteria' => $criteria, 'criteria_values' => $criteria_values, 'currentSeo' => $params['obj'], 'default_currency_id' => $default_currency->id, 'default_currency_sign_left' => $default_currency->getSign('left'), 'default_currency_sign_right' => $default_currency->getSign('right'), 'currencies' => Currency::getCurrencies(), ); if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $vars['default_currency_sign_left'] = ''; $vars['default_currency_sign_right'] = $default_currency->getSign(); } $this->_html .= $this->fetchTemplate('module/seo/new_page.tpl', $vars); } protected function displayMassSeoSearchForm() { $id_search = (int)Tools::getValue('id_search'); $search = As4SearchEngine::getSearch($id_search, false, false); $criterions_groups_indexed = As4SearchEngineSeo::getCriterionsGroupsIndexedForSEO($id_search, (int)$this->context->language->id); $default_currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); foreach ($criterions_groups_indexed as &$criterions_group_indexed) { if ($criterions_group_indexed['range'] == 1) { if ($criterions_group_indexed['criterion_group_type'] == 'price') { $default_currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); $criterions_group_indexed['range_sign'] = $default_currency->sign; } $ranges = explode(',', $criterions_group_indexed['range_interval']); $criterions = array(); foreach ($ranges as $krange => $range) { $rangeUp = (isset($ranges[$krange+1]) ? $ranges[$krange+1] : ''); $range1 = $range.'~'.$rangeUp; $range2 = $this->getTextualRangeValue($range, $rangeUp, $criterions_group_indexed, $default_currency); $criterions[] = array('id_criterion' => $range1, 'value' => $range2); } $criterions_group_indexed['criterions'] = $criterions; } elseif ($criterions_group_indexed['criterion_group_type'] == 'price') { $price_range = As4SearchEngine::getPriceRangeForSearchBloc($search[0], (int)$criterions_group_indexed['id_criterion_group_linked'], (int)$default_currency->id, (int)$this->getCurrentCustomerGroupId(), (int)$this->context->country->id, array(), array()); $criterions_group_indexed['price_range'] = $price_range[0]; } elseif ($criterions_group_indexed['display_type'] == 5 || $criterions_group_indexed['display_type'] == 8) { $range = As4SearchEngine::getCriterionsRange($search[0], (int)$criterions_group_indexed['id_criterion_group'], (int)$this->context->language->id, array(), array(), false, false, $criterions_group_indexed); $criterions_group_indexed['range'] = $range[0]; } else { $criterions = As4SearchEngine::getCriterionsFromCriterionGroup((int)$criterions_group_indexed['id_criterion_group'], $criterions_group_indexed['id_search'], $criterions_group_indexed['sort_by'], $criterions_group_indexed['sort_way'], (int)$this->context->language->id); $criterions_group_indexed['criterions'] = $criterions; } } $vars = array( 'id_search' => $id_search, 'criterions_groups_indexed' => $criterions_groups_indexed, 'default_currency_id' => $default_currency->id, 'default_currency_sign_left' => $default_currency->getSign('left'), 'default_currency_sign_right' => $default_currency->getSign('right'), 'currencies' => Currency::getCurrencies(), ); if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $vars['default_currency_sign_left'] = ''; $vars['default_currency_sign_right'] = $default_currency->getSign(); } $this->_html .= $this->fetchTemplate('module/seo/mass_page.tpl', $vars); } public function getContent() { $this->_base_config_url = $this->context->link->getAdminLink('AdminModules') . '&configure=' . $this->name; if (Tools::getValue('makeUpdate')) { $this->checkIfModuleIsUpdate(true); } $moduleIsUpToDate = $this->checkIfModuleIsUpdate(false); $permissionsErrors = $this->_checkPermissions(); if (!sizeof($permissionsErrors)) { if ($moduleIsUpToDate) { if (Shop::getContext() == Shop::CONTEXT_SHOP) { $this->_preProcess(); $this->_postProcess(); } } } $config = $this->_getModuleConfiguration(); $vars = array( 'module_configuration' => $config, 'module_display_name' => $this->displayName, 'module_is_up_to_date' => $moduleIsUpToDate, 'permissions_errors' => $permissionsErrors, 'context_is_shop' => (Shop::getContext() == Shop::CONTEXT_SHOP), 'css_js_assets' => $this->_loadCssJsLibraries(), 'from_version_4_9' => (Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false) !== false && version_compare(Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false), '4.8', '>=') && version_compare(Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false), '4.9.1', '<=')), 'from_version_4_10' => (Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false) !== false && version_compare(Configuration::get('PM_' . self::$_module_prefix . '_LAST_VERSION', false), '4.11.0', '<')), 'block_layered_is_active' => $this->blockLayeredIsEnabled(), 'block_layered_display_name' => $this->getNativeLayeredModuleDisplayName(), 'rating_invite' => $this->_showRating(true), 'parent_content' => parent::getContent(), 'search_engines' => array(), 'cache_alert' => false, ); if (!sizeof($permissionsErrors)) { if ($moduleIsUpToDate) { if (Shop::getContext() == Shop::CONTEXT_SHOP) { $advanced_searchs = As4SearchEngine::getAllSearchs((int)$this->context->language->id, false); $vars['search_engines'] = $advanced_searchs; $vars['cache_alert'] = (self::_isFilledArray($advanced_searchs) && isset($config['moduleCache']) && $config['moduleCache'] == false); $vars['configuration_tab'] = $this->_renderConfigurationForm(); $vars['advanced_styles_tab'] = $this->displayAdvancedConfig(); $vars['maintenance_tab'] = $this->displayMaintenance(); $vars['cron_tab'] = $this->displayCrontab(); } } } return $this->fetchTemplate('module/content.tpl', $vars); } protected function displayCrontab() { $cronUrls = array(); $searchEngines = As4SearchEngine::getAllSearchs((int)$this->context->language->id, false); if (AdvancedSearchCoreClass::_isFilledArray($searchEngines)) { foreach ($searchEngines as $searchEngine) { $cronUrls[] = $this->context->link->getModuleLink('pm_advancedsearch4', 'cron', array('secure_key' => Configuration::getGlobalValue('PM_AS4_SECURE_KEY'), 'id_search' => (int)$searchEngine['id_search'])); } } $vars = array( 'main_cron_url' => $this->context->link->getModuleLink('pm_advancedsearch4', 'cron', array('secure_key' => Configuration::getGlobalValue('PM_AS4_SECURE_KEY'))), 'cron_urls' => $cronUrls, ); return $this->fetchTemplate('module/tabs/cron.tpl', $vars); } protected function displaySearchForm($params) { if (!empty($params['obj']->step_search)) { $params['obj']->search_type = 2; } else { if (!empty($params['obj']->filter_by_emplacement)) { $params['obj']->search_type = 0; } else { $params['obj']->search_type = 1; } } $searchType = array( 0 => $this->l('Filter'), 1 => $this->l('Whole catalog'), 2 => $this->l('Step by step'), ); $publicHookLabel = array( 'displayhome' => $this->l('Homepage'), 'displaytop' => $this->l('Top of page'), 'displaynavfullwidth' => $this->l('Top of page full width'), 'displayleftcolumn' => $this->l('Left column'), 'displayrightcolumn' => $this->l('Right column'), ); $hooks = $hooksId = $widgetHooksList = array(); $valid_hooks = As4SearchEngine::$valid_hooks; foreach ($valid_hooks as $hook_name) { if ($hook_name == 'displayAdvancedSearch4') { continue; } $id_hook = Hook::getIdByName($hook_name); if (!$id_hook) { continue; } $hooks[$id_hook] = (!empty($publicHookLabel[$hook_name]) ? $publicHookLabel[$hook_name] . ' (' . $hook_name . ')' : $hook_name); $hooksId[$id_hook] = $hook_name; } $hooks[-1] = $this->l('Custom (advanced user only)'); if (!Validate::isLoadedObject($params['obj']) && empty($params['obj']->id_hook)) { $params['obj']->id_hook = array_search('displayleftcolumn', $hooksId); } $seo_searchs = AdvancedSearchSeoClass::getSeoSearchs(false, 0, (int)$params['obj']->id); $categorySelect = array(0 => $this->l('-- User-context category --')) + $this->getCategoryTreeForSelect(); $whereToSearch = array( 0 => $this->l('Search into the whole catalog (no context)'), 1 => $this->l('Search from the current page (use context)'), ); $params['obj']->remind_selection_results = 0; $params['obj']->remind_selection_block = 0; if ($params['obj']->remind_selection == 1) { $params['obj']->remind_selection_results = 1; } elseif ($params['obj']->remind_selection == 2) { $params['obj']->remind_selection_block = 1; } elseif ($params['obj']->remind_selection == 3) { $params['obj']->remind_selection_results = 1; $params['obj']->remind_selection_block = 1; } if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $hooks[-2] = $this->l('Widget (advanced user only)'); foreach (Hook::getHooks(false, true) as $displayHook) { if (is_array($displayHook) && !empty($displayHook['name']) && !preg_match('/^displayAdmin|^displayBackOffice|^displayInvoice|^displayPDF|^displayAdvancedSearch4|^displayOverrideTemplate|PostProcess$/i', $displayHook['name']) && !in_array(Tools::strtolower($displayHook['name']), $valid_hooks)) { $widgetHooksList[(int)$displayHook['id_hook']] = $displayHook['name']; } } $params['obj']->id_hook_widget = null; if (in_array($params['obj']->id_hook, array_keys($widgetHooksList))) { $params['obj']->id_hook_widget = $params['obj']->id_hook; $params['obj']->id_hook = -2; } } if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $themeLayoutPreferencesLink = $this->context->link->getAdminLink('AdminThemes') . '&display=configureLayouts'; } else { $currentTheme = Theme::getByDirectory($this->context->shop->theme_name); $themeLayoutPreferencesLink = $this->context->link->getAdminLink('AdminThemes') . '&updatetheme&id_theme=' . (Validate::isLoadedObject($currentTheme) ? $currentTheme->id : 0); } $vars = array( 'params' => $params, 'searchType' => $searchType, 'hooksId' => $hooksId, 'hooksList' => $hooks, 'widgetHooksList' => $widgetHooksList, 'seo_searchs' => $seo_searchs, 'category_select' => $categorySelect, 'where_to_search' => $whereToSearch, 'spa_module_is_active' => As4SearchEngine::isSPAModuleActive(), 'products_per_page' => Configuration::get('PS_PRODUCTS_PER_PAGE'), 'options_order_by' => $this->options_defaut_order_by, 'options_order_way' => $this->options_defaut_order_way, 'options_hide_criterion_method' => $this->options_show_hide_crit_method, 'options_search_method' => $this->options_launch_search_method, 'default_search_results_selector' => (version_compare(_PS_VERSION_, '1.7.0.0', '>=') ? '#content-wrapper' : '#center_column'), 'theme_layout_preferences_link' => $themeLayoutPreferencesLink, ); return $this->fetchTemplate('module/search_engine/new.tpl', $vars); } protected function displayVisibilityForm($params) { if ($params['obj']->id) { $categoriesAssociation = As4SearchEngine::getCategoriesAssociation($params['obj']->id, (int)$this->context->language->id); $cmsAssociation = As4SearchEngine::getCMSAssociation($params['obj']->id, (int)$this->context->language->id); $manufacturersAssociation = As4SearchEngine::getManufacturersAssociation($params['obj']->id); $suppliersAssociation = As4SearchEngine::getSuppliersAssociation($params['obj']->id); $productsAssociation = As4SearchEngine::getProductsAssociation($params['obj']->id, (int)$this->context->language->id); $productsCategoriesAssociation = As4SearchEngine::getProductsCategoriesAssociation($params['obj']->id, (int)$this->context->language->id); $specialPagesAssociation = As4SearchEngine::getSpecialPagesAssociation($params['obj']->id); } else { $categoriesAssociation = array(); $cmsAssociation = array(); $manufacturersAssociation = array(); $suppliersAssociation = array(); $productsAssociation = array(); $productsCategoriesAssociation = array(); $specialPagesAssociation = array(); } $vars = array( 'params' => $params, 'categories_association' => $categoriesAssociation, 'root_category_id' => Category::getRootCategory()->id, 'products_association' => $productsAssociation, 'product_categories_association' => $productsCategoriesAssociation, 'manufacturers_association' => $manufacturersAssociation, 'suppliers_association' => $suppliersAssociation, 'cms_association' => $cmsAssociation, 'special_pages_association' => $specialPagesAssociation, ); return $this->fetchTemplate('module/search_engine/visibility.tpl', $vars); } public function displayCriterionGroupForm($params) { $searchEngine = new AdvancedSearchClass($params['obj']->id_search); if (in_array($params['obj']->criterion_group_type, $this->criterionGroupIsTemplatisable)) { if ($params['obj']->criterion_group_type == 'attribute' && As4SearchEngineIndexation::isColorAttributesGroup($params['obj']->id_criterion_group_linked)) { $this->options_criteria_group_type[3] = $this->l('Link with color square'); $this->options_criteria_group_type[7] = $this->l('Color Square'); } elseif ($params['obj']->criterion_group_type == 'category' && $params['obj']->id_criterion_group_linked == 0) { $this->options_criteria_group_type[9] = $this->l('Level Depth'); } } $displayTypeClass = array(); foreach (array_keys($this->options_criteria_group_type) as $key) { $displayTypeClass[$key] = 'display_type-'.$key; } $newCustomCriterion = new AdvancedSearchCriterionClass(null, $params['obj']->id_search); $criterionsSortByOptions = array( 'position' => $this->l('Custom position'), 'o_position' => $this->l('Position in catalog'), 'alphabetic' => $this->l('Alphabetic'), 'numeric' => $this->l('Numeric'), 'nb_product' => $this->l('Products count'), ); if (!in_array($params['obj']->criterion_group_type, $this->originalPositionSortableCriterion)) { unset($criterionsSortByOptions['o_position']); } $criterionsSortWayOptions = array( 'ASC' => $this->l('Ascending'), 'DESC' => $this->l('Descending'), ); if ($searchEngine->filter_by_emplacement) { $contextType = array( 2 => $this->l('Root category'), 1 => $this->l('Parent category'), 0 => $this->l('Current category (context)'), ); } else { $contextType = array( 2 => $this->l('Root category'), ); } $vars = array( 'params' => $params, 'search_engine' => $searchEngine, 'display_type_type' => $displayTypeClass, 'display_type' => $this->options_criteria_group_type, 'context_type' => $contextType, 'display_vertical_search_block' => $this->display_vertical_search_block, 'sortable_criterion_group' => $this->sortableCriterion, 'new_custom_criterion' => $newCustomCriterion, 'is_color_group' => As4SearchEngineIndexation::isColorAttributesGroup($params['obj']->id_criterion_group_linked), 'criterions_sort_by' => $criterionsSortByOptions, 'criterions_sort_way' => $criterionsSortWayOptions, 'pm_load_function' => Tools::getValue('pm_load_function'), 'criteria_group_labels' => $this->criteriaGroupLabels, ); if (in_array($params['obj']->criterion_group_type, $this->sortableCriterion)) { $vars['criterions_list_rendered'] = $this->displaySortCriteriaPanel($params['obj']); } return $this->fetchTemplate('module/criterion_group/new.tpl', $vars); } protected function displaySortCriteriaPanel($objCrit = false) { if (Tools::getValue('pm_load_function') == 'displaySortCriteriaPanel') { $objCrit = new AdvancedSearchCriterionGroupClass(Tools::getValue('id_criterion_group'), Tools::getValue('id_search')); if (Tools::getValue('sort_way')) { $objCrit->sort_by = Tools::getValue('sort_by'); $objCrit->sort_way = Tools::getValue('sort_way'); $objCrit->save(); if ($objCrit->sort_by == 'o_position') { As4SearchEngineIndexation::indexCriterionsGroup($objCrit->id_search, $objCrit->criterion_group_type, $objCrit->id_criterion_group_linked, $objCrit->id, $objCrit->visible, false, true); } $msgConfirm = $this->l('Specific sort apply'); if ($objCrit->sort_by == 'position') { $msgConfirm .= '