Todo lo que necesita saber sobre Importación – Exportación de productos de paquete

Publicado: 2015-01-26

Hola ! ¡Lectores del blog Magesolution ! ¿Ha equipado suficiente conocimiento sobre la importación y exportación de productos de paquete? Consulte este artículo para comprender completamente la importación y exportación de productos de paquete en Magento.

Última actualización: acabamos de lanzar la versión 2.0 de Claue Multipurpose Magento 2 Theme, con un montón de mejoras de rendimiento y funciones exclusivas. Echa un vistazo a este tema ahora: Claue Magento Theme 2. 0

clausula2_editado (1)

Demo en vivo

Claue: Clean, Minimal Magento 2&1 Theme es una excelente plantilla para una tienda de comercio electrónico moderna y limpia con más de 40 diseños de página de inicio y toneladas de opciones para tiendas, blogs, portafolios, diseños de localizador de tiendas y otras páginas útiles. Claue versión 2.0 viene con un montón de características exclusivas que incluyen:

  • Estar basado en el tema Luma.
  • Cumple con todos los estándares de Magento Theme
  • Mejora significativa del rendimiento
  • Compatible con la mayoría de las extensiones de terceros.
  • Totalmente compatible con Magento 2.4.x

Esta segunda versión avanzada se diferencia por completo de la anterior. Por lo tanto, si está utilizando la versión 1 de Claue y desea actualizar a la versión 2 de Claue, solo puede reconstruir un nuevo sitio web en lugar de actualizar desde la versión anterior. Ahora, volvamos al tema principal.

En este artículo, mencionaremos dos cuestiones:

  • Exporte el paquete de productos a un archivo CSV en los formatos disponibles.
  • Importe un archivo CSV que contiene información del producto a la base de datos de Magento

Cree un módulo de paquete de productos con las siguientes estructuras:

aplicación\código\local\MGS\Productbundle\controllers\Adminhtml\ProductbundleController.php

aplicación\código\local\MGS\Productbundle\etc\config.xml

aplicación\código\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

Cree el archivo MGS_Productbundle.xml para activar el módulo

MGS _Productbundle.xml

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

Crear menú para importar y exportar en config.xml

menú

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>

Cree un formulario para importar un paquete de productos desde un archivo CSV

importar

paqueteproducto.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>

Paquete de exportación de productos:

Para exportar productos del paquete a un archivo CSV, debe extraer todos los productos del paquete ejecutando esta línea de código:

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

Después de que esos productos de paquete hayan sido reconocidos y extraídos, puede pasar a exportarlos a un archivo CSV.

En primer lugar, creará un archivo CSV con el formato disponible ejecutando el siguiente código:

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

Se crea la función createCsvfile($file,$data_title) para generar un nuevo archivo CSV y registrar títulos para las columnas, ejecute este código:

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

Además de la información básica de un producto de paquete como sku, nombre, descripción... debe agregar información de las opciones y selecciones de cada opción.

Ejecute este código para extraer información de las opciones:

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

Obtenga una selección de opciones con este código:

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

Después de eso, combinará toda la información de las opciones y selecciones de cada opción en una cadena y guardará esa cadena en una columna del archivo CSV. Ejecute el siguiente código:

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

Un archivo CSV completo se forma así:

CSV

Importar producto de paquete

Para importar productos de paquete, verificará cada línea del archivo CSV para ver si un producto existe o no por sku. Para aquellos productos que no existen, deberá importarlos.

Si los productos que son selecciones de las opciones no existen, debe importar aquellos con la información disponible del archivo CSV para obtener la identificación para la selección de los productos del paquete. Puede obtener la identificación de los productos de selección siguiendo esta regla:

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

Cuando haya completado toda la información de los productos del paquete con sus opciones y selecciones, creará productos del paquete siguiendo el siguiente código:

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

Existen otros métodos para importar/exportar productos de paquetes en los que usted es experto. Nos encantaría escuchar sus comentarios y desearíamos compartir nuestro conocimiento entonces. Gracias por leer.
Puedes descargar la extensión completa aquí