您需要了解的有關導入 – 導出捆綁產品的所有信息
已發表: 2015-01-26你好 ! Magesolution博客讀者! 您是否具備足夠的關於進口 - 出口捆綁產品的知識? 查看這篇文章以完全了解在 Magento 中導入 - 導出捆綁產品。
最新更新:我們剛剛發布了 Claue Multipurpose Magento 2 主題的 2.0 版,其中包含一系列性能改進和獨家功能。 立即查看此主題:Claue Magento Theme 2. 0

現場演示
Claue – Clean, Minimal Magento 2&1 Theme是現代和乾淨的電子商務商店的絕佳模板,具有 40 多種主頁佈局和大量商店、博客、投資組合、商店定位器佈局和其他有用頁面的選項。 Claue 版本 2. 0 帶有一系列獨家功能,包括:
- 基於 Luma 主題。
- 滿足 Magento 主題的所有標準
- 顯著的性能提升
- 與大多數第三方擴展兼容。
- 與 Magento 2.4.x 完全兼容
第二個高級版本與之前的版本完全不同。 因此,如果您使用的是 Claue 版本 1 並想更新到 Claue 版本 2,則只能重建新網站,而不是從舊版本更新。 現在,讓我們回到主題。
在本文中,我們將提到兩個問題:
- 以可用格式將捆綁產品導出為 CSV 文件。
- 將包含產品信息的 CSV 文件導入 Magento 數據庫
創建具有以下結構的產品包模塊:
app\code\local\MGS\Productbundle\controllers\Adminhtml\ProductbundleController.php
應用\代碼\本地\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
創建MGS_Productbundle.xml文件以激活模塊
MGS _Productbundle.xml
<?xml version="1.0"?>
<config>
<modules>
<MGS_Productbundle>
<active>true</active>
<codePool>local</codePool>
</MGS_Productbundle>
</modules>
</config>
在 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>
創建表單以從 CSV 文件導入捆綁產品

產品包.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>
出口捆綁產品:
為了將捆綁產品導出為 CSV 文件,您需要通過運行以下代碼來提取所有捆綁產品:
$products = Mage::getResourceModel('catalog/product_collection')->addAttributeToFilter('type_id', array('eq' => 'bundle'));在識別並提取這些捆綁產品後,您可以將它們導出為 CSV 文件。
首先,您將通過運行以下代碼創建具有可用格式的 CSV 文件:
$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();
}
創建 createCsvfile($file,$data_title) 函數以生成新的 CSV 文件並記錄列的標題,運行以下代碼:
// 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);
}除了 sku、名稱、描述等捆綁產品的基本信息之外,您還需要添加選項信息和每個選項的選擇。
運行此代碼以提取選項信息:
$optionCollection = $bundled_product->getTypeInstance()->getOptionsCollection(); $selectionCollection = $bundled_product->getTypeInstance()->getSelectionsCollection($bundled_product->getTypeInstance()->getOptionsIds()); $options = $optionCollection->appendSelections($selectionCollection);
通過此代碼獲取選項的選擇:
foreach( $options as $option ){
$_selections = $option->getSelections();
}
之後,您會將選項的所有信息和每個選項的選擇組合成一個字符串,並將該字符串保存在 CSV 文件的列中。 運行以下代碼:
$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);
}
一個完整的 CSV 文件形成如下:


導入捆綁產品
為了導入捆綁產品,您將檢查 CSV 文件的每一行,以查看一個產品是否存在(按 sku)。 對於那些不存在的產品,您需要導入它們。
如果作為選項選擇的產品不存在,則需要導入具有 CSV 文件可用信息的產品,以獲取用於選擇捆綁產品的 id。 您可以按照以下規則獲取 Selection 產品的 ID:
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;
}
填寫捆綁產品的所有信息及其選項和選擇後,您將按照以下代碼創建捆綁產品:
$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();
}
還有一些其他方法可以導入/導出您精通的捆綁產品。 我們很想听聽您的意見,並希望屆時分享我們的知識。 謝謝閱讀。
你可以在這裡下載完整的擴展
