バンドル製品のインポート–エクスポートについて知っておく必要があるすべて

公開: 2015-01-26

こんにちは ! Magesolutionブログリーダー! バンドル製品のインポート–エクスポートについて十分な知識を身に付けましたか? この記事をチェックして、Magentoでのバンドル製品のインポート(エクスポート)について完全に理解してください。

最新のアップデート: Claue Multipurpose Magento 2テーマのバージョン2.0をリリースしました。これには、多数のパフォーマンスの向上と独自の機能が含まれています。 このテーマを今すぐチェックしてください:Claue Magento Theme 2. 0

claue2_edited(1)

ライブデモ

Claue –クリーンで最小限のMagento 2&1テーマは、40以上のホームページレイアウトと、ショップ、ブログ、ポートフォリオ、店舗検索レイアウト、その他の便利なページのオプションを備えた、モダンでクリーンなeコマースストアの優れたテンプレートです。 Claueバージョン2.0には、次のような多数の専用機能が付属しています。

  • ルマのテーマに基づいています。
  • Magentoテーマのすべての基準を満たす
  • 大幅なパフォーマンスの向上
  • ほとんどのサードパーティの拡張機能と互換性があります。
  • Magento2.4.xと完全に互換性があります

この2番目の高度なバージョンは、以前のバージョンとは完全に異なります。 したがって、Claueバージョン1を使用していて、Claueバージョン2に更新する場合は、古いバージョンから更新するのではなく、新しいWebサイトを再構築することしかできません。 それでは、メイントピックに戻りましょう。

この記事では、2つの問題について説明します。

  • バンドル製品を利用可能な形式でCSVファイルにエクスポートします。
  • 製品情報を含むCSVファイルをMagentoデータベースにインポートします

次の構造で製品バンドルモジュールを作成します。

app \ code \ 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

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でインポートおよびエクスポート用のメニューを作成します

メニュー

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ファイルからバンドル製品をインポートするためのフォームを作成します

輸入

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>

バンドル製品のエクスポート:

バンドル製品を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();
}

その後、オプションのすべての情報と各オプションの選択を1つの文字列に結合し、その文字列を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によって1つの商品が存在するかどうかを確認します。 存在しない製品については、それらをインポートする必要があります。

オプションの選択肢である商品が存在しない場合は、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();
					}

熟練したバンドル製品をインポート/エクスポートする方法は他にもいくつかあります。 私たちはあなたのコメントを聞いてみたいです、そしてそれから私たちの知識を共有したいと思います。 読んでくれてありがとう。
ここから完全な拡張機能をダウンロードできます