Bienvenue, Invité
Merci de vous identifier ou de vous inscrire.    Mot de passe perdu?

[tuto] importer les catégories dans magento depuis un CSV
(1 lecteur(s)) (1) Invité(s)
Aller en basPage: 1234567
SUJET:

[tuto] importer les catégories dans magento depuis un CSV

**
#14682
astrolab
Fresh Boarder
Messages: 11
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur

[tuto] importer les catégories dans magento depuis un CSV

Il y a 8 Années, 7 Mois
Karma: 3  
Bonjour,

comme indiqué lors d'un post précédent, voici un tuto avec fichiers afin d'expliquer la mise en place de l'import des catégories.

Ayant galéré quelques temps pour une fonction qui devrait être de base. Voici les informations récoltées.

Il faut dézipper l'archive et transférer les répertoires app et var sur le serveur magento. Sinon voici les fichiers

dans : app/code/local/Astrolab/Catalog/etc/config/xml
Code :


<?xml version="1.0"?>
<config>
  <global>
    <models>
      <catalog>
        <rewrite>
            <convert_adapter_category>Astrolab_Catalog_Model_Convert_Adapter_Category</convert_adapter_category>
        </rewrite>
      </catalog>
    </models>
  </global>
</config>




dans : app/code/local/Astrolab/Catalog/Model/Convert/Adapter/Category.php
Code :


<?php
class Astrolab_Catalog_Model_Convert_Adapter_Category
    extends Mage_Eav_Model_Convert_Adapter_Entity
{
    protected $_categoryCache = array();

    protected $_stores;

    /**
     * Category display modes
     */
    protected $_displayModes = array( 'PRODUCTS', 'PAGE', 'PRODUCTS_AND_PAGE');

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

    /**
     * Save category (import)
     *
     * @param array $importData
     * @throws Mage_Core_Exception
     * @return bool
     */
    public function saveRow(array $importData)
    {
        if (empty($importData['store'])) {
            if (!is_null($this->getBatchParams('store'))) {
                $store = $this->getStoreById($this->getBatchParams('store'));
            } else {
                $message = Mage::helper('catalog')->__('Skip import row, required field "%s" not defined', 'store');
                Mage::throwException($message);
            }
        } else {
            $store = $this->getStoreByCode($importData['store']);
        }

        if ($store === false) {
            $message = Mage::helper('catalog')->__('Skip import row, store "%s" field not exists', $importData['store']);
            Mage::throwException($message);
        }

        $rootId = $store->getRootCategoryId();
        if (!$rootId) {
            return array();
        }
        $rootPath = '1/'.$rootId;
        if (empty($this->_categoryCache[$store->getId()])) {
            $collection = Mage::getModel('catalog/category')->getCollection()
                ->setStore($store)
                ->addAttributeToSelect('name');
            $collection->getSelect()->where("path like '".$rootPath."/%'");

            foreach ($collection as $cat) {
                $pathArr = explode('/', $cat->getPath());
                $namePath = '';
                for ($i=2, $l=sizeof($pathArr); $i<$l; $i++) {
                    $name = $collection->getItemById($pathArr[$i])->getName();
                    $namePath .= (empty($namePath) ? '' : '/').trim($name);
                }
                $cat->setNamePath($namePath);
            }

            $cache = array();
            foreach ($collection as $cat) {
                $cache[strtolower($cat->getNamePath())] = $cat;
                $cat->unsNamePath();
            }
            $this->_categoryCache[$store->getId()] = $cache;
        }
        $cache =& $this->_categoryCache[$store->getId()];

        $importData['categories'] = preg_replace('#\s*/\s*#', '/', trim($importData['categories']));
        if (!empty($cache[$importData['categories']])) {
            return true;
        }

        $path = $rootPath;
        $namePath = '';

        $i = 1;
        $categories = explode('/', $importData['categories']);
        foreach ($categories as $catName) {
            $namePath .= (empty($namePath) ? '' : '/').strtolower($catName);
            if (empty($cache[$namePath])) {

                $dispMode = $this->_displayModes[2];

                $cat = Mage::getModel('catalog/category')
                    ->setStoreId($store->getId())
                    ->setPath($path)
                    ->setName($catName)
                    ->setIsActive(1)
                    ->setIsAnchor(1)
                    ->setDisplayMode($dispMode)
                    ->save();
                $cache[$namePath] = $cat;
            }
            $catId = $cache[$namePath]->getId();
            $path .= '/'.$catId;
            $i++;
        }

        return true;
    }

    /**
     * Retrieve store object by code
     *
     * @param string $store
     * @return Mage_Core_Model_Store
     */
    public function getStoreByCode($store)
    {
        $this->_initStores();
        if (isset($this->_stores[$store])) {
            return $this->_stores[$store];
        }
        return false;
    }

    /**
     *  Init stores
     *
     *  @param    none
     *  @return      void
     */
    protected function _initStores ()
    {
        if (is_null($this->_stores)) {
            $this->_stores = Mage::app()->getStores(true, true);
            foreach ($this->_stores as $code => $store) {
                $this->_storesIdCode[$store->getId()] = $code;
            }
        }
    }
}

?> 



dans : app/etc/modules/Astrolab_All.xml
Code :


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



Dans le back office, il faut sélectionner :
System > Importer/Exporter > Profils Avancés > Nouveau profil
Dans nom du profil : Import des catégories
Dans XML actions :

mettre le contenu ci-dessous entre les

Code :


<action type="dataflow/convert_adapter_io" method="load">
    <var name="type">file</var>
    <var name="path">var/import</var>
    <var name="filename"><![CDATA[Categories.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="store"><![CDATA[0]]></var>
    <var name="number_of_records">1</var>
    <var name="decimal_separator"><![CDATA[.]]></var>
    <var name="adapter">catalog/convert_adapter_category</var>
    <var name="method">parse</var>
</action> 



Dans le répertoire /var/import/
Il faut mettre un fichier nommé Categories.csv (le ficher Categories.csv peut être remplacer par un autre nom mais dans ce cas il faut modifier le nom dans le CDATA précédent :
Code :


"store","categories"
"default","Categorie1/scategorie1"
"default","Categorie1/scategorie2"
"default","Categorie1/scategorie3"
"default","Categorie2/scategorie1"



Enfin
Il faut lancer l'importation en cliquant sur "Lancer le profil"


Astrolab, 7/06/2009


P.S. : maintenant il ne reste plus que la partie export.
P.S2 : j'ai aussi tester l'import des catégories depuis Open Erp cela fonctionne, mais je n'ai pas encore pu voir pour importer les catégories dans Open Erp (soit par CSV soit depuis magento) pour boucler la boucle Fichier réservé aux membres.
Veuillez vous connecter ou vous enregistrer.
 
L'administrateur a désactivé l'accès public en écriture.
#14684
astrolab
Fresh Boarder
Messages: 11
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur

Re:[tuto] importer les catégories dans magento depuis un CSV

Il y a 8 Années, 7 Mois
Karma: 3  
Pour l'export depuis magento, il existe une solution qui reste à améliorer.
Mais cela concerne la mise en place d'un web service qui lorsque l'on fait appel à une URL, la liste des catégories est générée.

Il faut que je remette la main sur le code car je pensais que cela ne fonctionnait pas sur mon serveur mais en fait cela venait d'un pb de parametrage du webservice.
 
L'administrateur a désactivé l'accès public en écriture.
#14706
Fibo
Platinum Boarder
Messages: 369
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur
Conseil & coaching informatiques Lieu: Marseille

Re:[tuto] importer les catégories dans magento depuis un CSV

Il y a 8 Années, 7 Mois
Karma: 3  
J'avais eu des pbs avec des imports csv de produits, pb qui ont disparu qaund j'ai annulé les catalogues à plat pour les catégories et les produits. (Et, par prudence, désactivé le cache).

A garder en mémoire si l'import catégories ne se passe pas comme prévu.
 
L'administrateur a désactivé l'accès public en écriture.
#14728
astrolab
Fresh Boarder
Messages: 11
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur

Re:[tuto] importer les catégories dans magento depuis un CSV

Il y a 8 Années, 7 Mois
Karma: 3  
Voici la partie pour exporter les catégories par le biais du webservice

Dans le fichier export_category.php
Code :


<?php
    $proxy = new SoapClient('http://www.monsite.com/index.php/api/?wsdl');
    $sessionId = $proxy->login('export_category', 'magento');
    $liste = $allCategories = $proxy->call($sessionId, 'category.tree');

function category($cat,$detail)
{
        printf("\"%s\",\"%s%s\"\n",$cat['category_id'],$detail,$cat['name']);
        $detail .= $cat['name'].'/';
        foreach ($cat['children'] as $child)
        {
                category($child,$detail);
        }
}
    echo '<pre>';
    category($liste,'');
    echo '<pre>';
?>


ne pas oublier de remplacer monsite.com par votre site.

Ensuite il faut placer ce fichier à la racine de magento afin de pouvoir être appelé par
www.monsite.com/export_category.php
de là il faudra copier les données dans un fichier texte au format CSV

Dans le back office, il faut sélectionner :
System > Web Services > Rôles
Cliquer sur "Nouveau Rôle"
Dans infos du rôle : catégorie
Dans Ressources du Rôle : sélectionner tous
Sauvegarder


System > Web Services > Utilisateurs
Cliquer sur "Nouvel utilisateur"

Dans infos de l'utilisateur :
Nom de l'utilisateur (login) : export_category
Nom et prénom : comme vous voulez
email : le votre
Nouvelle clé API (password) (exemple) : magento
Confirmation de la clé API : magento
compte : actif

Dans la rubrique Rôle de l'utilisateur : sélectionner catégorie
sauvegarder
 
L'administrateur a désactivé l'accès public en écriture.
#21117
Guillaume
Fresh Boarder
Messages: 1
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur
Sexe: Masculin

Re:[tuto] importer les catégories dans magento depuis un CSV

Il y a 8 Années, 3 Mois
Karma: 0  
Bonjour à tous et à toutes,

Je tiens déjà à remercier Astrolab pour son Totu sur l’import des catégories, qui est tout à fait limpide. Mais malheureusement, je n’arrive toujours pas à importer les catégories.

Je travaille en local avec WampServer Version 2.0
Version de Magento : 1.3.2.4
Version de MySQL : 5.1.36
Version d’Apache : 2.2.11
Version de PHP : 5.2.11

J’ai donc suivi le Tuto de Astrolab et au moment de l’import du fichier CSV, je rencontre cette erreur.

Code :

<br /> <b>Fatal error</b>: Call to undefined method Astrolab_Catalog_Model_Convert_Adapter_Category::getStoreById() in <b>C:\wamp\www\magento\app\code\local\Astrolab\Catalog\Model\Convert\Adapter\Category.php</b> on line <b>42</b><br />


Voici le contenu de mon fichier CSV :
"store","categories"
"fr_part","Apparel/Shoes"
"fr_part","Apparel/Clearance"
"fr_part","Electronics"

Si j’ai compris la colonne store fait référence au code de la vue magasin (storeview)...

Quelqu’un peut-il m’aider à résoudre ce problème ?

Merci.

Voici l'erreur en image :
Image réservée aux membres.
Veuillez vous connecter ou vous enregistrer.
 
Dernière édition: 16/10/09 à  07:16 Par Guillaume.
L'administrateur a désactivé l'accès public en écriture.
#21869
Fanou
Fresh Boarder
Messages: 2
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur

Re:[tuto] importer les catégories dans magento depuis un CSV

Il y a 8 Années, 2 Mois
Karma: 0  
Bonjour,

je suis dans le même cas que Guillaume.
Tout l'export se passe sans problème (un grand merci pour ce tuto) mais l'import me renvoi ce message d'erreur :

Code :

 <br /> <b>Fatal error</b>: Call to undefined method Astrolab_Catalog_Model_Convert_Adapter_Category::getStoreById() in <b>/srv/d_monserveur/www/www.mondomaine.com/htdocs/app/code/local/Astrolab/Catalog/Model/Convert/Adapter/Category.php</b> on line <b>42</b><br />


Certains ont-ils eu ce même souci ? Savez-vous comment réussir son import ?

Merci d'avance pour votre aide.
 
Dernière édition: 01/11/09 à  16:41 Par Fanou.
L'administrateur a désactivé l'accès public en écriture.
#22814
bee-company
Expert Boarder
Messages: 84
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur

Re:[tuto] importer les catégories dans magento depuis un CSV

Il y a 8 Années, 2 Mois
Karma: 0  
Bonsoir,
J'ai tout bien recopié... mais en export, j'obtiens :
Fatal error: Class 'SoapClient' not found in C:\wamp\www\...\magento\export_category.php on line 2
Quelqu'un a une idée ??? Merci d'avance et merci surtout à Astrolab pour ces codes économiseurs de temps.

Précisions d'usage : Site sous Wamp.
 
Dernière édition: 17/11/09 à  01:54 Par bee-company.
L'administrateur a désactivé l'accès public en écriture.
#22822
Kalliser
Expert Boarder
Messages: 126
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur
Sexe: Masculin The Academy Lieu: Paris Date anniversaire: 03/07

Re:[tuto] importer les catégories dans magento depuis un CSV

Il y a 8 Années, 2 Mois
Karma: 6  
AS tu activé l'extension php php_soap dans wamp ?
Car il ne l'est pas par défaut.
 
Expert Magento @ The e-Commerce Academy

L'administrateur a désactivé l'accès public en écriture.
Revenir en hautPage: 1234567
Modérateur: Gabriiiel, ILOA, zuiko