Tot ce trebuie să știți despre importul – exportul de produse din pachet
Publicat: 2015-01-26Salut ! Cititorii blogului Magesolution ! Ai dotat suficiente cunoștințe despre importul – exportul de produse de pachet? Consultați acest articol pentru a înțelege pe deplin despre importul - exportul de produse Bundle în Magento.
Ultima actualizare: tocmai am lansat versiunea 2.0 a temei Claue Multipurpose Magento 2, cu o mulțime de îmbunătățiri ale performanței și funcții exclusive. Verificați această temă acum: Claue Magento Theme 2. 0
Demo live
Claue – Tema Clean, Minimal Magento 2&1 este un șablon excelent pentru un magazin de comerț electronic modern și curat, cu peste 40 de aspecte de pagină de pornire și o mulțime de opțiuni pentru magazin, blog, portofoliu, machete de locator de magazine și alte pagini utile. Claue versiunea 2.0 vine cu o mulțime de caracteristici exclusive, inclusiv:
- Bazat pe tema Luma.
- Îndeplinește toate standardele temei Magento
- Îmbunătățirea semnificativă a performanței
- Compatibil cu majoritatea extensiilor de la terți.
- Complet compatibil cu Magento 2.4.x
Această a doua versiune avansată se diferențiază complet de cea anterioară. Astfel, dacă utilizați Claue versiunea 1 și doriți să actualizați la Claue versiunea 2, nu puteți decât să reconstruiți un nou site web, în loc să actualizați de la versiunea veche. Acum, să revenim la subiectul principal.
În acest articol, vom menționa două aspecte:
- Exportați pachetul de produse în fișierul CSV în formatele disponibile.
- Importați fișierul CSV care conține informații despre produs în baza de date Magento
Creați un modul de pachet de produse cu următoarele structuri:
aplicație\cod\local\MGS\Productbundle\controllers\Adminhtml\ProductbundleController.php
app\code\local\MGS\Productbundle\etc\config.xml
app\code\local\MGS\Productbundle\Helper\Data.php
app\etc\modules\ MGS_Productbundle.xml
app\design\adminhtml\default\default\layout\ productbundle.xml
app\design\adminhtml\default\default\template\productbundle\ productbundlebackend.phtml
Creați fișierul MGS_Productbundle.xml pentru a activa modulul
MGS _Productbundle.xml
<?xml version="1.0"?> <config> <modules> <MGS_Productbundle> <active>true</active> <codePool>local</codePool> </MGS_Productbundle> </modules> </config>
Creați meniul pentru import și export în config.xml
config.xml
<?xml version="1.0"?> <config> <modules> <MGS_Productbundle> <version>0.1.0</version> </MGS_Productbundle> </modules> <admin> <routers> <productbundle> <use>admin</use> <args> <module>MGS_Productbundle</module> <frontName>productbundle</frontName> </args> </productbundle> </routers> </admin> <adminhtml> <menu> <productbundle module="productbundle"> <title>Product Bundle</title> <sort_order>71</sort_order> <children> <export module="productbundle"> <title>Export to CSV</title> <sort_order>0</sort_order> <action>productbundle/adminhtml_productbundle/export</action> </export> <import module="productbundle"> <title>Import from CSV</title> <sort_order>1</sort_order> <action>productbundle/adminhtml_productbundle/index</action> </import> </children> </productbundle> </menu> <acl> <resources> <all> <title>Allow Everything</title> </all> <admin> <children> <MGS_Productbundle> <title>Productbundle Module</title> <sort_order>10</sort_order> </MGS_Productbundle> </children> </admin> </resources> </acl> <layout> <updates> <productbundle> <file>productbundle.xml</file> </productbundle> </updates> </layout> </adminhtml> <global> <helpers> <productbundle> <class>MGS_Productbundle_Helper</class> </productbundle> </helpers> </global> </config>
Creați un formular pentru a importa pachetul de produse din fișierul CSV
productbundle.xml
<?xml version="1.0"?> <layout version="0.1.0"> <productbundle_adminhtml_productbundle_index> <reference name="content"> <block type="core/template" name="productbundle" template = "productbundle/productbundlebackend.phtml" /> </reference> </productbundle_adminhtml_productbundle_index> </layout>
productbundlebackend.phtml
<script type="text/javascript"> function importAction() { var file = $('fileimport').value; if (file == '') { alert('Please choose file import.'); return false; } $('import_form').submit(); } </script> <div class="imporproductbackend"> <div class="entry-edit"> <form id="import_form" name="edit_form" method="post" action="<?php echo $this->getUrl('*/*/import')?>" enctype="multipart/form-data" > <div class="content-header"> <table cellspacing="0" class="grid-header"> <tr> <td><h3><?php echo $this->__('Import Bundle Products')?></h3></td> <td class="a-right"> <button onclick="importAction()" class="scalable save" type="button"><span><?php echo $this->__('Import') ?></span></button> </td> </tr> </table> </div> <input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" /> <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $this->__('Import bundle product form csv')?></h4> <fieldset id="my-fieldset"> <table cellspacing="0" class="form-list"> <tr> <td class="label"><?php echo $this->__('Import file')?> </td> <td class="input-ele"> <input type="file" name="fileimport" id="fileimport" class="" title="Select File to Import"/> </td> </tr> </table> </fieldset> </form> </div> </div>
Produse pachete de export:
Pentru a exporta produsele pachetului în fișierul CSV, trebuie să extrageți toate produsele pachetului rulând această linie de cod:
$products = Mage::getResourceModel('catalog/product_collection')->addAttributeToFilter('type_id', array('eq' => 'bundle'));
După ce aceste pachete de produse au fost recunoscute și extrase, puteți muta să le exportați într-un fișier CSV.
În primul rând, veți crea un fișier CSV cu formatul disponibil rulând următorul cod:
$csv_export = ''; if($csv_export == ''){ $file = 'bundle'; $data_title = array('sku', 'website_ids', 'attribute_set_id', 'type_id', 'name', 'description', 'short_description', 'category_ids', 'has_options', 'sku_type', 'weight_type', 'shipment_type', 'status', 'price_type', 'price_view', 'special_price', 'is_in_stock', 'qty', 'bundle_options_selections'); Mage::helper('productbundle')->createCsvfile($file,$data_title); $CSVFileName = Mage::getSingleton('core/session')->getCsvexport(); }
funcția createCsvfile($file,$data_title) este creată pentru a genera un nou fișier CSV și a înregistra titluri pentru coloane, rulați acest cod:
// Create new file csv public function createCsvfile($file,$data_title) { if(!is_dir(Mage::getBaseDir() . DS . "var" . DS . "exportcsv")){ mkdir(Mage::getBaseDir() . DS . "var" . DS . "exportcsv", 0777, true); } $csv_folder = Mage::getBaseDir() . DS . "var" . DS . "exportcsv"; $filename = str_replace('.csv','',$file).'_'.date("YmdHis"); $CSVFileName = $csv_folder. DS .$filename.'.csv'; $FileHandle = fopen($CSVFileName, 'w') or die("can't open file"); fclose($FileHandle); $fp = fopen($CSVFileName, 'a'); fputcsv($fp, $data_title); Mage::getSingleton('core/session')-&gt;setCsvexport($CSVFileName); }
Pe lângă informațiile de bază ale unui pachet de produse, cum ar fi sku, nume, descriere... trebuie să adăugați informații despre opțiunile și selecțiile fiecărei opțiuni.
Rulați acest cod pentru a extrage informații despre opțiuni:
$optionCollection = $bundled_product->getTypeInstance()->getOptionsCollection(); $selectionCollection = $bundled_product->getTypeInstance()->getSelectionsCollection($bundled_product->getTypeInstance()->getOptionsIds()); $options = $optionCollection->appendSelections($selectionCollection);
Obțineți o selecție de opțiuni după acest cod:
foreach( $options as $option ){ $_selections = $option->getSelections(); }
După aceea, veți combina toate informațiile despre opțiunile și selecțiile fiecărei opțiuni într-un șir și veți salva acel șir într-o coloană a fișierului CSV. Rulați următorul cod:
$csv_export = ''; if($csv_export == ''){ $file = 'bundle'; $data_title = array('sku', 'website_ids', 'attribute_set_id', 'type_id', 'name', 'description', 'short_description', 'category_ids', 'has_options', 'sku_type', 'weight_type', 'shipment_type', 'status', 'price_type', 'price_view', 'special_price', 'is_in_stock', 'qty', 'bundle_options_selections'); Mage::helper('productbundle')->createCsvfile($file,$data_title); $CSVFileName = Mage::getSingleton('core/session')->getCsvexport(); } foreach($products as $product){ $bundled_product = new Mage_Catalog_Model_Product(); $bundled_product->load($product->getId()); $b_website_ids = implode(',',$bundled_product->getWebsiteIds()); $b_attribute_set_id = $bundled_product->getData('attribute_set_id'); $b_type_id = $bundled_product->getData('type_id'); $b_sku = $bundled_product->getData('sku'); $b_name = $bundled_product->getData('name'); $b_description = $bundled_product->getData('description'); $b_short_description = $bundled_product->getData('short_description'); $b_category_ids = implode(',',$bundled_product->getCategoryIds()); $b_has_options = $bundled_product->getData('has_options'); $b_sku_type = $bundled_product->getData('sku_type'); $b_weight_type = $bundled_product->getData('weight_type'); $b_shipment_type = $bundled_product->getData('shipment_type'); $b_status = $bundled_product->getData('status'); $b_price_type = $bundled_product->getData('price_type'); $b_price_view = $bundled_product->getData('price_view'); $b_special_price = $bundled_product->getData('special_price'); $stock = Mage::getModel('cataloginventory/stock_item')->loadByProduct($bundled_product); $b_is_in_stock = $stock->getIsInStock(); $b_qty = $stock->getQty(); $optionCollection = $bundled_product->getTypeInstance()->getOptionsCollection(); $selectionCollection = $bundled_product->getTypeInstance()->getSelectionsCollection($bundled_product->getTypeInstance()->getOptionsIds()); $options = $optionCollection->appendSelections($selectionCollection); // get all options $options_arr = array(); if(count($options)){ foreach( $options as $option ) { $o_required = $option->getData('required'); $o_position = $option->getData('position'); $o_type = $option->getData('type'); $o_title = $option->getData('default_title'); $_selections = $option->getSelections(); // get all items of each option $selections_arr = array(); if(count($_selections)){ foreach( $_selections as $selection ) { // data of product selection $selection_price_value = $selection->getData('selection_price_value'); $selection_price_type = $selection->getData('selection_price_type'); $selection_qty = $selection->getData('selection_qty'); $selection_can_change_qty = $selection->getData('selection_can_change_qty'); $position = $selection->getData('position'); $is_default = $selection->getData('is_default'); // data of product to import new product $selection = Mage::getModel('catalog/product')->loadByAttribute('sku', $selection->getData('sku')); $website_ids = implode(',',$selection->getWebsiteIds()); $attribute_set_id = $selection->getData('attribute_set_id'); $type_id = $selection->getData('type_id'); $sku = $selection->getData('sku'); $name = $selection->getData('name'); $description = $selection->getData('description'); $short_description = $selection->getData('short_description'); $category_ids = implode(',',$selection->getCategoryIds()); $has_options = $selection->getData('has_options'); $msrp_enabled = $selection->getData('msrp_enabled'); $msrp_display_actual_price_type = $selection->getData('msrp_display_actual_price_type'); $price = $selection->getData('price'); $special_price = $selection->getData('special_price'); $msrp = $selection->getData('msrp'); $status = $selection->getData('status'); $tax_class_id = $selection->getData('tax_class_id'); $weight = $selection->getData('weight'); // $stock_item = $selection->getData('stock_item'); $stock_item = ''; $stock = Mage::getModel('cataloginventory/stock_item')->loadByProduct($selection); $is_in_stock = $stock->getIsInStock(); $qty = $stock->getQty(); $selections_arr[] = implode('#sa#', array($website_ids, $attribute_set_id, $type_id, $sku, $name, $description, $short_description, $category_ids, $has_options, $msrp_enabled, $msrp_display_actual_price_type, $price, $special_price, $msrp, $status, $tax_class_id, $weight, $stock_item, $is_in_stock, $qty, $selection_price_value, $selection_price_type, $selection_qty, $selection_can_change_qty, $position, $is_default)); } } $options_arr[] = implode('#oa#',array($o_required, $o_position, $o_type, $o_title, implode('#s#',$selections_arr))); } } $bundle_options_selections = implode('#o#', $options_arr); $data = array($b_sku, $b_website_ids, $b_attribute_set_id, $b_type_id, $b_name, $b_description, $b_short_description, $b_category_ids, $b_has_options, $b_sku_type, $b_weight_type, $b_shipment_type, $b_status, $b_price_type, $b_price_view, $b_special_price, $b_is_in_stock, $b_qty, $bundle_options_selections); $fp = fopen($CSVFileName, 'a'); fputcsv($fp, $data); }
Un fișier CSV complet este format astfel:
Importați pachetul de produse
Pentru a importa produse în pachet, veți verifica fiecare linie a fișierului CSV pentru a vedea dacă un produs există sau nu după sku. Pentru acele produse care sunt inexistente va trebui să le importați.
Dacă produsele care sunt selecții ale opțiunilor sunt inexistente, trebuie să le importați pe cele cu informațiile disponibile din fișierul CSV pentru a obține id-ul pentru selecția produselor pachetului. Puteți obține ID-ul produselor Selection urmând această regulă:
public function getSelectionId($selection_data){ $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $selection_data[3]); if($product){ $product_id = $product->getData('entity_id'); } else{ //create new product width data of selection product $newProductData = array( // websites - Array of website ids to which you want to assign a new product 'website_ids' => explode(',',$selection_data[0]), 'sku' => $selection_data[3], 'name' => $selection_data[4], 'description' => $selection_data[5], 'short_description' => $selection_data[6], 'status' => $selection_data[14], 'weight' => $selection_data[16], 'tax_class_id' => $selection_data[15], 'price' => $selection_data[11], 'special_price' => $selection_data[12], 'created_at' => strtotime('now'), ); Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); $product = Mage::getModel('catalog/product'); $product->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID) ->setAttributeSetId($selection_data[1]) ->setTypeId($selection_data[2]) ->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)) ->setCategoryIds(explode(',', $selection_data[7])); try{ $product->addData($newProductData); $product->getResource()->save($product); $product->setMediaGallery(array('images' => array(), 'values' => array())); $product->save(); $stockItem = Mage::getModel('cataloginventory/stock_item'); $stockItem->loadByProduct($product->getId()); $stockItem->assignProduct($product); $stockItem->setData('product_id',$product->getId()); $stockItem->setData('is_in_stock', $selection_data[19]); $stockItem->setData('qty',$selection_data[20]); $stockItem->setData('manage_stock', 1); $stockItem->setData('stock_id', 1); $stockItem->setData('use_config_manage_stock', 0); $stockItem->save(); $product_id = $product->getId(); } catch (Exception $e) { Mage::log($e->getMessage()); die("error: ".$e->getMessage()); } } return $product_id; }
Când toate informațiile despre pachetele de produse cu opțiunile și selecțiile lor sunt completate, veți crea pachete de produse urmând codul de mai jos:
$new_product++; try{ Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); $bundleProduct = Mage::getModel('catalog/product'); $bundleProduct ->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID) //you can set data in store scope ->setWebsiteIds(explode(',',$b_website_ids)) //website ID the product is assigned to, as an array ->setAttributeSetId($b_attribute_set_id) //ID of a attribute set named 'default' ->setTypeId('bundle') //product type ->setCreatedAt(strtotime('now')) //product creation time // ->setUpdatedAt(strtotime('now')) //product update time ->setSkuType($b_sku_type) //SKU type (0 - dynamic, 1 - fixed) ->setSku($b_sku) //SKU ->setName($b_name) //product name ->setWeightType($b_weight_type) //weight type (0 - dynamic, 1 - fixed) // ->setWeight(4.0000) ->setShipmentType($b_shipment_type) //shipment type (0 - together, 1 - separately) ->setStatus($b_status) //product status (1 - enabled, 2 - disabled) ->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH) //catalog and search visibility ->setManufacturer(28) //manufacturer id ->setColor(24) // ->setNewsFromDate('06/26/2014') //product set as new from // ->setNewsToDate('06/30/2014') //product set as new to // ->setCountryOfManufacture('AF') //country of manufacture (2-letter country code) ->setPriceType($b_price_type) //price type (0 - dynamic, 1 - fixed) ->setPriceView($b_price_view) //price view (0 - price range, 1 - as low as) ->setSpecialPrice($b_special_price) //special price in form 11.22 // ->setSpecialFromDate('06/1/2014') //special price from (MM-DD-YYYY) // ->setSpecialToDate('06/30/2014') //special price to (MM-DD-YYYY) /*only available if price type is 'fixed'*/ // ->setPrice(11.22) //price, works only if price type is fixed // ->setCost(22.33) //price in form 11.22 // ->setMsrpEnabled(1) //enable MAP // ->setMsrpDisplayActualPriceType(1) //display actual price (1 - on gesture, 2 - in cart, 3 - before order confirmation, 4 - use config) // ->setMsrp(99.99) //Manufacturer's Suggested Retail Price // ->setTaxClassId(4) //tax class (0 - none, 1 - default, 2 - taxable, 4 - shipping) /*only available if price type is 'fixed'*/ // ->setMetaTitle('test meta title 2') // ->setMetaKeyword('test meta keyword 2') // ->setMetaDescription('test meta description 2') ->setDescription($b_description) ->setShortDescription($b_short_description) ->setMediaGallery(array('images' => array(), 'values' => array())) //media gallery initialization ->setStockData(array( 'use_config_manage_stock' => 1, //'Use config settings' checkbox 'manage_stock' => 1, //manage stock 'is_in_stock' => $b_is_in_stock, //Stock Availability ) ) ->setCategoryIds(explode(',',$b_category_ids)); //assign product to categories if($b_has_options == 1){ $i = 0; $i2 = 0; $bundleOptions = array(); $bundleSelections = array(); $bundle_options = explode('#o#',$bundle_options_selections); foreach ($bundle_options as $bun_option){ $option_data = explode('#oa#', $bun_option); $bundleOptions[$i] = array( 'required' => $option_data[0], 'option_id' => '', 'position' => $option_data[1], 'type' => $option_data[2], 'title' => $option_data[3], 'delete' => '', ); $bundle_selections = explode ("#s#", $option_data[4]); foreach ($bundle_selections as $bun_selection){ $selection_data = explode('#sa#', $bun_selection); $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $selection_data[3]); $product_id = Mage::helper('productbundle')->getSelectionId($selection_data); $bundleSelections[$i][] = array( 'product_id' => $product_id, // 'selection_qty' => $selection_data[22], 'selection_qty' => $selection_data[22], 'selection_can_change_qty' => $selection_data[23], 'position' => $selection_data[24], 'is_default' => $selection_data[25], 'selection_id' => '', 'selection_price_type' => $selection_data[21], 'selection_price_value' => $selection_data[20], 'option_id' => '', 'delete' => '' ); $i2++; } $i++; } } //registering a product because of Mage_Bundle_Model_Selection::_beforeSave Mage::register('product', $bundleProduct); Mage::register('current_product', $bundleProduct); //flags for saving custom options/selections $bundleProduct->setCanSaveCustomOptions(true); $bundleProduct->setCanSaveBundleSelections(true); $bundleProduct->setAffectBundleProductSelections(true); //setting the bundle options and selection data $bundleProduct->setBundleOptionsData($bundleOptions); $bundleProduct->setBundleSelectionsData($bundleSelections); $bundleProduct->save(); Mage::getSingleton('adminhtml/session')->addSuccess('Import success'); } catch (Exception $e) { Mage::log($e->getMessage()); echo "error: ".$e->getMessage(); }
Există și alte metode de a importa/exporta produse de pachete pe care le cunoașteți. Ne-ar plăcea să auzim comentariile dvs. și atunci dorim să ne împărtășim cunoștințele. Multumesc pentru lectura.
Puteți descărca extensia completă aici