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.