All you need to know about Importing – Exporting Bundle Products

hbmage1

Hi ! Magesolution blog readers ! Have you equipped enough knowledge about importing – exporting Bundle Products? Check this article to understand totally about importing – exporting Bundle Products in Magento.

In this article, we will mention two issues:

  • Export bundle product into CSV file in available formats.
  • Import CSV file containing product information into Magento database

Create Product bundle Module with the following structures:

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

Create MGS_Productbundle.xmlfile to activate the module

MGS_Productbundle.xml

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

Create Menu forImport and Export in config.xml

menu

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>

Create a form to import bundle product from CSV file

import

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>

Export Bundle Products:

In order to export bundle products into CSV file, you need to extract all the bundle products by running this line of code:

$products = Mage::getResourceModel('catalog/product_collection')->addAttributeToFilter('type_id', array('eq' => 'bundle'));

After those bundle products have been recognized and extracted, you can move to export them into a CSV file.

Firstly you will create a CSV file with available format by running the following code:

$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) function is created to generate a new CSV file and record titles for the columns, run this code:

// 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);
}

Besides basic information of a bundle product like sku, name, Description… you need to add information of the options and selections of each option.

Run this code to extract information of the options:

$optionCollection = $bundled_product->getTypeInstance()->getOptionsCollection();
					$selectionCollection = $bundled_product->getTypeInstance()->getSelectionsCollection($bundled_product->getTypeInstance()->getOptionsIds());
					$options = $optionCollection->appendSelections($selectionCollection);

Get selection of options by this code:

foreach( $options as $option ){
$_selections = $option->getSelections();
}

After that you will combine all information of the options and selections of each option into a string and save that string in a column of CSV file. Run the following code:

$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);
				}

A complete CSV file is formed like this:

csv

Import Bundle Product

In order to import bundle products, you will check every line of the CSV file to see if one product is existing or not by sku. For those products which are non-existent you will need to import them.

If the products which are selections of the options are non-existent, you need to import those with the available information of the CSV file to get id for the selection of the bundle products. You can get id of Selection products following this rule:

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;
	}

When all the information of the bundle products with their options and selections is filled out, you will create bundle products following the below code:

$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();
					}

There are some other methods to import/ export bundle products that you are proficient at. We’d love to hear your comments and wish to share our knowledge then. Thanks for reading.
You can download the full extension here

5090 Total Views 2 Views Today