diff --git a/import-product.php b/import-product.php index d85c0ec3..39f4b6de 100644 --- a/import-product.php +++ b/import-product.php @@ -1,498 +1,538 @@ language->id; +// $result = Db::getInstance()->getRow('SELECT `id_attribute_group` FROM `'._DB_PREFIX_.'attribute_group_lang` WHERE `name` = \''.pSQL($name).'\' AND `id_lang` = '.(int)$id_lang); +// return $result ? new AttributeGroup($result['id_attribute_group']) : false; +// } + +// // Function to find attribute by name +// function findAttributeByName($id_attribute_group, $name) { +// $id_lang = Context::getContext()->language->id; +// $sql = 'SELECT a.`id_attribute` +// FROM `'._DB_PREFIX_.'attribute` a +// JOIN `'._DB_PREFIX_.'attribute_lang` al ON a.`id_attribute` = al.`id_attribute` +// WHERE al.`name` = \''.pSQL($name).'\' AND al.`id_lang` = '.(int)$id_lang.' AND a.`id_attribute_group` = '.(int)$id_attribute_group; +// $result = Db::getInstance()->getRow($sql); +// return $result ? new Attribute($result['id_attribute']) : false; +// } + +// // Function to check if a product already has images +// function productHasImages($productId) { +// $images = Image::getImages(Context::getContext()->language->id, $productId); +// return !empty($images); +// } + +// // Function to create attribute if it doesn't exist +// function createAttribute($name, $values) { +// $attributeGroup = findAttributeGroupByName($name); +// if (!$attributeGroup) { +// $attributeGroup = new AttributeGroup(); +// $attributeGroup->name = createMultiLangField($name); +// $attributeGroup->public_name = createMultiLangField($name); +// $attributeGroup->group_type = 'select'; +// $attributeGroup->add(); +// } + +// foreach ($values as $value) { +// $attribute = findAttributeByName($attributeGroup->id, $value); +// if (!$attribute) { +// $attribute = new Attribute(); +// $attribute->id_attribute_group = $attributeGroup->id; +// $attribute->name = createMultiLangField($value); +// $attribute->add(); +// } +// } + +// return $attributeGroup->id; +// } + +// // Helper function to create a multi-language field +// function createMultiLangField($field) { +// $languages = Language::getLanguages(false); +// $res = []; +// foreach ($languages as $lang) { +// $res[$lang['id_lang']] = $field; +// } +// return $res; +// } + +// // Helper function to create a valid link_rewrite +// function createLinkRewrite($field) { +// $languages = Language::getLanguages(false); +// $res = []; +// $linkRewrite = Tools::link_rewrite($field); // PrestaShop's function to create valid link_rewrite +// foreach ($languages as $lang) { +// $res[$lang['id_lang']] = $linkRewrite; +// } +// return $res; +// } + +// // Function to get category ID from name +// function getCategoryId($categoryName) { +// $category = Category::searchByName(1, $categoryName); // 1 for default language id +// if (!empty($category)) { +// return $category['id_category']; +// } else { +// // Create category if not exists +// $category = new Category(); +// $category->name = createMultiLangField($categoryName); +// $category->link_rewrite = createLinkRewrite($categoryName); +// $category->id_parent = 2; // Default parent category +// $category->add(); +// return $category->id; +// } +// } + +// // Function to log added images +// function logAddedImage($productId, $imageUrl) { +// $logFile = dirname(__FILE__) . '/image_log.json'; +// $logData = file_exists($logFile) ? json_decode(file_get_contents($logFile), true) : []; +// if (!isset($logData[$productId])) { +// $logData[$productId] = []; +// } +// $logData[$productId][] = $imageUrl; +// file_put_contents($logFile, json_encode($logData)); +// } + +// // Function to check if an image has been added +// function isImageAdded($productId, $imageUrl) { +// $logFile = dirname(__FILE__) . '/image_log.json'; +// if (!file_exists($logFile)) { +// return false; +// } +// $logData = json_decode(file_get_contents($logFile), true); +// return isset($logData[$productId]) && in_array($imageUrl, $logData[$productId]); +// } + +// // Function to download image from URL and associate it with a product +// function addProductImage($productId, $imageUrl) { +// // if (isImageAdded($productId, $imageUrl)) { +// // return false; // Skip duplicate images +// // } + +// $image = new Image(); +// $image->id_product = $productId; +// $image->position = Image::getHighestPosition($productId) + 1; +// $image->add(); + +// $imagePath = $image->getPathForCreation(); +// $url = str_replace(' ', '%20', $imageUrl); +// if (!copy($url, $imagePath . '.jpg')) { +// $image->delete(); +// return false; +// } + +// $imageTypes = ImageType::getImagesTypes('products'); +// foreach ($imageTypes as $imageType) { +// ImageManager::resize($imagePath . '.jpg', $imagePath . '-' . stripslashes($imageType['name']) . '.jpg', $imageType['width'], $imageType['height']); +// } + +// logAddedImage($productId, $imageUrl); +// return $image->id; +// } + +// // Function to set the first image as cover +// function setCoverImage($productId) { +// $images = Image::getImages(Context::getContext()->language->id, $productId); +// if (!empty($images)) { +// $firstImage = reset($images); +// $firstImageId = $firstImage['id_image']; +// Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'image` SET cover = 0 WHERE id_product = '.(int)$productId); +// Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'image` SET cover = 1 WHERE id_image = '.(int)$firstImageId); +// Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'image_shop` SET cover = 0 WHERE id_product = '.(int)$productId); +// Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'image_shop` SET cover = 1 WHERE id_image = '.(int)$firstImageId); +// } +// } + +// // Function to find product by reference +// function findProductByReference($reference) { +// $result = Db::getInstance()->getRow('SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE `reference` = \''.pSQL($reference).'\''); +// return $result ? new Product($result['id_product']) : false; +// } + +// // Function to find combination by product ID and attribute IDs +// function findCombinationByAttributes($id_product, $attributeIds) { +// sort($attributeIds); +// $sql = 'SELECT c.`id_product_attribute` +// FROM `'._DB_PREFIX_.'product_attribute` c +// JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON c.`id_product_attribute` = pac.`id_product_attribute` +// WHERE c.`id_product` = '.(int)$id_product.' +// GROUP BY c.`id_product_attribute` +// HAVING SUM(pac.`id_attribute` = '.implode(' OR pac.`id_attribute` = ', array_map('intval', $attributeIds)).') = '.count($attributeIds); +// $result = Db::getInstance()->getRow($sql); +// return $result ? new Combination($result['id_product_attribute']) : false; +// } + +// // Function to assign manufacturer to product +// function assignManufacturerToProduct($productId, $manufacturerId) { +// $product = new Product($productId); +// $product->id_manufacturer = $manufacturerId; +// $product->update(); +// } + +// // Function to assign feature to product (without searching for IDs) +// function assignFeatureToProduct($productId, $featureId, $featureValueId) { +// $existingFeature = Db::getInstance()->getRow( +// 'SELECT id_feature_product FROM `'._DB_PREFIX_.'feature_product` WHERE `id_product` = '.(int)$productId.' AND `id_feature` = '.(int)$featureId +// ); + +// if (!$existingFeature) { +// Db::getInstance()->insert('feature_product', [ +// 'id_product' => (int)$productId, +// 'id_feature' => (int)$featureId, +// 'id_feature_value' => (int)$featureValueId +// ]); +// } else { +// Db::getInstance()->update('feature_product', [ +// 'id_feature_value' => (int)$featureValueId +// ], 'id_feature_product = '.(int)$existingFeature['id_feature_product']); +// } +// } + +// // Function to update additional delivery parameters +// function updateDeliveryParameters($productId) { +// $product = new Product($productId); +// $product->additional_delivery_times = 2; +// $product->delivery_in_stock = 'ok. 2-5 dni roboczych'; +// $product->delivery_out_stock = 'ok. 2-5 dni roboczych'; +// $product->update(); +// } + +// // Function to calculate combination price impact +// function calculatePriceImpact($basePrice, $combinationPrice) { +// return floatval(str_replace(',', '', $combinationPrice)) - floatval(str_replace(',', '', $basePrice)); +// } + +// function addProductToShops($product) { +// $shops = [1, 2]; +// foreach ($shops as $shopId) { +// Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'product_shop` (`id_product`, `id_shop`, `id_category_default`, `price`, `active`) +// VALUES ('.(int)$product->id.', '.(int)$shopId.', 2, '.(float)$product->price.', 1)'); +// } +// } + +// // Funkcja do przypisania kombinacji do obu sklepów +// function addCombinationToShops($combination) { +// $shops = [1, 2]; +// foreach ($shops as $shopId) { +// Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'product_attribute_shop` (`id_product_attribute`, `id_product`, `id_shop`, `price`) +// VALUES ('.(int)$combination->id.', '.(int)$combination->id_product.', '.(int)$shopId.', '.(float)$combination->price.')'); +// } +// } + +// // Funkcja do dodawania obrazów do obu sklepów +// function addImageToShops($imageId, $productId) { +// $shops = [1, 2]; +// foreach ($shops as $shopId) { +// Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'image_shop` (`id_image`, `id_product`, `id_shop`, `cover`) +// VALUES ('.(int)$imageId.', '.(int)$productId.', '.(int)$shopId.', 0)'); +// } +// } + +// // Function to parse and import product features +// function importProductFeatures($productId, $featuresString) { +// $features = explode('|', $featuresString); +// foreach ($features as $feature) { +// list($featureName, $featureValue) = explode('>', $feature, 2); + +// if ( trim( $featureValue ) == 'Rozmiar' or $featureValue == 'ROZMIAR' or strpos( $featureName, 'filtr rozwijany' ) !== false ) +// continue; + +// $featureName = trim($featureName); +// $featureValue = trim($featureValue); + +// $featureId = Db::getInstance()->getValue( +// 'SELECT id_feature FROM `'._DB_PREFIX_.'feature_lang` WHERE name = "' . pSQL($featureName) . '"' +// ); + +// if (!$featureId) { +// $feature = new Feature(); +// $feature->name = createMultiLangField($featureName); +// $feature->add(); +// $featureId = $feature->id; +// } + +// if ( $featureId == 47 or $featureId == 76 ) +// continue; + +// $featureValueId = Db::getInstance()->getValue( +// 'SELECT fv.id_feature_value FROM `'._DB_PREFIX_.'feature_value` fv +// JOIN `'._DB_PREFIX_.'feature_value_lang` fvl ON fv.id_feature_value = fvl.id_feature_value +// WHERE fvl.value = "' . pSQL($featureValue) . '" AND fv.id_feature = ' . (int)$featureId +// ); + +// if (!$featureValueId) { +// $featureValueObj = new FeatureValue(); +// $featureValueObj->id_feature = $featureId; +// $featureValueObj->value = createMultiLangField($featureValue); +// $featureValueObj->add(); +// $featureValueId = $featureValueObj->id; +// } + +// Db::getInstance()->insert('feature_product', [ +// 'id_product' => (int)$productId, +// 'id_feature' => (int)$featureId, +// 'id_feature_value' => (int)$featureValueId +// ]); +// } +// } + +// // Parse XML and group products by Symbol +// $productsBySymbol = []; +// foreach ( $xml -> post as $productData ) +// { +// $i = 1; +// $product_tmp = (array)$productData; + +// $Dostępnerozmiaryjeślidotyczy = $product_tmp['Dostępnerozmiaryjeślidotyczy:untitled_3']; +// $sku = $product_tmp['KodEAN-13']; +// $title = $product_tmp['Nazwaproduktu'] . ' AMZ'; +// $description = $product_tmp['Długiopis']; +// $short_description = $product_tmp['Krótkiopis']; +// $price = $product_tmp['CenaBRUTTO']; +// $rozmiar = $product_tmp['Dostępnerozmiaryjeślidotyczy:untitled_3']; +// $kolor = $product_tmp['Dostępnekoloryjeślidotyczy:untitled_2']; + +// $images = explode( '|', $product_tmp['ZdjęciaproduktuURL-e'] ); + +// if ( !count( $images ) or ( count( $images ) == 1 and empty( $images[0] ) ) ) +// { +// if ( isset( $product_images[ $symbol ]['images'] ) ) +// $images = $product_images[ $symbol ]['images']; +// } + +// foreach ( $images as $image ) +// { +// $productData->{'images_' . $i} = $image; +// $i++; +// } + +// $symbol = md5( $productData -> Nazwaproduktu ); + +// $productData->sku = $sku; +// $productData->title = $title; +// $productData->description = $description; +// $productData->short_description = $short_description; +// $productData->price = $price; +// $productData->rozmiar = $rozmiar; +// $productData->kolor = $kolor; + +// if ( !isset( $productsBySymbol[$symbol] ) ) { +// $productsBySymbol[$symbol] = []; +// } + +// if ( strpos( $Dostępnerozmiaryjeślidotyczy, '|' ) === false ) +// $productsBySymbol[$symbol][] = $productData; +// else +// { +// $product_images[ $symbol ]['images'] = $images; +// } +// } + +// foreach ($productsBySymbol as $symbol => $products) +// { +// if ( empty( $products ) ) { +// continue; +// } + +// $mainProductData = $products[0]; +// $mainProduct = findProductByReference((string)$mainProductData->sku); + +// $productAdded = false; +// if ( !$mainProduct ) +// { +// // Create a new product if it doesn't exist +// $mainProduct = new Product(); +// $mainProduct->name = createMultiLangField((string)$mainProductData->title); +// $description = (string)$mainProductData->description; +// $description = str_replace("\n", "
", $description); +// $mainProduct->description = createMultiLangField($description); +// $mainProduct->price = floatval(str_replace(',','',$mainProductData->price)); +// $mainProduct->reference = (string)$mainProductData->sku; +// $mainProduct->id_category_default = 2; +// $mainProduct->link_rewrite = createLinkRewrite((string)$mainProductData->title); +// $mainProduct->id_shop_list = [1, 2]; // Przypisanie do sklepów +// $mainProduct->add(); + +// addProductToShops($mainProduct); + +// if (!empty($mainProductData->Cechyproduktu)) { +// importProductFeatures($mainProduct->id, (string)$mainProductData->Cechyproduktu); +// } + +// // Ensure the product has combinations enabled +// $mainProduct->checkDefaultAttributes(); + +// Product::updateDefaultAttribute($mainProduct->id); +// assignFeatureToProduct($mainProduct->id, 41, 2499); +// assignManufacturerToProduct($mainProduct->id, 53); +// updateDeliveryParameters($mainProduct->id); + +// $productAdded = true; +// } +// else +// { +// if ( $config['update_price'] == true ) +// { +// $mainProduct->price = floatval(str_replace(',','',$mainProductData->price)); +// $description = (string)$mainProductData->description; +// $description = str_replace("\n", "
", $description); +// $mainProduct->description = createMultiLangField($description); +// $mainProduct->update(); +// } +// } + +// // Ensure the product is saved before adding combinations +// if (!$mainProduct->id) { +// echo "Failed to create or update main product: " . (string)$mainProductData->title . "\n"; +// continue; +// } + +// // Ensure the combination set is unique for the product +// $addedCombinations = []; + +// // Add or update combinations for each product in the group +// $combinationAdded = false; +// foreach ($products as $productData) +// { +// $attributes = [ +// 'Kolor' => (string)$productData->kolor, +// 'Rozmiar' => (string)$productData->rozmiar +// ]; + +// $attributeIds = []; +// foreach ($attributes as $name => $value) { +// if (!empty($value)) { +// $attributeGroupId = createAttribute($name, [$value]); +// $attribute = findAttributeByName($attributeGroupId, $value); +// if ($attribute) { +// $attributeIds[] = $attribute->id; +// } +// } +// } + +// // Create a unique key for the attribute set +// sort($attributeIds); +// $key = implode('-', $attributeIds); + +// // Add or update combination if it is unique +// if (!empty($attributeIds)) +// { +// $combination = findCombinationByAttributes($mainProduct->id, $attributeIds); + +// if (!$combination) { +// // Create new combination +// $combination = new Combination(); +// $combination->id_product = $mainProduct->id; +// $combination->quantity = 100; // Default quantity, you can adjust this +// $combination->reference = (string)$productData->sku; +// $combination->price = calculatePriceImpact($mainProductData->price, $productData->price); +// $combination->add(); +// $combination->setAttributes($attributeIds); +// $combination->save(); + +// addCombinationToShops($combination); + +// $combinationAdded = true; +// } else { +// // Update existing combination quantity if necessary +// $combination->quantity = 100; // Update quantity, you can adjust this +// $combination->update(); +// } + +// // Mark this combination as added +// $addedCombinations[$key] = true; +// } + +// if ( $combinationAdded ) +// { +// if ( !productHasImages($mainProduct->id) and !empty($productData->images_2) ) +// { +// for ($i = 1; $i <= 10; $i++) { +// $imageUrl = (string)$productData->{'images_' . $i}; +// if (!empty($imageUrl)) { +// $imageId = addProductImage($mainProduct->id, $imageUrl); +// if ($imageId) { +// addImageToShops($imageId, $mainProduct->id); +// } +// } +// } +// } +// setCoverImage($mainProduct->id); + +// break; // Break if a new combination was added +// } +// } + +// if ($productAdded || $combinationAdded) { +// if ($productAdded) { +// echo "

Dodałem produkt: " . (string)$mainProductData->title . "

"; +// } +// if ($combinationAdded) { +// echo "

Dodałem kombinację: " . (string)$mainProductData->title . "

"; +// } +// break; // Break if a new product or combination was added +// } +// } +// // reload page after 1s if product or combination was added +// if ($productAdded || $combinationAdded) { +// echo ""; +// } + +require_once dirname(__FILE__) . '/config/config.inc.php'; +require_once dirname(__FILE__) . '/init.php'; + +// Pobranie ID produktów zawierających "AMZ" w nazwie i bez uzupełnionego EAN +$products = Db::getInstance()->executeS( + 'SELECT p.id_product FROM ' . _DB_PREFIX_ . 'product p + JOIN ' . _DB_PREFIX_ . 'product_lang pl ON p.id_product = pl.id_product + WHERE pl.name LIKE "%AMZ%"' +); + +if (!$products) { + die('Nie znaleziono produktów zawierających "AMZ".'); } -$startGlobal = microtime(true); +foreach ($products as $product) { + $id_product = (int)$product['id_product']; -// Function to find attribute group by name -function findAttributeGroupByName($name) { - $id_lang = Context::getContext()->language->id; - $result = Db::getInstance()->getRow('SELECT `id_attribute_group` FROM `'._DB_PREFIX_.'attribute_group_lang` WHERE `name` = \''.pSQL($name).'\' AND `id_lang` = '.(int)$id_lang); - return $result ? new AttributeGroup($result['id_attribute_group']) : false; -} + // Pobranie kombinacji produktu bez uzupełnionego EAN + $combinations = Db::getInstance()->executeS( + 'SELECT id_product_attribute, reference FROM ' . _DB_PREFIX_ . 'product_attribute + WHERE id_product = ' . $id_product . ' AND (ean13 IS NULL OR ean13 = "")' + ); -// Function to find attribute by name -function findAttributeByName($id_attribute_group, $name) { - $id_lang = Context::getContext()->language->id; - $sql = 'SELECT a.`id_attribute` - FROM `'._DB_PREFIX_.'attribute` a - JOIN `'._DB_PREFIX_.'attribute_lang` al ON a.`id_attribute` = al.`id_attribute` - WHERE al.`name` = \''.pSQL($name).'\' AND al.`id_lang` = '.(int)$id_lang.' AND a.`id_attribute_group` = '.(int)$id_attribute_group; - $result = Db::getInstance()->getRow($sql); - return $result ? new Attribute($result['id_attribute']) : false; -} - -// Function to check if a product already has images -function productHasImages($productId) { - $images = Image::getImages(Context::getContext()->language->id, $productId); - return !empty($images); -} - -// Function to create attribute if it doesn't exist -function createAttribute($name, $values) { - $attributeGroup = findAttributeGroupByName($name); - if (!$attributeGroup) { - $attributeGroup = new AttributeGroup(); - $attributeGroup->name = createMultiLangField($name); - $attributeGroup->public_name = createMultiLangField($name); - $attributeGroup->group_type = 'select'; - $attributeGroup->add(); - } - - foreach ($values as $value) { - $attribute = findAttributeByName($attributeGroup->id, $value); - if (!$attribute) { - $attribute = new Attribute(); - $attribute->id_attribute_group = $attributeGroup->id; - $attribute->name = createMultiLangField($value); - $attribute->add(); - } - } - - return $attributeGroup->id; -} - -// Helper function to create a multi-language field -function createMultiLangField($field) { - $languages = Language::getLanguages(false); - $res = []; - foreach ($languages as $lang) { - $res[$lang['id_lang']] = $field; - } - return $res; -} - -// Helper function to create a valid link_rewrite -function createLinkRewrite($field) { - $languages = Language::getLanguages(false); - $res = []; - $linkRewrite = Tools::link_rewrite($field); // PrestaShop's function to create valid link_rewrite - foreach ($languages as $lang) { - $res[$lang['id_lang']] = $linkRewrite; - } - return $res; -} - -// Function to get category ID from name -function getCategoryId($categoryName) { - $category = Category::searchByName(1, $categoryName); // 1 for default language id - if (!empty($category)) { - return $category['id_category']; - } else { - // Create category if not exists - $category = new Category(); - $category->name = createMultiLangField($categoryName); - $category->link_rewrite = createLinkRewrite($categoryName); - $category->id_parent = 2; // Default parent category - $category->add(); - return $category->id; - } -} - -// Function to log added images -function logAddedImage($productId, $imageUrl) { - $logFile = dirname(__FILE__) . '/image_log.json'; - $logData = file_exists($logFile) ? json_decode(file_get_contents($logFile), true) : []; - if (!isset($logData[$productId])) { - $logData[$productId] = []; - } - $logData[$productId][] = $imageUrl; - file_put_contents($logFile, json_encode($logData)); -} - -// Function to check if an image has been added -function isImageAdded($productId, $imageUrl) { - $logFile = dirname(__FILE__) . '/image_log.json'; - if (!file_exists($logFile)) { - return false; - } - $logData = json_decode(file_get_contents($logFile), true); - return isset($logData[$productId]) && in_array($imageUrl, $logData[$productId]); -} - -// Function to download image from URL and associate it with a product -function addProductImage($productId, $imageUrl) { - // if (isImageAdded($productId, $imageUrl)) { - // return false; // Skip duplicate images - // } - - $image = new Image(); - $image->id_product = $productId; - $image->position = Image::getHighestPosition($productId) + 1; - $image->add(); - - $imagePath = $image->getPathForCreation(); - $url = str_replace(' ', '%20', $imageUrl); - if (!copy($url, $imagePath . '.jpg')) { - $image->delete(); - return false; - } - - $imageTypes = ImageType::getImagesTypes('products'); - foreach ($imageTypes as $imageType) { - ImageManager::resize($imagePath . '.jpg', $imagePath . '-' . stripslashes($imageType['name']) . '.jpg', $imageType['width'], $imageType['height']); - } - - logAddedImage($productId, $imageUrl); - return $image->id; -} - -// Function to set the first image as cover -function setCoverImage($productId) { - $images = Image::getImages(Context::getContext()->language->id, $productId); - if (!empty($images)) { - $firstImage = reset($images); - $firstImageId = $firstImage['id_image']; - Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'image` SET cover = 0 WHERE id_product = '.(int)$productId); - Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'image` SET cover = 1 WHERE id_image = '.(int)$firstImageId); - Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'image_shop` SET cover = 0 WHERE id_product = '.(int)$productId); - Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'image_shop` SET cover = 1 WHERE id_image = '.(int)$firstImageId); - } -} - -// Function to find product by reference -function findProductByReference($reference) { - $result = Db::getInstance()->getRow('SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE `reference` = \''.pSQL($reference).'\''); - return $result ? new Product($result['id_product']) : false; -} - -// Function to find combination by product ID and attribute IDs -function findCombinationByAttributes($id_product, $attributeIds) { - sort($attributeIds); - $sql = 'SELECT c.`id_product_attribute` - FROM `'._DB_PREFIX_.'product_attribute` c - JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON c.`id_product_attribute` = pac.`id_product_attribute` - WHERE c.`id_product` = '.(int)$id_product.' - GROUP BY c.`id_product_attribute` - HAVING SUM(pac.`id_attribute` = '.implode(' OR pac.`id_attribute` = ', array_map('intval', $attributeIds)).') = '.count($attributeIds); - $result = Db::getInstance()->getRow($sql); - return $result ? new Combination($result['id_product_attribute']) : false; -} - -// Function to assign manufacturer to product -function assignManufacturerToProduct($productId, $manufacturerId) { - $product = new Product($productId); - $product->id_manufacturer = $manufacturerId; - $product->update(); -} - -// Function to assign feature to product (without searching for IDs) -function assignFeatureToProduct($productId, $featureId, $featureValueId) { - $existingFeature = Db::getInstance()->getRow( - 'SELECT id_feature_product FROM `'._DB_PREFIX_.'feature_product` WHERE `id_product` = '.(int)$productId.' AND `id_feature` = '.(int)$featureId - ); - - if (!$existingFeature) { - Db::getInstance()->insert('feature_product', [ - 'id_product' => (int)$productId, - 'id_feature' => (int)$featureId, - 'id_feature_value' => (int)$featureValueId - ]); - } else { - Db::getInstance()->update('feature_product', [ - 'id_feature_value' => (int)$featureValueId - ], 'id_feature_product = '.(int)$existingFeature['id_feature_product']); - } -} - -// Function to update additional delivery parameters -function updateDeliveryParameters($productId) { - $product = new Product($productId); - $product->additional_delivery_times = 2; - $product->delivery_in_stock = 'ok. 2-5 dni roboczych'; - $product->delivery_out_stock = 'ok. 2-5 dni roboczych'; - $product->update(); -} - -// Function to calculate combination price impact -function calculatePriceImpact($basePrice, $combinationPrice) { - return floatval(str_replace(',', '', $combinationPrice)) - floatval(str_replace(',', '', $basePrice)); -} - -function addProductToShops($product) { - $shops = [1, 2]; - foreach ($shops as $shopId) { - Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'product_shop` (`id_product`, `id_shop`, `id_category_default`, `price`, `active`) - VALUES ('.(int)$product->id.', '.(int)$shopId.', 2, '.(float)$product->price.', 1)'); - } -} - -// Funkcja do przypisania kombinacji do obu sklepów -function addCombinationToShops($combination) { - $shops = [1, 2]; - foreach ($shops as $shopId) { - Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'product_attribute_shop` (`id_product_attribute`, `id_product`, `id_shop`, `price`) - VALUES ('.(int)$combination->id.', '.(int)$combination->id_product.', '.(int)$shopId.', '.(float)$combination->price.')'); - } -} - -// Funkcja do dodawania obrazów do obu sklepów -function addImageToShops($imageId, $productId) { - $shops = [1, 2]; - foreach ($shops as $shopId) { - Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'image_shop` (`id_image`, `id_product`, `id_shop`, `cover`) - VALUES ('.(int)$imageId.', '.(int)$productId.', '.(int)$shopId.', 0)'); - } -} - -// Function to parse and import product features -function importProductFeatures($productId, $featuresString) { - $features = explode('|', $featuresString); - foreach ($features as $feature) { - list($featureName, $featureValue) = explode('>', $feature, 2); - - if ( trim( $featureValue ) == 'Rozmiar' or $featureValue == 'ROZMIAR' or strpos( $featureName, 'filtr rozwijany' ) !== false ) - continue; - - $featureName = trim($featureName); - $featureValue = trim($featureValue); - - $featureId = Db::getInstance()->getValue( - 'SELECT id_feature FROM `'._DB_PREFIX_.'feature_lang` WHERE name = "' . pSQL($featureName) . '"' - ); - - if (!$featureId) { - $feature = new Feature(); - $feature->name = createMultiLangField($featureName); - $feature->add(); - $featureId = $feature->id; - } - - if ( $featureId == 47 or $featureId == 76 ) - continue; - - $featureValueId = Db::getInstance()->getValue( - 'SELECT fv.id_feature_value FROM `'._DB_PREFIX_.'feature_value` fv - JOIN `'._DB_PREFIX_.'feature_value_lang` fvl ON fv.id_feature_value = fvl.id_feature_value - WHERE fvl.value = "' . pSQL($featureValue) . '" AND fv.id_feature = ' . (int)$featureId - ); - - if (!$featureValueId) { - $featureValueObj = new FeatureValue(); - $featureValueObj->id_feature = $featureId; - $featureValueObj->value = createMultiLangField($featureValue); - $featureValueObj->add(); - $featureValueId = $featureValueObj->id; - } - - Db::getInstance()->insert('feature_product', [ - 'id_product' => (int)$productId, - 'id_feature' => (int)$featureId, - 'id_feature_value' => (int)$featureValueId - ]); - } -} - -// Parse XML and group products by Symbol -$productsBySymbol = []; -foreach ( $xml -> post as $productData ) -{ - $i = 1; - $product_tmp = (array)$productData; - - $Dostępnerozmiaryjeślidotyczy = $product_tmp['Dostępnerozmiaryjeślidotyczy:untitled_3']; - $sku = $product_tmp['KodEAN-13']; - $title = $product_tmp['Nazwaproduktu'] . ' AMZ'; - $description = $product_tmp['Długiopis']; - $short_description = $product_tmp['Krótkiopis']; - $price = $product_tmp['CenaBRUTTO']; - $rozmiar = $product_tmp['Dostępnerozmiaryjeślidotyczy:untitled_3']; - $kolor = $product_tmp['Dostępnekoloryjeślidotyczy:untitled_2']; - - $images = explode( '|', $product_tmp['ZdjęciaproduktuURL-e'] ); - - if ( !count( $images ) or ( count( $images ) == 1 and empty( $images[0] ) ) ) - { - if ( isset( $product_images[ $symbol ]['images'] ) ) - $images = $product_images[ $symbol ]['images']; - } - - foreach ( $images as $image ) - { - $productData->{'images_' . $i} = $image; - $i++; - } - - $symbol = md5( $productData -> Nazwaproduktu ); - - $productData->sku = $sku; - $productData->title = $title; - $productData->description = $description; - $productData->short_description = $short_description; - $productData->price = $price; - $productData->rozmiar = $rozmiar; - $productData->kolor = $kolor; - - if ( !isset( $productsBySymbol[$symbol] ) ) { - $productsBySymbol[$symbol] = []; - } - - if ( strpos( $Dostępnerozmiaryjeślidotyczy, '|' ) === false ) - $productsBySymbol[$symbol][] = $productData; - else - { - $product_images[ $symbol ]['images'] = $images; - } -} - -foreach ($productsBySymbol as $symbol => $products) -{ - if ( empty( $products ) ) { - continue; - } - - $mainProductData = $products[0]; - $mainProduct = findProductByReference((string)$mainProductData->sku); - - $productAdded = false; - if ( !$mainProduct ) - { - // Create a new product if it doesn't exist - $mainProduct = new Product(); - $mainProduct->name = createMultiLangField((string)$mainProductData->title); - $description = (string)$mainProductData->description; - $description = str_replace("\n", "
", $description); - $mainProduct->description = createMultiLangField($description); - $mainProduct->price = floatval(str_replace(',','',$mainProductData->price)); - $mainProduct->reference = (string)$mainProductData->sku; - $mainProduct->id_category_default = 2; - $mainProduct->link_rewrite = createLinkRewrite((string)$mainProductData->title); - $mainProduct->id_shop_list = [1, 2]; // Przypisanie do sklepów - $mainProduct->add(); - - addProductToShops($mainProduct); - - if (!empty($mainProductData->Cechyproduktu)) { - importProductFeatures($mainProduct->id, (string)$mainProductData->Cechyproduktu); - } - - // Ensure the product has combinations enabled - $mainProduct->checkDefaultAttributes(); - - Product::updateDefaultAttribute($mainProduct->id); - assignFeatureToProduct($mainProduct->id, 41, 2499); - assignManufacturerToProduct($mainProduct->id, 53); - updateDeliveryParameters($mainProduct->id); - - $productAdded = true; - } - else - { - if ( $config['update_price'] == true ) - { - $mainProduct->price = floatval(str_replace(',','',$mainProductData->price)); - $description = (string)$mainProductData->description; - $description = str_replace("\n", "
", $description); - $mainProduct->description = createMultiLangField($description); - $mainProduct->update(); - } - } - - // Ensure the product is saved before adding combinations - if (!$mainProduct->id) { - echo "Failed to create or update main product: " . (string)$mainProductData->title . "\n"; + if (!$combinations) { continue; } - // Ensure the combination set is unique for the product - $addedCombinations = []; + foreach ($combinations as $combination) { + $id_product_attribute = (int)$combination['id_product_attribute']; + $sku = pSQL($combination['reference']); // SKU - // Add or update combinations for each product in the group - $combinationAdded = false; - foreach ($products as $productData) - { - $attributes = [ - 'Kolor' => (string)$productData->kolor, - 'Rozmiar' => (string)$productData->rozmiar - ]; - - $attributeIds = []; - foreach ($attributes as $name => $value) { - if (!empty($value)) { - $attributeGroupId = createAttribute($name, [$value]); - $attribute = findAttributeByName($attributeGroupId, $value); - if ($attribute) { - $attributeIds[] = $attribute->id; - } - } - } - - // Create a unique key for the attribute set - sort($attributeIds); - $key = implode('-', $attributeIds); - - // Add or update combination if it is unique - if (!empty($attributeIds)) - { - $combination = findCombinationByAttributes($mainProduct->id, $attributeIds); - - if (!$combination) { - // Create new combination - $combination = new Combination(); - $combination->id_product = $mainProduct->id; - $combination->quantity = 100; // Default quantity, you can adjust this - $combination->reference = (string)$productData->sku; - $combination->price = calculatePriceImpact($mainProductData->price, $productData->price); - $combination->add(); - $combination->setAttributes($attributeIds); - $combination->save(); - - addCombinationToShops($combination); - - $combinationAdded = true; - } else { - // Update existing combination quantity if necessary - $combination->quantity = 100; // Update quantity, you can adjust this - $combination->update(); - } - - // Mark this combination as added - $addedCombinations[$key] = true; - } - - if ( $combinationAdded ) - { - if ( !productHasImages($mainProduct->id) and !empty($productData->images_2) ) - { - for ($i = 1; $i <= 10; $i++) { - $imageUrl = (string)$productData->{'images_' . $i}; - if (!empty($imageUrl)) { - $imageId = addProductImage($mainProduct->id, $imageUrl); - if ($imageId) { - addImageToShops($imageId, $mainProduct->id); - } - } - } - } - setCoverImage($mainProduct->id); - - break; // Break if a new combination was added - } - } - - if ($productAdded || $combinationAdded) { - if ($productAdded) { - echo "

Dodałem produkt: " . (string)$mainProductData->title . "

"; - } - if ($combinationAdded) { - echo "

Dodałem kombinację: " . (string)$mainProductData->title . "

"; - } - break; // Break if a new product or combination was added + // Aktualizacja pola EAN (wstawienie wartości SKU) + Db::getInstance()->execute( + 'UPDATE ' . _DB_PREFIX_ . 'product_attribute SET ean13 = "' . $sku . '" WHERE id_product_attribute = ' . $id_product_attribute + ); } } -// reload page after 1s if product or combination was added -if ($productAdded || $combinationAdded) { - echo ""; -} -?> + +echo 'Zaktualizowano SKU do EAN dla wszystkich odpowiednich kombinacji produktów zawierających "AMZ" w nazwie.'; +?> \ No newline at end of file