N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.
Voici comment importer / exporter facilement les avis clients et leur notes associées sur la plateforme magento.
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 )
Pour réaliser nos actions nous allons utiliser les profils avancés d’import disponibles en standard sur la plateforme Magento.
Note : Cette version ne gère pas pour l’instant la mise à jour des commentaires existants
Voici le xml d’action pour l’export des commentaires
<action type="mymodule_dataflow/convert_parser_CustomerReviews" method="unparse"> <!--<var name="product_id"><![CDATA[21]]></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[myCsvExportFile.csv]]></var> </action> |
Rien de très compliqué dans celui-ci :
dans le premier nœud « action » nous allons mettre en type notre modèle personnalisé et en méthode la méthode qui sera exécutée.
Si nécessaire il est possible d’exporter uniquement les commentaires et les notes liés à un produit particulier en renseignant la variable « product_id »
Le nom du fichier d’export est à renseigner dans la variable « filename » du dernier noeud « action »
Voici à présent le xml d’action pour l’import des produits
<action type="dataflow/convert_adapter_io" method="load"> <var name="type">file</var> <var name="path">var/import</var> <var name="filename"><![CDATA[myImportFile.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_CustomerReviews</var> <var name="method">parse</var> </action> |
Dans ce xml d’action, les éléments à retenir sont :
« filename » du 1er noeud action qui correspond au nom du fichier à importer. »adapter » du 2ème noeud action qui correspond à la classe qui va gérer l’import
« method » du 2ème noeud action qui correspond à la méthode de la classe qui va gérer l’import.
Voici à présent le contenu du fichier de la classe qui va gérer les imports et les exports, celui-ci est à placer dans l’arborescence « model/convert/parser/ » de votre module.
class MyModel_DataFlow_Model_Convert_Parser_CustomerReviews extends Mage_Eav_Model_Convert_Parser_Abstract { /** * Champs à ignorer dans l'import * @var array */ protected $_ignoreFields = array('review_id','detail_id'); /** * Parsing des données pour l'import */ public function parse() { $batchModel = Mage::getSingleton('dataflow/batch'); /* @var $batchModel Mage_Dataflow_Model_Batch */ $batchImportModel = $batchModel->getBatchImportModel(); $importIds = $batchImportModel->getIdCollection(); foreach ($importIds as $importId) { //print '<pre>'.memory_get_usage().'</pre>'; $batchImportModel->load($importId); $importData = $batchImportModel->getBatchData(); $this->saveRow($importData); } } /** * Sauvegarde de chaque ligne * @param type $importData */ public function saveRow($importData) { $review = Mage::getModel('review/review'); $rating = array(); foreach ($importData as $field => $value) { //On exclus les champs ignorés if (!in_array($field, $this->_ignoreFields)) { //Gestion des notes (@ToDo : Gérer plusieurs notes if (preg_match('#_[0-9]$#', $field)) { $rating[preg_replace('#_[0-9]$#', '', $field)] = $value; continue; } if ($value != '') $review->setData($field, $value); } } //Associations des magasins $review->setStores(array($importData['store_id'])); try { $review->save(); if (sizeof($rating)) { Mage::getModel('rating/rating') ->setRatingId($rating['rating_id']) ->setReviewId($review->getId()) ->setCustomerId($rating['customer_id']) ->addOptionVote($rating['option_id'], $rating['entity_pk_value']); } //Changement de la date de création (Par défaut elle est écrasée par la date du jour dans la fonction _beforeSave() du modèle ) $review->setCreatedAt($importData['created_at']); $review->save(); //Agrégation des données $review->aggregate(); } catch (Exception $e) { echo $e->getMessage(); } } /** * Export des données dans le csv * @return \Ei_DataFlow_Model_Convert_Parser_CustomerReviews */ public function unparse() { //Si on veut filtrer par produit $productId = $this->getVar('product_id'); //Récupération des commentaires $reviews = Mage::getModel('review/review')->getCollection(); //Si on veut filtrer par produit if ( $productId ) $reviews->addFieldToFilter('entity_pk_value',$productId); foreach ($reviews as $review) { $review->load($review->getEntityId()); //Récupération des notes du produit (Normalement 1 seul critère) $ratings = Mage::getModel('rating/rating_option_vote')->getCollection()->addFieldToFilter('review_id', $review->getReviewId()); if (sizeof($ratings)) { $i = 0; foreach ($ratings as $rating) { foreach ($rating->getData() as $key => $value) $review->setData($key . '_' . $i, $value); $i++; } } $batchExport = $this->getBatchExportModel() ->setId(null) ->setBatchId($this->getBatchModel()->getId()) ->setBatchData($review->getData()) ->setStatus(1) ->save(); } return $this; } } |