您需要了解的有關導入 – 導出捆綁產品的所有信息

已發表: 2015-01-26

你好 ! Magesolution博客讀者! 您是否具備足夠的關於進口 - 出口捆綁產品的知識? 查看這篇文章以完全了解在 Magento 中導入 - 導出捆綁產品。

最新更新:我們剛剛發布了 Claue Multipurpose Magento 2 主題的 2.0 版,其中包含一系列性能改進和獨家功能。 立即查看此主題:Claue Magento Theme 2. 0

claue2_edited (1)

現場演示

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')->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

導入捆綁產品

為了導入捆綁產品,您將檢查 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();
					}

還有一些其他方法可以導入/導出您精通的捆綁產品。 我們很想听聽您的意見,並希望屆時分享我們的知識。 謝謝閱讀。
你可以在這裡下載完整的擴展