diff --git a/classes/Combination.php b/classes/Combination.php index bb6c55094..fc11d10ed 100644 --- a/classes/Combination.php +++ b/classes/Combination.php @@ -44,7 +44,7 @@ class CombinationCore extends ObjectModel public $price; public $ecotax; - + public $minimal_quantity = 1; public $quantity; @@ -207,8 +207,18 @@ class CombinationCore extends ObjectModel return parent::isCurrentlyUsed('product_attribute'); } + /** + * For a given product_attribute reference, returns the corresponding id + * + * @param int $id_product + * @param string $reference + * @return int id + */ public static function getIdByReference($id_product, $reference) { + if (empty($reference)) + return 0; + $query = new DbQuery(); $query->select('pa.id_product_attribute'); $query->from('product_attribute', 'pa'); diff --git a/controllers/admin/AdminImportController.php b/controllers/admin/AdminImportController.php index 426824022..e0da0e34b 100644 --- a/controllers/admin/AdminImportController.php +++ b/controllers/admin/AdminImportController.php @@ -1420,6 +1420,12 @@ class AdminImportControllerCore extends AdminController } } + // inits attribute + $id_product_attribute = 0; + $id_product_attribute_update = false; + $attributes_to_add = array(); + + // for each attribute foreach (explode($fsep, $info['attribute']) as $key => $attribute) { $tab_attribute = explode(':', $attribute); @@ -1451,10 +1457,45 @@ class AdminImportControllerCore extends AdminController $this->errors[] = ($field_error !== true ? $field_error : '').($lang_field_error !== true ? $lang_field_error : ''); } - $id_product_attribute = Combination::getIdByReference($product->id, strval($info['reference'])); - $attribute_combinations = $product->getAttributeCombinations($default_language); + // if a reference is specified for this product, get the associate id_product_attribute to UPDATE + if (isset($info['reference']) && !empty($info['reference'])) + { + $id_product_attribute = Combination::getIdByReference($product->id, strval($info['reference'])); - if (!count($attribute_combinations)) + // updates the attribute + if ($id_product_attribute) + { + // gets all the combinations of this product + $attribute_combinations = $product->getAttributeCombinations($default_language); + foreach ($attribute_combinations as $attribute_combination) + { + if ($id_product_attribute && in_array($id_product_attribute, $attribute_combination)) + { + $product->updateAttribute( + $id_product_attribute, + (float)$info['wholesale_price'], + (float)$info['price'], + (float)$info['weight'], + 0, + (float)$info['ecotax'], + $id_image, + strval($info['reference']), + strval($info['ean13']), + (int)$info['default_on'], + 0, + strval($info['upc']), + (int)$info['quantity'], + 0 + ); + + $id_product_attribute_update = true; + } + } + } + } + + // if no attribute reference is specified, creates a new one + if (!$id_product_attribute) { $id_product_attribute = $product->addAttribute( (float)$info['price'], @@ -1469,63 +1510,10 @@ class AdminImportControllerCore extends AdminController strval($info['upc']), (int)$info['quantity'] ); - - Db::getInstance()->execute(' - INSERT INTO '._DB_PREFIX_.'product_attribute_combination (id_attribute, id_product_attribute) - VALUES ('.(int)$attributes[$group.'_'.$attribute].','.(int)$id_product_attribute.') - '); } - foreach ($attribute_combinations as $attribute_combination) - { - if ($id_product_attribute && in_array($id_product_attribute, $attribute_combination)) - { - $product->updateAttribute( - $id_product_attribute, - (float)$info['wholesale_price'], - (float)$info['price'], - (float)$info['weight'], - 0, - (float)$info['ecotax'], - $id_image, - strval($info['reference']), - strval($info['ean13']), - (int)$info['default_on'], - 0, - strval($info['upc']), - (int)$info['quantity'], - 0 - ); - // update - Db::getInstance()->execute(' - UPDATE '._DB_PREFIX_.'product_attribute_combination - SET id_attribute = '.(int)$attributes[$group.'_'.$attribute].' - WHERE id_product_attribute = '.(int)$id_product_attribute); - - } - else - { - // insert - $id_product_attribute = $product->addAttribute( - (float)$info['price'], - (float)$info['weight'], - 0, - (float)$info['ecotax'], - $id_image, - strval($info['reference']), - strval($info['ean13']), - (int)$info['default_on'], - 0, - strval($info['upc']), - (int)$info['quantity'] - ); - - Db::getInstance()->execute(' - INSERT INTO '._DB_PREFIX_.'product_attribute_combination (id_attribute, id_product_attribute) - VALUES ('.(int)$attributes[$group.'_'.$attribute].','.(int)$id_product_attribute.') - '); - } - } + // fills our attributes array, in order to add the attributes to the product_attribute afterwards + $attributes_to_add[] = (int)$attributes[$group.'_'.$attribute]; // after insertion, we clean attribute position and group attribute position $obj = new Attribute(); @@ -1533,6 +1521,24 @@ class AdminImportControllerCore extends AdminController AttributeGroup::cleanPositions(); } } + + // now adds the attributes in the attribute_combination table + if ($id_product_attribute) + { + if ($id_product_attribute_update) + { + Db::getInstance()->execute(' + DELETE FROM '._DB_PREFIX_.'product_attribute_combination + WHERE id_product_attribute = '.(int)$id_product_attribute); + } + + foreach ($attributes_to_add as $attribute_to_add) + { + Db::getInstance()->execute(' + INSERT INTO '._DB_PREFIX_.'product_attribute_combination (id_attribute, id_product_attribute) + VALUES ('.(int)$attribute_to_add.','.(int)$id_product_attribute.')'); + } + } } $this->closeCsvFile($handle);