Пример #1
0
 public static function indexCriterionsGroup($criterions_group_type, $id_criterion_group_linked, $objSearch, $visible = 1, $checkIfIsIndexed = true, $update = false, $id_product = false, $id_criterion_linked = false, $criterion_value = false)
 {
     global $cookie;
     $objSearch->updateCacheProduct();
     if ($checkIfIsIndexed && self::criterionsGroupIsIndexed($criterions_group_type, $id_criterion_group_linked, $objSearch->id)) {
         self::desIndexCriterionsGroup($criterions_group_type, $id_criterion_group_linked, $objSearch->id, true, true);
     }
     $id_criterion_group = false;
     if ($update) {
         $id_criterion_group = AdvancedSearchCriterionGroupClass::getIdCriterionGroupByTypeAndIdLinked($objSearch->id, $criterions_group_type, $id_criterion_group_linked);
         if (!$id_criterion_group) {
             return;
         }
         if (!$id_product) {
             if ($criterions_group_type == 'price') {
                 self::deleteCachePriceGroup($objSearch->id, $id_criterion_group);
             } else {
                 self::deleteCacheCriterionGroup($objSearch->id, $id_criterion_group);
             }
         }
     }
     if ($criterions_group_type == 'attribute') {
         $criterions_group = AdvancedSearchClass::getAttributeGroups($id_criterion_group_linked, false);
     } elseif ($criterions_group_type == 'feature') {
         $criterions_group = AdvancedSearchClass::getFeature($id_criterion_group_linked, false);
     } elseif ($criterions_group_type == 'category') {
         $criterions_group = array('name' => Module::getInstanceByName('pm_advancedsearch4')->translateMultiple('categories', $id_criterion_group_linked));
     } else {
         $criterions_group = array('name' => Module::getInstanceByName('pm_advancedsearch4')->translateMultiple($criterions_group_type));
     }
     if (!isset($criterions_group['name'][Configuration::get('PS_LANG_DEFAULT')]) || !trim($criterions_group['name'][Configuration::get('PS_LANG_DEFAULT')])) {
         return;
     }
     $objAdvancedSearchCriterionGroupClass = new AdvancedSearchCriterionGroupClass($id_criterion_group, $objSearch->id);
     if (!$update) {
         $objAdvancedSearchCriterionGroupClass->name = $criterions_group['name'];
     }
     $objAdvancedSearchCriterionGroupClass->visible = (int) $visible;
     if (!$visible) {
         $objAdvancedSearchCriterionGroupClass->position = 100;
     }
     $objAdvancedSearchCriterionGroupClass->criterion_group_type = $criterions_group_type;
     $objAdvancedSearchCriterionGroupClass->id_criterion_group_linked = $id_criterion_group_linked;
     if ($criterions_group_type == 'on_sale' || $criterions_group_type == 'stock' || $criterions_group_type == 'available_for_order' || $criterions_group_type == 'online_only' || $criterions_group_type == 'pack') {
         $objAdvancedSearchCriterionGroupClass->is_multicriteria = true;
         $objAdvancedSearchCriterionGroupClass->display_type = 4;
     }
     if ($objAdvancedSearchCriterionGroupClass->save()) {
         if ($criterions_group_type != 'price') {
             if ($criterions_group_type == 'attribute') {
                 $criterions = AdvancedSearchClass::getAttributes($criterions_group['id_attribute_group'], false, $id_criterion_linked);
             } elseif ($criterions_group_type == 'feature') {
                 $criterions = AdvancedSearchClass::getFeatureValuesFromValue($criterions_group['id_feature'], $cookie->id_lang, $criterion_value);
             } elseif ($criterions_group_type == 'manufacturer') {
                 $criterions = AdvancedSearchClass::getManufacturers(false, $id_criterion_linked);
             } elseif ($criterions_group_type == 'supplier') {
                 $criterions = AdvancedSearchClass::getSuppliers(false, $id_criterion_linked);
             } elseif ($criterions_group_type == 'category') {
                 $criterions = AdvancedSearchClass::getCategoriesP(false, $id_criterion_linked, $id_criterion_group_linked, $objSearch->id);
             } elseif ($criterions_group_type == 'on_sale' || $criterions_group_type == 'stock' || $criterions_group_type == 'available_for_order' || $criterions_group_type == 'online_only' || $criterions_group_type == 'pack') {
                 $criterions = self::getBooleanTrueCriteria();
             } elseif ($criterions_group_type == 'weight' || $criterions_group_type == 'width' || $criterions_group_type == 'height' || $criterions_group_type == 'depth') {
                 $criterions = self::getProductsFieldValues($criterions_group_type, $criterion_value);
             } elseif ($criterions_group_type == 'condition') {
                 $criterions = self::getConditionCriteria($criterion_value);
             }
             $sql_insert_multiple = array();
             $sql_insert_multiple_header = 'INSERT IGNORE INTO `' . _DB_PREFIX_ . 'pm_advancedsearch_cache_product_criterion_' . (int) $objSearch->id . '` (`id_cache_product`, `id_criterion`) VALUES ';
             $position = -1;
             $current_criterion_keys = array_keys($criterions);
             while (sizeof($criterions)) {
                 $position++;
                 $current_criterion = array_shift($current_criterion_keys);
                 $row = $criterions[$current_criterion];
                 unset($criterions[$current_criterion]);
                 self::$current_indexation++;
                 if ($criterions_group_type == 'category' && self::$current_indexation == self::$limit_indexation) {
                     self::$start_indexation += self::$limit_indexation;
                     $criterions = AdvancedSearchClass::getCategoriesP(false, $id_criterion_linked, $id_criterion_group_linked, $objSearch->id);
                     self::$current_indexation = 0;
                     $current_criterion_keys = array_keys($criterions);
                     $current_criterion = array_shift($current_criterion_keys);
                 }
                 if ((!isset($row['single_value']) || !$row['single_value']) && (!isset($row['name'][Configuration::get('PS_LANG_DEFAULT')]) || !strlen(trim($row['name'][Configuration::get('PS_LANG_DEFAULT')])))) {
                     continue;
                 }
                 if ($criterions_group_type == 'attribute') {
                     $current_id_criterion_linked = $row['id_attribute'];
                 } elseif ($criterions_group_type == 'feature') {
                     $current_id_criterion_linked = $row['id_feature_value'];
                 } elseif ($criterions_group_type == 'manufacturer') {
                     $current_id_criterion_linked = $row['id_manufacturer'];
                 } elseif ($criterions_group_type == 'supplier') {
                     $current_id_criterion_linked = $row['id_supplier'];
                 } elseif ($criterions_group_type == 'category') {
                     $current_id_criterion_linked = $row['id_category'];
                 } elseif ($criterions_group_type == 'on_sale' || $criterions_group_type == 'stock' || $criterions_group_type == 'available_for_order' || $criterions_group_type == 'online_only' || $criterions_group_type == 'pack') {
                     $current_id_criterion_linked = $row['value'];
                 } elseif ($criterions_group_type == 'weight' || $criterions_group_type == 'width' || $criterions_group_type == 'height' || $criterions_group_type == 'depth') {
                     $current_id_criterion_linked = $row['single_value'];
                 } elseif ($criterions_group_type == 'condition') {
                     $current_id_criterion_linked = 0;
                     $criterion_value = $row['name'][$cookie->id_lang];
                 }
                 if ($criterions_group_type == 'feature') {
                     if (isset($row['custom']) && $row['custom']) {
                         $criterion_value = $row['name'][Configuration::get('PS_LANG_DEFAULT')];
                     } else {
                         $criterion_value = null;
                     }
                 }
                 $id_criterion = false;
                 if ($update) {
                     if ($id_criterion_linked) {
                         $id_criterion = AdvancedSearchCriterionClass::getIdCriterionByTypeAndIdLinked($objSearch->id, $criterions_group_type, $id_criterion_group_linked, $id_criterion_linked);
                     } elseif ($criterion_value && ($criterions_group_type == 'weight' || $criterions_group_type == 'width' || $criterions_group_type == 'height' || $criterions_group_type == 'depth')) {
                         $id_criterion = AdvancedSearchCriterionClass::getIdCriterionByTypeAndSingleValue($objSearch->id, $criterions_group_type, $id_criterion_group_linked, $criterion_value);
                     } elseif ($criterion_value) {
                         $id_criterion = AdvancedSearchCriterionClass::getIdCriterionByTypeAndValue($objSearch->id, $cookie->id_lang, $criterions_group_type, $id_criterion_group_linked, $criterion_value);
                         if (!$id_criterion && $cookie->id_lang != Configuration::get('PS_LANG_DEFAULT') && $criterions_group_type == 'feature' && isset($row['custom']) && $row['custom'] && isset($row['name'][$cookie->id_lang])) {
                             $criterion_value = $row['name'][$cookie->id_lang];
                             $id_criterion = AdvancedSearchCriterionClass::getIdCriterionByTypeAndValue($objSearch->id, $cookie->id_lang, $criterions_group_type, $id_criterion_group_linked, $criterion_value);
                         }
                     } elseif ($current_id_criterion_linked && ($criterions_group_type == 'weight' || $criterions_group_type == 'width' || $criterions_group_type == 'height' || $criterions_group_type == 'depth')) {
                         $id_criterion = AdvancedSearchCriterionClass::getIdCriterionByTypeAndSingleValue($objSearch->id, $criterions_group_type, $id_criterion_group_linked, $current_id_criterion_linked);
                     } elseif ($current_id_criterion_linked) {
                         $id_criterion = AdvancedSearchCriterionClass::getIdCriterionByTypeAndIdLinked($objSearch->id, $criterions_group_type, $id_criterion_group_linked, $current_id_criterion_linked);
                     }
                 }
                 $objAdvancedSearchCriterionClassOld = false;
                 $objAdvancedSearchCriterionClass = new AdvancedSearchCriterionClass($id_criterion, $objSearch->id);
                 if (Validate::isLoadedObject($objAdvancedSearchCriterionClass)) {
                     $objAdvancedSearchCriterionClassOld = $objAdvancedSearchCriterionClass;
                 }
                 if ($criterions_group_type == 'attribute' || $criterions_group_type == 'feature' || $criterions_group_type == 'manufacturer' || $criterions_group_type == 'supplier' || $criterions_group_type == 'category' || $criterions_group_type == 'on_sale' || $criterions_group_type == 'stock' || $criterions_group_type == 'available_for_order' || $criterions_group_type == 'online_only' || $criterions_group_type == 'condition' || $criterions_group_type == 'pack') {
                     $objAdvancedSearchCriterionClass->value = $row['name'];
                 }
                 if (isset($row['single_value']) && $row['single_value']) {
                     $objAdvancedSearchCriterionClass->single_value = $row['single_value'];
                 }
                 if (!isset($objAdvancedSearchCriterionClass->value) && isset($objAdvancedSearchCriterionClass->single_value)) {
                     foreach (Language::getLanguages(false) as $lang) {
                         $objAdvancedSearchCriterionClass->value[$lang['id_lang']] = ' ';
                     }
                 }
                 if ($criterions_group_type == 'attribute' && $row['color']) {
                     $objAdvancedSearchCriterionClass->color = $row['color'];
                 }
                 $objAdvancedSearchCriterionClass->id_criterion_group = $objAdvancedSearchCriterionGroupClass->id;
                 $objAdvancedSearchCriterionClass->id_criterion_linked = $current_id_criterion_linked;
                 if ($criterions_group_type == 'category') {
                     $objAdvancedSearchCriterionClass->level_depth = $row['level_depth'];
                     $objAdvancedSearchCriterionClass->id_parent = $row['id_parent'];
                 }
                 if (!$update) {
                     $objAdvancedSearchCriterionClass->position = $position;
                 }
                 if (!$id_product) {
                     if ($criterions_group_type == 'attribute') {
                         $productsIdCache = AdvancedSearchClass::getProductsIdFromAttribute($objSearch->id, $row['id_attribute']);
                     } elseif ($criterions_group_type == 'feature') {
                         $productsIdCache = AdvancedSearchClass::getProductsIdFromFeatureValue($objSearch->id, $criterions_group['id_feature'], $row['name'][Configuration::get('PS_LANG_DEFAULT')], Configuration::get('PS_LANG_DEFAULT'));
                     } elseif ($criterions_group_type == 'manufacturer') {
                         $productsIdCache = AdvancedSearchClass::getProductsIdFromManufacturer($objSearch->id, $row['id_manufacturer']);
                     } elseif ($criterions_group_type == 'supplier') {
                         $productsIdCache = AdvancedSearchClass::getProductsIdFromSupplier($objSearch->id, $row['id_supplier']);
                     } elseif ($criterions_group_type == 'category') {
                         $productsIdCache = AdvancedSearchClass::getProductsIdFromCategory($objSearch->id, $row['id_category'], $objSearch->recursing_indexing);
                     } elseif ($criterions_group_type == 'on_sale' || $criterions_group_type == 'stock' || $criterions_group_type == 'available_for_order' || $criterions_group_type == 'online_only' || $criterions_group_type == 'condition' || $criterions_group_type == 'pack') {
                         $productsIdCache = AdvancedSearchClass::getProductsIdFromProductField($objSearch->id, $row['value'], $criterions_group_type);
                     } elseif ($criterions_group_type == 'weight' || $criterions_group_type == 'width' || $criterions_group_type == 'height' || $criterions_group_type == 'depth') {
                         $productsIdCache = AdvancedSearchClass::getProductsIdFromProductField($objSearch->id, $row['single_value'], $criterions_group_type);
                     }
                 } else {
                     $productsIdCache = array(array('id_cache_product' => self::getIdCacheProductFromIdProduct($objSearch->id, $id_product)));
                 }
                 if ($objAdvancedSearchCriterionClassOld !== false && sha1(serialize($objAdvancedSearchCriterionClass)) == sha1(serialize($objAdvancedSearchCriterionClassOld)) || $objAdvancedSearchCriterionClass->save()) {
                     foreach ($productsIdCache as $row) {
                         $sql_insert_multiple[] = '(' . (int) $row['id_cache_product'] . ', ' . (int) $objAdvancedSearchCriterionClass->id . ')';
                         self::sqlBulkInsert($sql_insert_multiple_header, $sql_insert_multiple, 200);
                     }
                     self::sqlBulkInsert($sql_insert_multiple_header, $sql_insert_multiple, 1);
                 }
             }
             unset($criterions, $productsIdCache);
             self::sqlBulkInsert($sql_insert_multiple_header, $sql_insert_multiple, 1);
         } elseif ($criterions_group_type == 'price') {
             AdvancedSearchClass::setProductsPrices($objSearch->id, $objAdvancedSearchCriterionGroupClass->id, $id_product);
             AdvancedSearchClass::setProductsSpecificPrices($objSearch->id, $objAdvancedSearchCriterionGroupClass->id, $id_product);
         }
     }
     self::$start_indexation = 0;
     self::$limit_indexation = 1000;
     self::$current_indexation = 0;
     return $objAdvancedSearchCriterionGroupClass->id;
 }