가져오기 – 번들 제품 내보내기에 대해 알아야 할 모든 것

게시 됨: 2015-01-26

안녕 ! Magesolution 블로그 독자 여러분! 번들 제품 가져오기 – 내보내기에 대한 지식을 충분히 갖추고 있습니까? Magento에서 번들 제품 가져오기 – 내보내기에 대해 완전히 이해하려면 이 기사를 확인하십시오.

최신 업데이트: 성능 향상 및 독점 기능이 포함된 Claue Multipurpose Magento 2 테마 버전 2.0을 출시했습니다. 지금 이 테마를 확인하세요: Claue Magento Theme 2. 0

claue2_edited (1)

라이브 데모

Claue – 깨끗하고 최소한의 Magento 2&1 테마 는 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\제품 번들\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 _제품 번들.xml

<?xml version="1.0"?>
<config>
    <modules>
        <MGS_Productbundle>
            <active>true</active>
            <codePool>local</codePool>
        </MGS_Productbundle>
    </modules>
</config>

config.xml에서 가져오기 및 내보내기 메뉴 만들기

메뉴

설정.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에 의해 존재하는지 여부를 확인합니다. 존재하지 않는 제품의 경우 수입해야 합니다.

옵션의 선택이 된 상품이 존재하지 않는 경우, 번들 상품의 선택을 위한 id를 얻기 위해서는 CSV 파일의 정보가 있는 상품을 가져와야 합니다. 다음 규칙에 따라 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();
					}

자신이 능숙한 번들 제품을 수입/수출하는 다른 방법이 있습니다. 귀하의 의견을 듣고 지식을 공유하고자 합니다. 읽어 주셔서 감사합니다.
여기에서 전체 확장을 다운로드할 수 있습니다.