• Home
  • Nous contacter

Le blog d'Adfab

Le blog d'Adfab

Le blog d'Adfab

Le blog d'Adfab
e-Commerce

Magento : import de masse avec Magmi

Avez-vous déjà eu à importer un grand nombre de produits dans la base Magento ?

Que ce soit en passant par un script shell ou par les fonctionnalités natives de Magento (Dataflow), nous arrivons très vite à des limites techniques : nous sommes confrontés à des temps d’import très longs, ou à des dépassements de mémoire, provoquant l’arrêt du script.

Les objets Magento sont lourds, un $product->save() oblige Magento à loader la structure EAV, ce qui consomme énormément de mémoire, et prend beaucoup de temps pour s’exécuter.

La mémoire allouée n’est pas totalement libérée, due aux références circulaires qu’il peut y avoir sur les instances des objets Magento. Ce phénomène induit à la longue un dépassement de mémoire.

Une solution serait donc d’attaquer la base Magento directement, avec des requêtes SQL. Mais cela nécessite une bonne connaissance de cette base, qui est relativement complexe (nombre de tables impactés, modèle EAV). Heureusement, Magmi est là pour nous simplifier cette tâche.

magmi-logo

Magmi est un outil qui permet d’importer des produits en utilisant des requêtes SQL à partir de l’extension PHP PDO. Il se charge d’intégrer les données produits dans les bonnes tables sans passer par Magento.

Il y a beaucoup de tutoriels concernant l’utilisation du client web de Magmi, mais qu’en est-il de son utilisation dans un script PHP ? C’est ce que nous allons éclaircir.

Mise en oeuvre

Il vous faut télécharger l’archive de Magmi et la décompresser à la racine de Magento.
Une fois que c’est fait, la page web de configuration est accessible à cette adresse : http://magento.dev/magmi/web/magmi.php
Cette page vous servira plus tard à configurer Magmi sur votre environnement.
Si les paramètres de connexion à la base de données sont absentes, Magmi ira les chercher dans le fichier app/etc/local.xml
A l’enregistrement, la configuration est sauvegardée dans magmi/conf, ou magmi/conf/myprofile si vous choisissez de créer un profil du nom de « myprofile ».

Pour utiliser Magmi à partir de PHP, vous devez charger ses fichiers sources :

$path = get_include_path();

$add = [
    Mage::getBaseDir() . '/magmi',
    Mage::getBaseDir() . '/magmi/inc',
    Mage::getBaseDir() . '/magmi/integration/inc',
    Mage::getBaseDir() . '/magmi/engines',
];
$addStr = implode(PATH_SEPARATOR, $add);
set_include_path($path . PATH_SEPARATOR . $addStr);

require_once('magmi_defs.php');
require_once('magmi_datapump.php');

Une fois fait, vous pouvez commencer à utiliser les méthodes de Magmi.

/**
* Cette classe recevra tous les logs émis par Magmi
*/
class MagmiLogger
{

    public function log($message, $type = 'default')
    {
        Mage::log(
            $type . ': ' . print_r($message, true),
            Zend_Log::DEBUG,
            'magmi.log'
        );
    }

}

$dp = Magmi_DataPumpFactory::getDataPumpInstance('productimport');
// le profil par défaut est utilisé, donc la configuration utilisée se trouve dans magmi/conf
// l'import est lancé en mode 'create', c'est-à-dire en mise à jour et création des produits
$dp->beginImportSession('default', 'create', new MagmiLogger());

Tous ce que vous avez à faire, est de passer un tableau à Magmi, avec les données du produit que vous voulez importer :

$data = array(
    'sku' => 'my-sku',
    'attribute_set' => 'Default',
    'store' => 'admin',
    'name' => 'My cool product',
    'description' => 'This is a cool product imported by magmi',
    'short_description' => 'Try it, this is really cool',
    'price' => 13.57,
    'special_price' => 12.34,
    'qty' => '1',
    'weight' => '1',
    'tax_class_id' => '2',
    'type' => 'simple'
);

$dp->ingest($data);

$dp->endImportSession();

Les clés du tableau seront mappées sur les codes d’attributs Magento, et cela fonctionne également avec tous les attributs non natifs.
Les types d’attributs select et multiselect sont également gérés, avec les particularités suivantes :

// si an_existing_value existe déjà dans Magento, magmi détectera l'id de l'option correspondant au label
$data['myselect'] = 'an_existing_value';

// newvalue n'existe pas dans Magento, une nouvelle option sera créée pour l'attribut myselect.
$data['myselect'] = 'new_value';

// par défaut, les options des mutliselect se transmettent en étant séparées par des virgules
// c'est cependant modifiable dans les fichiers de configuration ou depuis l'interface web.
$data['mymultiselect'] = 'one,two,tree';

Il est aussi possible de gérer l’affectation aux catégories :

// le produit sera affecté aux catégories d'id 15 et 23
$data['category_ids'] = '15,23';

// Il est également possible de gérer les positions des produits dans chaque catégories
$data['category_ids'] = '15::5,23::10';

Les fonctionnalités du core de Magmi ne gèrent pas tout. Heureusement il vient avec une série de plugins pour vous aider à importer d’autres caractéristiques spécifiques de vos produits.

Par exemple, pour les images, il vous faudra activer le plugin « Image attributes processor » depuis l’interface web, ce qui modifiera vos fichiers de configuration dans magmi/conf.

Une fois actif il est possible d’importer les images comme ceci :

$data['image'] = '/path/to/image.jpg';
// préfixer par + retire l'image de la fiche produit
$data['small_image'] = '+/path/to/small_image.jpg';

// pour toutes les autres images :
$data['media_gallery'] = implode(';', array(
    '/path/to/image1.jpg',
    '/path/to/image2.jpg'
));

Il existe beaucoup d’autres plugins à activer en fonction de votre utilisation:

  • Image attributes processor : permet d’importer des images produit
  • Product relater : pour créer des associations entre les produits
  • Configurable Item processor : afin de créer des produits configurables et les liaisons avec les produits simples
  • Product Deleter : pour supprimer des produits en leur fournissant les SKU

Ceci est une petite liste non exhaustive, la liste complète se trouve sur la page de configuration de Magmi : /magmi/web/magmi.php.

Le fonctionnement de chaque plugin est expliqué dans la documentation de Magmi.

La documentation se base sur les formats csv, il suffit de reprendre le même format pour l’insérer dans le tableau PHP.

En conclusion, Magmi est donc un outil souple et rapide qui ne souffre pas de fuite de mémoire, c’est donc une excellente solution pour les imports de très gros catalogue.

19/12/2016 8 MIN READ TAGS: Backend Development, Magento, Magmi BY: Arnaud HOURS 0 COMMENT
SHARE
LIRE LA SUITE

Arnaud HOURS

Prestashop 1.7, pourquoi pas...

Magento plugin for NetBeans IDE (part. 1)

VOUS POURRIEZ AIMER

CMS e-Commerce J’ai testé pour vous Drupal Commerce !

e-Commerce Module Prestashop | épisode 2

e-Commerce Création d’un module magento (Part 1)

e-Commerce Outils Magento plugin for NetBeans IDE (part. 2)

e-Commerce Outils Magento plugin for NetBeans IDE (part. 1)

Développement e-Commerce Framework Sylius, une vraie alternative à Prestashop ou Magento ?

A propos d’Adfab

Nous sommes un studio de production digitales et d’innovation digitales au service des agences et des annonceurs
Nous recherchons le scintillement dans les regards et le plaisir de réalisations sur-performantes
Nous sommes techno-agnostiques
Nous sommes Adfab

Le blog d'Adfab
Copyright © 2018 Adfab Connect