Magento : Importer / Exporter les commentaires et les notes des produits 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.

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

Laisser un commentaire

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