Magento : Importer / Exporter les produits complémentaire ( upsell , crossell , related ) via les profils avancés

Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

Suivant la même méthodologie que l’import export des commentaires clients, nous allons voir à présent comment importer/ exporter les produits complémentaires.

Nous partons du postulat que nous créons un nouveau module « Module_Dataflow »
( les étapes de création du module ne seront pas détaillées )

Cette méthode fonctionne pour les éléments suivants :

  • Produits apparentés
  • Ventes incitatives
  • Ventes croisées

 

Voici le xml pour l’export des produits complémentaires

<action type="mymodule_dataflow/convert_parser_LinkedProducts" method="unparse">
<!-- Filtrage par produit <var name="product_id" >157</var> -->
<!-- Filtrage par type export ( upsell|crossel|related) defaut : upsell ) <var name="type">upsell</var> -->
</action>
<action type="dataflow/convert_mapper_column" method="map">
</action>
<action type="dataflow/convert_parser_csv" method="unparse">
<var name="delimiter"><![CDATA[;]]></var>
<var name="enclose"><![CDATA["]]></var>
<var name="fieldnames">true</var>
</action>
<action type="dataflow/convert_adapter_io" method="save">
<var name="type">file</var>
<var name="path">var/export</var>
<var name="filename"><![CDATA[exports-produits-complementaires.csv]]></var>
</action>

Voici le xml d’import des produits ( Le type d’import est déterminé par le nom des colonnes du fichier )

<action type="dataflow/convert_adapter_io" method="load">
<var name="type">file</var>
<var name="path">var/import</var>
<var name="filename"><![CDATA[produits complementaires.csv]]></var>
<var name="format"><![CDATA[csv]]></var>
</action>
<action type="dataflow/convert_parser_csv" method="parse">
<var name="delimiter"><![CDATA[;]]></var>
<var name="enclose"><![CDATA["]]></var>
<var name="fieldnames">true</var>
<var name="number_of_records">1</var>
<var name="decimal_separator"><![CDATA[.]]></var>
<var name="adapter">mymodule_dataflow/convert_parser_LinkedProducts</var>
<var name="method">parse</var>
</action>

Voici le code qui gère l’import

<?php
 
/**
* Import des produits apparentés
* Import des ventes incitatives
* Import des ventes croisées
*
*/
class MyModule_DataFlow_Model_Convert_Parser_LinkedProducts extends Mage_Eav_Model_Convert_Parser_Abstract {
 
 
 
public function parse() {
 
$batchModel = Mage::getSingleton('dataflow/batch');
 
$batchImportModel = $batchModel->getBatchImportModel();
$importIds = $batchImportModel->getIdCollection();
 
foreach ($importIds as $importId) {
$batchImportModel->load($importId);
$importData = $batchImportModel->getBatchData();
$this->saveRow($importData);
}
}
 
/**
* Import des données
* @param type $importData
*/
public function saveRow($importData) {
 
//En fonction du nom de la colonne  ( upsell_1 | related_1 | crossel_1 ) on détermine quel import doit être exécuté
if (array_key_exists('related_1', $importData)){
$mode = 'related';
$method = 'setRelatedLinkData';
}
else if (array_key_exists('crossel_1', $importData)) {
$mode = 'crossel';
$method = 'setCrossSellLinkData';
}
else {
$mode = 'upsell';
$method = 'setUpSellLinkData';
}
 
//Chargement du produit
$productId = Mage::getModel('catalog/product')->getIdBySku($importData['sku']);
 
if (!$productId)
return false;
 
$product = Mage::getModel('catalog/product')->load($productId);
$complementaryProducts = array();
 
$i = 1;
foreach ($importData as $key => $data ) {
 
if (preg_match('#^' . $mode . '#', $key) && $data != '') {
 
$complementaryProductId = Mage::getModel('catalog/product')->getIdBySku($data);
if ( !$complementaryProductId ) {
//echo 'Produit '.$data.'n\'existe pas';
continue;
}
 
$complementaryProducts[$complementaryProductId] = array('position' => $i);
$i++;
}
}
$product->{$method}($complementaryProducts);
$product->save();
}
 
 
 
 
/**
* Export des données
*/
public function unparse() {
 
$productId = $this->getVar('product_id'); //Filtrage par produit
$exportType = $this->getVar('type'); //Mode d'export
 
$products = Mage::getModel('catalog/product')->getCollection();
 
if ($productId)
$products->addFieldToFilter('entity_id', $productId);
 
foreach ($products as $product) {
 
$product->load($product->getEntityId());
 
if ($exportType == 'related') //Produit lié
$complementaryProducts = $product->getRelatedProducts();
else if ($exportType == 'crossel')
$complementaryProducts = $product->getCrossSellProducts();
else {
$complementaryProducts = $product->getUpSellProducts();
$exportType = 'upsell';
}
 
 
if (sizeof($complementaryProducts)) {
$rowData = array();
$rowData['sku'] = $product->getSku();
$rowData['product_name'] = $product->getName(); //Clé volontairement changée pour ne pas être importée
$i = 1;
foreach ($complementaryProducts as $complementaryProduct) {
$rowData[$exportType . '_' . $i] = $complementaryProduct->getSku();
$i++;
}
 
$batchExport = $this->getBatchExportModel()
->setId(null)
->setBatchId($this->getBatchModel()->getId())
->setBatchData($rowData)
->setStatus(1)
->save();
}
}
}
 
}
 
?>

3 réflexions sur “Magento : Importer / Exporter les produits complémentaire ( upsell , crossell , related ) via les profils avancés”

  1. Merci pour ces détails précis .
    Je débute depuis 3 mois sur les export / imports de masse , c est vraiment un gain de temps énorme .
    Par contre lorsque l on re-créer un attribut en BO celui n est pas pris en compte ds l’export ou l import …j essaye désespérément ….une idée ?
    Merci

    1. Bonjour,

      Il faudrait être plus précis dans la description de votre problème.
      Quel genre d’import / exports utilisez vous ? ( produits / clients / commandes / perso )
      Quel type d’attribut est modifié ? est-ce que les valeurs sont liés à des sites / stores différents ?

      Cordialement,

  2. Quel réactivité 🙂

    J’ai crée un attribut dans catalogue produit que j’ai appelé  » mpn  »

    Dans le back office il est bien placé avec le jeux/groupe d’attribut de notre site web .

    Sur notre site nous avons « matché » le champ sku pour avoir les mêmes codes que nos fournisseurs et donc mettre à jour les produits , des codes barres / douane plus facilement …

    Ce matin j’ai rentré 300 codes barres d’un coup en creant un nouvel attribut « gtin » , ensuite j’import un tableau excel ( de mon fournisseur ) avec 1 colonne sku et la nouvelle colonne « gtin », en passant par le scrip d’import …nickel …par contre impossible avec le nouvel attribut …le module fonctionne , mais auccune import.

    Mon fichier csv est bien codé en UTF8 …

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *