private function _getCriteriaFromEmplacement($id_search, $id_category_root = false) { $cacheKey = sha1(serialize(func_get_args())); if (isset(self::$_getCriteriaFromEmplacementCache[$cacheKey])) { return self::$_getCriteriaFromEmplacementCache[$cacheKey]; } if ($id_category_root !== false && is_numeric($id_category_root) && (int) $id_category_root > 0) { $criterion = AdvancedSearchClass::getCriterionsWithIdGroupFromIdLinked('category', (int) $id_category_root, (int) $id_search); } else { if ($id_category = Tools::getIsset('id_category') ? (int) Tools::getValue('id_category') : (int) Tools::getValue('id_category_search')) { $criterion = AdvancedSearchClass::getCriterionsWithIdGroupFromIdLinked('category', $id_category, (int) $id_search); } elseif ($id_manufacturer = Tools::getIsset('id_manufacturer') ? (int) Tools::getValue('id_manufacturer') : (int) Tools::getValue('id_manufacturer_search')) { $criterion = AdvancedSearchClass::getCriterionsWithIdGroupFromIdLinked('manufacturer', $id_manufacturer, (int) $id_search); } elseif ($id_supplier = Tools::getIsset('id_supplier') ? (int) Tools::getValue('id_supplier') : (int) Tools::getValue('id_supplier_search')) { $criterion = AdvancedSearchClass::getCriterionsWithIdGroupFromIdLinked('supplier', $id_supplier, (int) $id_search); } } self::$_getCriteriaFromEmplacementCache[$cacheKey] = isset($criterion) && $criterion ? $criterion : array(); return self::$_getCriteriaFromEmplacementCache[$cacheKey]; }
public static function getCriterionsForSearchBloc($search, $id_criterion_group, $id_lang, $count_product = false, $selected_criterion = array(), $selected_criteria_groups_type = array(), $id_currency = false, $id_country = false, $id_group = false, $visible = false, $groupInfos = false, $base_selection = false, $criterion_groups) { if ($groupInfos['sort_by'] == '' || $groupInfos['sort_by'] == 'position' || !$id_lang) { $field_order_by = '`position`'; } elseif ($groupInfos['criterion_group_type'] == 'weight' || $groupInfos['criterion_group_type'] == 'width' || $groupInfos['criterion_group_type'] == 'height' || $groupInfos['criterion_group_type'] == 'depth') { $field_order_by = '`value`'; } elseif ($groupInfos['sort_by'] == 'numeric') { $field_order_by = 'CAST(REPLACE(IF(ac.`single_value` != "",ac.`single_value`,acl.`value`), ",", ".") AS DECIMAL(10,2))'; } elseif ($groupInfos['sort_by'] == 'nb_product') { $field_order_by = 'nb_product'; } else { $field_order_by = '`value`'; } $selected_criterion = PM_AdvancedSearch4::array_map_recursive('intval', $selected_criterion); $selected_criterion_copy = $selected_criterion; if (isset($selected_criterion[$id_criterion_group])) { unset($selected_criterion[$id_criterion_group]); } if (!$id_country) { $id_country = (int) (version_compare(_PS_VERSION_, '1.5.0.0', '>=') ? Context::getContext()->country->id : Country::getDefaultCountryId()); } $now = date('Y-m-d H:i:s'); $cacheKey = sha1(serialize(func_get_args()) . $id_country); if (isset(self::$_getCriterionsForSearchBlocCache[$cacheKey])) { return self::$_getCriterionsForSearchBlocCache[$cacheKey]; } $leftJoinWhereCriterion = self::makeLeftJoinWhereCriterion('getCriterionsForSearchBloc', $search, $id_lang, $selected_criterion, $selected_criteria_groups_type, $id_criterion_group, $groupInfos['criterion_group_type'] == 'attribute', $id_currency, $id_country, $id_group, false, false, $groupInfos['criterion_group_type'], $criterion_groups); if ($groupInfos['criterion_group_type'] == 'category' && !$groupInfos['id_criterion_group_linked'] && !$groupInfos['show_all_depth']) { if (isset($selected_criterion_copy[$id_criterion_group]) && sizeof($selected_criterion_copy[$id_criterion_group])) { $current_level_depth = self::getAsCriterionCategoryHigherLevelDepth($search['id_search'], $selected_criterion_copy[$id_criterion_group]); $current_linked_categories = self::getIdLinkedFromCriterion($selected_criterion_copy[$id_criterion_group], $search['id_search'], $current_level_depth); $leftJoinWhereCriterion['where'][] = $leftJoinWhereCriterion['whereUnion'][] = '(ac.`id_criterion` IN (' . implode(',', $selected_criterion_copy[$id_criterion_group]) . ') OR (ac.`level_depth` = ' . ((int) $current_level_depth + 1) . ' AND ac.`id_parent` IN (' . implode(',', $current_linked_categories) . ')))'; } else { $leftJoinWhereCriterion['where'][] = $leftJoinWhereCriterion['whereUnion'][] = 'ac.`level_depth` = 1'; } } if ($search['filter_by_emplacement'] && Tools::getValue('id_seo') == false && (Tools::getValue('id_manufacturer', Tools::getValue('id_manufacturer_search')) || Tools::getValue('id_supplier', Tools::getValue('id_supplier')))) { $id_manufacturer = Tools::getIsset('id_manufacturer') ? (int) Tools::getValue('id_manufacturer') : (int) Tools::getValue('id_manufacturer_search'); $id_supplier = Tools::getIsset('id_supplier') ? (int) Tools::getValue('id_supplier') : (int) Tools::getValue('id_supplier_search'); $preSelectedCriterion = array(); if ($id_manufacturer) { $preSelectedCriterion = AdvancedSearchClass::getCriterionsWithIdGroupFromIdLinked('manufacturer', $id_manufacturer, (int) $search['id_search']); } else { if ($id_supplier) { $preSelectedCriterion = AdvancedSearchClass::getCriterionsWithIdGroupFromIdLinked('supplier', $id_supplier, (int) $search['id_search']); } } if (is_array($preSelectedCriterion) && isset($preSelectedCriterion[$id_criterion_group]) && AdvancedSearchCoreClass::_isFilledArray($preSelectedCriterion[$id_criterion_group])) { $leftJoinWhereCriterion['where'][] = $leftJoinWhereCriterion['whereUnion'][] = '(ac.`id_criterion` IN (' . implode(',', $preSelectedCriterion[$id_criterion_group]) . '))'; } } if ($search['filter_by_emplacement'] && Tools::getValue('id_seo') !== false && is_numeric(Tools::getValue('id_seo')) && Tools::getValue('id_seo') > 0) { $search['selected_criteres_seo'] = array(); $seo_search = new AdvancedSearchSeoClass((int) Tools::getValue('id_seo')); if (Validate::isLoadedObject($seo_search) && isset($seo_search->criteria) && !empty($seo_search->criteria)) { $criteres_seo = @unserialize($seo_search->criteria); if (AdvancedSearchCoreClass::_isFilledArray($criteres_seo)) { foreach ($criteres_seo as $critere_seo) { $critere_seo = explode('_', $critere_seo); $id_criterion_group_seo = (int) $critere_seo[0]; $id_criterion_value = (int) $critere_seo[1]; if (isset($selected_criterion[$id_criterion_group_seo])) { if (!in_array($id_criterion_value, $selected_criterion[$id_criterion_group_seo])) { $search['selected_criteres_seo'][$id_criterion_group_seo][] = $id_criterion_value; } } else { $search['selected_criteres_seo'][$id_criterion_group_seo][] = $id_criterion_value; } } } } } if (isset($search['selected_criteres_seo']) && AdvancedSearchCoreClass::_isFilledArray($search['selected_criteres_seo']) && $search['filter_by_emplacement'] && Tools::getValue('id_seo') !== false && is_numeric(Tools::getValue('id_seo')) && Tools::getValue('id_seo') > 0) { $leftJoinWhereCriterion['where'][] = $leftJoinWhereCriterion['whereUnion'][] = '(ac.`id_criterion` IN (' . implode(',', $search['selected_criteres_seo'][$id_criterion_group]) . '))'; } if (self::isCategoryGroup($search['id_search'], $id_criterion_group, true)) { $current_category_depth = $groupInfos['id_criterion_group_linked']; if (is_array($selected_criterion_copy) && sizeof($selected_criterion_copy)) { foreach ($selected_criterion_copy as $id_criterion_group2 => $criteria2) { if ($selected_criteria_groups_type[$id_criterion_group2]['criterion_group_type'] == 'category' && $id_criterion_group2 != $id_criterion_group && $selected_criteria_groups_type[$id_criterion_group2]['id_criterion_group_linked'] < $current_category_depth) { if (!isset($prev_category_depth) || $prev_category_depth < $selected_criteria_groups_type[$id_criterion_group2]['id_criterion_group_linked']) { $prev_category_depth = $selected_criteria_groups_type[$id_criterion_group2]['id_criterion_group_linked']; $criteria_category_parent = $criteria2; } } } if (isset($criteria_category_parent)) { $childsCategoriesId = self::getChildsCategoriesId(self::getIdLinkedFromCriterion($criteria_category_parent, $search['id_search'])); $leftJoinWhereCriterion['where'][] = '(aclink.`id_criterion_linked` IN(' . implode(', ', $childsCategoriesId) . '))'; } } } if ($groupInfos['criterion_group_type'] == 'category') { $groups = FrontController::getCurrentCustomerGroups(); $leftJoinWhereCriterion['join'][] = $leftJoinWhereCriterion['joinUnion'][] = 'LEFT JOIN `' . _DB_PREFIX_ . 'category_group` cg ON ( cg.`id_category` = aclink.`id_criterion_linked`)'; $leftJoinWhereCriterion['where'][] = $leftJoinWhereCriterion['whereUnion'][] = 'cg.`id_group` ' . (count($groups) ? 'IN (' . implode(',', $groups) . ')' : '= 1'); } $query = ''; if ($leftJoinWhereCriterion['make_union']) { if ($groupInfos['sort_by'] == 'numeric') { $field_order_by = 'CAST(REPLACE(IF(`single_value` != "",`single_value`,`value`), ",", ".") AS DECIMAL(10,2))'; } $query .= 'SELECT * FROM ('; } $query .= 'SELECT ac.*, aclink.`id_criterion_linked` ' . ((int) $id_lang ? ', acl.id_lang, acl.icon' : '') . ', IF(ac.`single_value` != "",ac.`single_value`,acl.`value`) AS `value`, (' . (AdvancedSearchCoreClass::_isFilledArray($leftJoinWhereCriterion['count']) ? 'COUNT(DISTINCT ' . implode(' + ', $leftJoinWhereCriterion['count']) . ')' : 'COUNT(DISTINCT acpc.`id_cache_product`)') . ') AS nb_product' . ' FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int) $search['id_search'] . '` ac JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int) $search['id_search'] . '_link` aclink ON (ac.`id_criterion` = aclink.`id_criterion`) JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int) $search['id_search'] . '_list` aclist ON (ac.`id_criterion` = aclist.`id_criterion_parent`) ' . ($id_lang ? 'LEFT JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int) $search['id_search'] . '_lang` acl ON (ac.`id_criterion` = acl.`id_criterion` AND acl.`id_lang` = ' . (int) $id_lang . ')' : '') . ($search['display_empty_criteria'] ? 'LEFT ' : '') . 'JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_criterion_' . (int) $search['id_search'] . '` acpc ON (aclist.`id_criterion` = acpc.`id_criterion`) LEFT JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_' . (int) $search['id_search'] . '` acp ON ( ' . (AdvancedSearchCoreClass::_isFilledArray(PM_AdvancedSearch4::$productFilterList) ? ' acp.`id_product` IN (' . implode(',', PM_AdvancedSearch4::$productFilterList) . ') AND ' : '') . ' acp.`id_cache_product` = acpc.`id_cache_product`) ' . (AdvancedSearchCoreClass::_isFilledArray($leftJoinWhereCriterion['join']) ? implode(' ', $leftJoinWhereCriterion['join']) : '') . 'WHERE ' . (AdvancedSearchCoreClass::_isFilledArray(PM_AdvancedSearch4::$productFilterList) ? ' acp.`id_product` IN (' . implode(',', PM_AdvancedSearch4::$productFilterList) . ') AND ' : '') . ' ac.`id_criterion_group` = ' . (int) $id_criterion_group . ($visible ? ' AND ac.`visible` = 1' : '') . ' AND ' . (AdvancedSearchCoreClass::_isFilledArray($leftJoinWhereCriterion['where']) ? implode(' AND ', $leftJoinWhereCriterion['where']) : '1') . ' GROUP BY ac.`id_criterion`' . ($leftJoinWhereCriterion['make_union'] ? '' : ' ORDER BY ' . $field_order_by . ' ' . $groupInfos['sort_way']); if ($leftJoinWhereCriterion['make_union']) { $query .= ' UNION SELECT ac.*, aclink.`id_criterion_linked`, acl.id_lang, acl.icon, IF(ac.`single_value` != "",ac.`single_value`,acl.`value`) AS `value`, 0 AS nb_product FROM `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int) $search['id_search'] . '` ac JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int) $search['id_search'] . '_link` aclink ON (ac.`id_criterion` = aclink.`id_criterion`) JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int) $search['id_search'] . '_list` aclist ON (ac.`id_criterion` = aclist.`id_criterion`) LEFT JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_criterion_' . (int) $search['id_search'] . '_lang` acl ON (ac.`id_criterion` = acl.`id_criterion` AND acl.`id_lang` = ' . (int) $id_lang . ') ' . (AdvancedSearchCoreClass::_isFilledArray($leftJoinWhereCriterion['joinUnion']) ? implode(' ', $leftJoinWhereCriterion['joinUnion']) : '') . ($base_selection ? ' JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_criterion_' . (int) $search['id_search'] . '` acpc ON (aclist.`id_criterion` = acpc.`id_criterion`) JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_' . (int) $search['id_search'] . '` acp ON ( ' . (AdvancedSearchCoreClass::_isFilledArray(PM_AdvancedSearch4::$productFilterList) ? ' acp.`id_product` IN (' . implode(',', PM_AdvancedSearch4::$productFilterList) . ') AND ' : '') . ' acp.`id_cache_product` = acpc.`id_cache_product`) JOIN `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_criterion_' . (int) $search['id_search'] . '` acpc2 ON ( acp.`id_cache_product` = acpc2.`id_cache_product` AND acpc2.`id_criterion` IN(' . implode(', ', $base_selection) . ')) ' : '') . ' WHERE ' . ($base_selection && AdvancedSearchCoreClass::_isFilledArray(PM_AdvancedSearch4::$productFilterList) ? ' acp.`id_product` IN (' . implode(',', PM_AdvancedSearch4::$productFilterList) . ') AND ' : '') . ' ac.`id_criterion_group` = ' . (int) $id_criterion_group . ($visible ? ' AND ac.`visible` = 1' : '') . ' AND ' . (AdvancedSearchCoreClass::_isFilledArray($leftJoinWhereCriterion['whereUnion']) ? implode(' AND ', $leftJoinWhereCriterion['whereUnion']) : '1') . ' GROUP BY ac.`id_criterion` ) as tmp GROUP BY `id_criterion` ORDER BY ' . $field_order_by . ' ' . $groupInfos['sort_way']; } self::$_getCriterionsForSearchBlocCache[$cacheKey] = Db::getInstance()->ExecuteS($query); return self::$_getCriterionsForSearchBlocCache[$cacheKey]; }