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