diff --git a/.htaccess b/.htaccess index b4c193c1..183cde05 100644 --- a/.htaccess +++ b/.htaccess @@ -4,6 +4,8 @@ RewriteRule .* - [E=Cache-Vary:cookiesplus] # ~~endcookiesplus~~ Cookies Plus module - Do not remove this comment + + # ~~start~~ Do not remove this comment, Prestashop will keep automatically the code outside this comment when .htaccess will be generated again # .htaccess automaticaly generated by PrestaShop e-commerce open-source solution # https://www.prestashop.com - https://www.prestashop.com/forums @@ -16,29 +18,29 @@ SetEnv HTTP_MOD_REWRITE On RewriteEngine on -#Domain: masimmo.pl.pagedev.pl +#Domain: masimmo.pl RewriteRule . - [E=REWRITEBASE:/] RewriteRule ^api(?:/(.*))?$ %{ENV:REWRITEBASE}webservice/dispatcher.php?url=$1 [QSA,L] RewriteRule ^upload/.+$ %{ENV:REWRITEBASE}index.php [QSA,L] # Images -RewriteCond %{HTTP_HOST} ^masimmo.pl.pagedev.pl$ +RewriteCond %{HTTP_HOST} ^masimmo.pl$ RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.jpg [L] -RewriteCond %{HTTP_HOST} ^masimmo.pl.pagedev.pl$ +RewriteCond %{HTTP_HOST} ^masimmo.pl$ RewriteRule ^([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$1$2$3$4.jpg [L] -RewriteCond %{HTTP_HOST} ^masimmo.pl.pagedev.pl$ +RewriteCond %{HTTP_HOST} ^masimmo.pl$ RewriteRule ^([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$3/$1$2$3$4$5.jpg [L] -RewriteCond %{HTTP_HOST} ^masimmo.pl.pagedev.pl$ +RewriteCond %{HTTP_HOST} ^masimmo.pl$ RewriteRule ^([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$3/$4/$1$2$3$4$5$6.jpg [L] -RewriteCond %{HTTP_HOST} ^masimmo.pl.pagedev.pl$ +RewriteCond %{HTTP_HOST} ^masimmo.pl$ RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6$7.jpg [L] -RewriteCond %{HTTP_HOST} ^masimmo.pl.pagedev.pl$ +RewriteCond %{HTTP_HOST} ^masimmo.pl$ RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7$8.jpg [L] -RewriteCond %{HTTP_HOST} ^masimmo.pl.pagedev.pl$ +RewriteCond %{HTTP_HOST} ^masimmo.pl$ RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8$9.jpg [L] -RewriteCond %{HTTP_HOST} ^masimmo.pl.pagedev.pl$ +RewriteCond %{HTTP_HOST} ^masimmo.pl$ RewriteRule ^c/([0-9]+)(\-[\.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/c/$1$2$3.jpg [L] -RewriteCond %{HTTP_HOST} ^masimmo.pl.pagedev.pl$ +RewriteCond %{HTTP_HOST} ^masimmo.pl$ RewriteRule ^c/([a-zA-Z_-]+)(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/c/$1$2.jpg [L] # AlphaImageLoader for IE and fancybox RewriteRule ^images_ie/?([^/]+)\.(jpe?g|png|gif)$ js/jquery/plugins/fancybox/images/$1.$2 [L] diff --git a/import-drewmax.php b/import-drewmax.php new file mode 100644 index 00000000..175dafa7 --- /dev/null +++ b/import-drewmax.php @@ -0,0 +1,273 @@ +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 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 download image from URL and associate it with a product +function addProductImage($productId, $imageUrl) +{ + $image = new Image(); + $image->id_product = $productId; + $image->position = Image::getHighestPosition($productId) + 1; + $image->cover = true; // Set the first image as cover + $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']); + } + + return true; +} + +// 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; +} + +// Parse XML and group products by Symbol +$productsBySymbol = []; +foreach ($xml->product as $productData) { + $symbol = (string)$productData->item_group_id; + if (!isset($productsBySymbol[$symbol])) { + $productsBySymbol[$symbol] = []; + } + $productsBySymbol[$symbol][] = $productData; +} + +// Create or update products with combinations based on grouped data +foreach ($productsBySymbol as $symbol => $products) { + if (empty($products)) { + continue; + } + + // Get the main product data from the first product in the group + $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->add(); + + // Add images to the product + if (!empty($mainProductData->image)) { + addProductImage($mainProduct->id, $mainProductData->image); + } + + for ($i = 1; $i <= 10; $i++) { + $imageUrl = (string)$mainProductData->{'images_' . $i}; + if (!empty($imageUrl)) { + addProductImage($mainProduct->id, $imageUrl); + } + } + + $productAdded = true; + } else { + // Update existing product price and description + 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, + 'Dlugosc' => (string)$productData->Dlugosc, + 'Szerokosc' => (string)$productData->Szerokosc, + 'Glebokosc' => (string)$productData->Glebokosc, + 'Wysokosc' => (string)$productData->Wysokosc, + ]; + + $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->add(); + $combination->setAttributes($attributeIds); + $combination->save(); + $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) { + break; // Break if a new combination was added + } + } + + // Ensure the product has combinations enabled + $mainProduct->checkDefaultAttributes(); + Product::updateDefaultAttribute($mainProduct->id); + + 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 ""; +} +?>