public function processProductAttribute() { // Don't process if the combination fields have not been submitted if (!Combination::isFeatureActive() || !Tools::getValue('attribute_combination_list')) { return; } if (Validate::isLoadedObject($product = $this->object)) { if ($this->isProductFieldUpdated('attribute_price') && (!Tools::getIsset('attribute_price') || Tools::getIsset('attribute_price') == null)) { $this->errors[] = Tools::displayError('The price attribute is required.'); } if (!Tools::getIsset('attribute_combination_list') || Tools::isEmpty(Tools::getValue('attribute_combination_list'))) { $this->errors[] = Tools::displayError('You must add at least one attribute.'); } $array_checks = array('reference' => 'isReference', 'supplier_reference' => 'isReference', 'location' => 'isReference', 'ean13' => 'isEan13', 'upc' => 'isUpc', 'wholesale_price' => 'isPrice', 'price' => 'isPrice', 'ecotax' => 'isPrice', 'quantity' => 'isInt', 'weight' => 'isUnsignedFloat', 'unit_price_impact' => 'isPrice', 'default_on' => 'isBool', 'minimal_quantity' => 'isUnsignedInt', 'available_date' => 'isDateFormat'); foreach ($array_checks as $property => $check) { if (Tools::getValue('attribute_' . $property) !== false && !call_user_func(array('Validate', $check), Tools::getValue('attribute_' . $property))) { $this->errors[] = sprintf(Tools::displayError('Field %s is not valid'), $property); } } if (!count($this->errors)) { if (!isset($_POST['attribute_wholesale_price'])) { $_POST['attribute_wholesale_price'] = 0; } if (!isset($_POST['attribute_price_impact'])) { $_POST['attribute_price_impact'] = 0; } if (!isset($_POST['attribute_weight_impact'])) { $_POST['attribute_weight_impact'] = 0; } if (!isset($_POST['attribute_ecotax'])) { $_POST['attribute_ecotax'] = 0; } if (Tools::getValue('attribute_default')) { $product->deleteDefaultAttributes(); } // Change existing one if (($id_product_attribute = (int) Tools::getValue('id_product_attribute')) || ($id_product_attribute = $product->productAttributeExists(Tools::getValue('attribute_combination_list'), false, null, true, true))) { if ($this->tabAccess['edit'] === '1') { if ($this->isProductFieldUpdated('available_date_attribute') && (Tools::getValue('available_date_attribute') != '' && !Validate::isDateFormat(Tools::getValue('available_date_attribute')))) { $this->errors[] = Tools::displayError('Invalid date format.'); } else { $product->updateAttribute((int) $id_product_attribute, $this->isProductFieldUpdated('attribute_wholesale_price') ? Tools::getValue('attribute_wholesale_price') : null, $this->isProductFieldUpdated('attribute_price_impact') ? Tools::getValue('attribute_price') * Tools::getValue('attribute_price_impact') : null, $this->isProductFieldUpdated('attribute_weight_impact') ? Tools::getValue('attribute_weight') * Tools::getValue('attribute_weight_impact') : null, $this->isProductFieldUpdated('attribute_unit_impact') ? Tools::getValue('attribute_unity') * Tools::getValue('attribute_unit_impact') : null, $this->isProductFieldUpdated('attribute_ecotax') ? Tools::getValue('attribute_ecotax') : null, Tools::getValue('id_image_attr'), Tools::getValue('attribute_reference'), Tools::getValue('attribute_ean13'), $this->isProductFieldUpdated('attribute_default') ? Tools::getValue('attribute_default') : null, Tools::getValue('attribute_location'), Tools::getValue('attribute_upc'), $this->isProductFieldUpdated('attribute_minimal_quantity') ? Tools::getValue('attribute_minimal_quantity') : null, $this->isProductFieldUpdated('available_date_attribute') ? Tools::getValue('available_date_attribute') : null, false); StockAvailable::setProductDependsOnStock((int) $product->id, $product->depends_on_stock, null, (int) $id_product_attribute); StockAvailable::setProductOutOfStock((int) $product->id, $product->out_of_stock, null, (int) $id_product_attribute); } } else { $this->errors[] = Tools::displayError('You do not have permission to add this.'); } } else { if ($this->tabAccess['add'] === '1') { if ($product->productAttributeExists(Tools::getValue('attribute_combination_list'))) { $this->errors[] = Tools::displayError('This combination already exists.'); } else { $id_product_attribute = $product->addCombinationEntity(Tools::getValue('attribute_wholesale_price'), Tools::getValue('attribute_price') * Tools::getValue('attribute_price_impact'), Tools::getValue('attribute_weight') * Tools::getValue('attribute_weight_impact'), Tools::getValue('attribute_unity') * Tools::getValue('attribute_unit_impact'), Tools::getValue('attribute_ecotax'), 0, Tools::getValue('id_image_attr'), Tools::getValue('attribute_reference'), null, Tools::getValue('attribute_ean13'), Tools::getValue('attribute_default'), Tools::getValue('attribute_location'), Tools::getValue('attribute_upc'), Tools::getValue('attribute_minimal_quantity'), array(), Tools::getValue('available_date_attribute')); StockAvailable::setProductDependsOnStock((int) $product->id, $product->depends_on_stock, null, (int) $id_product_attribute); StockAvailable::setProductOutOfStock((int) $product->id, $product->out_of_stock, null, (int) $id_product_attribute); } } else { $this->errors[] = Tools::displayError('You do not have permission to') . '<hr>' . Tools::displayError('edit here.'); } } if (!count($this->errors)) { $combination = new Combination((int) $id_product_attribute); $combination->setAttributes(Tools::getValue('attribute_combination_list')); // images could be deleted before $id_images = Tools::getValue('id_image_attr'); if (!empty($id_images)) { $combination->setImages($id_images); } $product->checkDefaultAttributes(); if (Tools::getValue('attribute_default')) { Product::updateDefaultAttribute((int) $product->id); if (isset($id_product_attribute)) { $product->cache_default_attribute = (int) $id_product_attribute; } if ($available_date = Tools::getValue('available_date_attribute')) { $product->setAvailableDate($available_date); } } } } } }
/** * Add a product attribute * @since 1.5.0.1 * * @param float $price Additional price * @param float $weight Additional weight * @param float $ecotax Additional ecotax * @param integer $id_images Image ids * @param string $reference Reference * @param string $location Location * @param string $ean13 Ean-13 barcode * @param boolean $default Is default attribute for product * @param integer $minimal_quantity Minimal quantity to add to cart * @return mixed $id_product_attribute or false */ public function addAttribute($price, $weight, $unit_impact, $ecotax, $id_images, $reference, $ean13, $default, $location = null, $upc = null, $minimal_quantity = 1, array $id_shop_list = array()) { if (!$this->id) { return; } $price = str_replace(',', '.', $price); $weight = str_replace(',', '.', $weight); $combination = new Combination(); $combination->id_product = (int) $this->id; $combination->price = (double) $price; $combination->ecotax = (double) $ecotax; $combination->quantity = 0; $combination->weight = (double) $weight; $combination->unit_price_impact = (double) $unit_impact; $combination->reference = pSQL($reference); $combination->location = pSQL($location); $combination->ean13 = pSQL($ean13); $combination->upc = pSQL($upc); $combination->default_on = (int) $default; $combination->minimal_quantity = (int) $minimal_quantity; // if we add a combination for this shop and this product does not use the combination feature in other shop, // we clone the default combination in every shop linked to this product if ($default && !$this->hasAttributesInOtherShops()) { $id_shop_list_array = Product::getShopsByProduct($this->id); foreach ($id_shop_list_array as $array_shop) { $id_shop_list[] = $array_shop['id_shop']; } } if (count($id_shop_list)) { $combination->id_shop_list = $id_shop_list; } $combination->add(); if (!$combination->id) { return false; } Product::updateDefaultAttribute($this->id); if (!empty($id_images)) { $combination->setImages($id_images); } return (int) $combination->id; }
/** * Add a product attribute * @since 1.5.0.1 * * @param float $price Additional price * @param float $weight Additional weight * @param float $ecotax Additional ecotax * @param integer $id_images Image ids * @param string $reference Reference * @param string $location Location * @param string $ean13 Ean-13 barcode * @param boolean $default Is default attribute for product * @param integer $minimal_quantity Minimal quantity to add to cart * @return mixed $id_product_attribute or false */ public function addAttribute($price, $weight, $unit_impact, $ecotax, $id_images, $reference, $ean13, $default, $location = null, $upc = null, $minimal_quantity = 1, array $id_shop_list = array(), $available_date = null) { if (!$this->id) { return; } $price = str_replace(',', '.', $price); $weight = str_replace(',', '.', $weight); $combination = new Combination(); $combination->id_product = (int) $this->id; $combination->price = (double) $price; $combination->ecotax = (double) $ecotax; $combination->quantity = 0; $combination->weight = (double) $weight; $combination->unit_price_impact = (double) $unit_impact; $combination->reference = pSQL($reference); $combination->location = pSQL($location); $combination->ean13 = pSQL($ean13); $combination->upc = pSQL($upc); $combination->default_on = (int) $default; $combination->minimal_quantity = (int) $minimal_quantity; $combination->available_date = $available_date; if (count($id_shop_list)) { $combination->id_shop_list = array_unique($id_shop_list); } $combination->add(); if (!$combination->id) { return false; } $id_default_attribute = Product::updateDefaultAttribute($this->id); if ($id_default_attribute) { $this->cache_default_attribute = $id_default_attribute; } if (!empty($id_images)) { $combination->setImages($id_images); } Tools::clearColorListCache($this->id); return (int) $combination->id; }
/** * Add a product attribute * @since 1.5.0.1 * * @param float $price Additional price * @param float $weight Additional weight * @param float $ecotax Additional ecotax * @param int $id_images Image ids * @param string $reference Reference * @param string $location Location * @param string $ean13 Ean-13 barcode * @param bool $default Is default attribute for product * @param int $minimal_quantity Minimal quantity to add to cart * @return mixed $id_product_attribute or false */ public function addAttribute($price, $weight, $unit_impact, $ecotax, $id_images, $reference, $ean13, $default, $location = null, $upc = null, $minimal_quantity = 1, array $id_shop_list = array(), $available_date = null) { if (!$this->id) { return; } $price = str_replace(',', '.', $price); $weight = str_replace(',', '.', $weight); $combination = new Combination(); $combination->id_product = (int) $this->id; $combination->price = (double) $price; $combination->ecotax = (double) $ecotax; $combination->quantity = 0; $combination->weight = (double) $weight; $combination->unit_price_impact = (double) $unit_impact; $combination->reference = pSQL($reference); $combination->location = pSQL($location); $combination->ean13 = pSQL($ean13); $combination->upc = pSQL($upc); $combination->default_on = (int) $default; $combination->minimal_quantity = (int) $minimal_quantity; $combination->available_date = $available_date; if (count($id_shop_list)) { $combination->id_shop_list = array_unique($id_shop_list); } $combination->add(); if (!$combination->id) { return false; } $total_quantity = (int) Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' SELECT SUM(quantity) as quantity FROM ' . _DB_PREFIX_ . 'stock_available WHERE id_product = ' . (int) $this->id . ' AND id_product_attribute <> 0 '); if (!$total_quantity) { Db::getInstance()->update('stock_available', array('quantity' => 0), '`id_product` = ' . $this->id); } $id_default_attribute = Product::updateDefaultAttribute($this->id); if ($id_default_attribute) { $this->cache_default_attribute = $id_default_attribute; if (!$combination->available_date) { $this->setAvailableDate(); } } if (!empty($id_images)) { $combination->setImages($id_images); } Tools::clearColorListCache($this->id); if (Configuration::get('PS_DEFAULT_WAREHOUSE_NEW_PRODUCT') != 0 && Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) { $warehouse_location_entity = new WarehouseProductLocation(); $warehouse_location_entity->id_product = $this->id; $warehouse_location_entity->id_product_attribute = (int) $combination->id; $warehouse_location_entity->id_warehouse = Configuration::get('PS_DEFAULT_WAREHOUSE_NEW_PRODUCT'); $warehouse_location_entity->location = pSQL(''); $warehouse_location_entity->save(); } return (int) $combination->id; }
protected function importProductsAttributes() { $this->truncateTables(array('product_attribute', 'product_attribute_combination', 'product_attribute_shop', 'product_attribute_image')); $handle = $this->openCsvFile('product_attributes.csv'); for ($current_line = 0; $line = fgetcsv($handle, MAX_LINE_SIZE, ';'); $current_line++) { $res = false; $fields = $this->filterFields('Combination', $this->product_attribute_fields, $line); if (!isset($fields['id'])) { $attribute = new Combination($line[0]); $attribute->id = $line[0]; } else { $attribute = new Combination($fields['id']); } foreach ($fields as $key => $field) { $attribute->{$key} = $field; } // add attribute values in ps_product_attribute_combination if ($line[16]) { $values = explode(',', $line[16]); $attribute->setAttributes($values); } // add attribute images to ps_product_attribute_image if ($line[17]) { $images = explode(',', $line[17]); $attribute->setImages($images); } $attribute->force_id = true; if (!$res) { $res = $attribute->add(); } } $this->closeCsvFile($handle); return true; }