modules magento

Magento Dataflow - les Adapters par défaut [Partie 2]

Le billet "Magento DataFlow - L'échange de données rendu flexible [Partie 1]" a permis d'introduire le concept global du framework d'échange de données implémenté dans Magento. Aujourd'hui nous allons voir les adapters par défaut implémentés dans le module Dataflow.

  1. Définition d'un Adapter

    Les adapters sont responsables de se connecter dans une ressource de données externe et de récupérer les données ou de sauver les données transmises dans la ressource. Pour ce faire tous les adapters implémentent l'interface Mage_Dataflow_Model_Convert_Adapter_Interface qui contient deux méthodes : load() et save(). Le concept d'échange de données introduit dans le module Dataflow utilise les adapters dans trois contextes :

    • pour lire des données depuis une ressource - en utilisant la méthode load()
    • pour sauver des données vers une ressource - en utilisant la méthode save()
    • pour traiter une ligne analysée - comme défini par les variables du parser

    Pour les deux premiers contextes d'utilisation, la définition XML ressemblera à cela :

    <action type="dataflow/convert_adapter_io" method="load">
        ...
    </action>

    L'élément "action" a deux attributs : "type" et "method". Le "type" définit quelle classe d'apdapter doit être utilisée par cette action. Il est défini par son alias. L'élément "method" définit quelle méthode de la classe de l'adapter doit être appelée. Comme précisé plus tôt, il existe deux méthodes par défaut : load et save. Les éléments fils de l'élément "action" définissent les paramètres utilisés lors de l'exécution de la méthode de l'adapter. Les paramètres sont définis comme dans l'exemple qui suit :

    <action type="dataflow/convert_adapter_io" method="load">
        <var name="type">file</var>
        <var name="path">var/import</var>
        <var name="filename"><![CDATA[products.csv]]></var>
        <var name="format"><![CDATA[csv]]></var>
    </action>

  2. Les adapter par défaut de Magento DataFlow

    Le module Magento DataFlow contient quelques classes par défaut que vous pouvez trouver dans le répertoire app/code/core/Dataflow/Model/Convert/Adapter. Toutes n'implémentent pas encore les méthodes load() et save().

    Pour une utilisation classique de lecture ou d'écriture depuis un fichier local ou distant vous utiliserez dataflow/convert_adapter_io (Mage_Dataflow_Model_Convert_Adapter_Io).

    Les variables suivantes vous permettrons de définir les fichiers locaux/distants comme sources de données :

    • type - définit le type de source à traiter. Valeurs acceptées : file, ftp
    • path - définit le chemin relatif du fichier
    • filename - définit le nom du fichier
    • host - pour le type ftp, définit l'hôte
    • port - pour le type ftp, définit le port IP, 21 par défaut
    • user - pour le type ftp, le om de l'utisateur. Par défaut 'anonymous' et le mot de passe associé est alors 'anonymous@noserver.com'
    • password - pour le type ftp, définit le mot de passe
    • timeout - pour le type ftp, le délai maximum de connexion, 90 par défaut
    • file_mode - pour le type ftp, définit le mode de transfert, FTP_BINARY par défaut
    • ssl - pour le type ftp, utilise ssl si non vide
    • passive - pour le type ftp, définit le type de connexion, false par défaut
  3. Les adapters clients et produits catalogue

    Pour la plupart des entités échangées - client et produits - Magento fournit des adapters par défaut : customer/convert_adapter_customer (Mage_Customer_Model_Convert_Adapter_Customer) et catalog/convert_adapter_product (Mage_Catalog_Model_Convert_Adapter_Product). Les deux héritent de Mage_Eav_Model_Convert_Adapter_Entity.

    Pour charger toutes les données clients d'un magasin sélectionné, vous pouvez utiliser le code XML suivant :

    <action type="customer/convert_adapter_customer" method="load">
        <var name="store">default</var>
    </action>

    Vous aurez parfois besoin de ne pas charger tous les clients dans la base. Les variables suivantes sont disponibles à cet effet :

    • filter/firstname - charge uniquement les clients dont le prénom commence par la valeur précisée
    • filter/lastname - charge uniquement les clients dont le nom commence par la valeur précisée
    • filter/email - tcharge uniquement les clients dont l'adresse électronique commence par la valeur précisée
    • filter/group - charge uniquement les clients dont l'ID de groupe est égal à la valeur précisée
    • filter/adressType - exporte uniquement les addressType précisés; les valeurs possibles sont : both, default_billing, default_shipping
    • filter/telephone - charge uniquement les clients dont le téléphone commence par la valeur précisée
    • filter/postcode - charge uniquement les clients dont le code postal commence par la valeur précisée
    • filter/country - tcharge uniquement les clients dont le code ISO du pays est égal à la valeur précisée
    • filter/region - charge uniquement les clients dont la région est égale à la valeur précisée (2 caractères pour les états américains)
    • filter/created_at/from - charge uniquement les clients dont la date de création est postérieure à la valeur précisée
    • filter/created_at/to - charge uniquement les clients dont la date de création est antérieure à la valeur précisée

    Par exemple:

    <action type="customer/convert_adapter_customer" method="load">
        <var name="store"><![CDATA[0]]></var>
        <var name="filter/firstname"><![CDATA[a]]></var>
        <var name="filter/lastname"><![CDATA[a]]></var>
        <var name="filter/email"><![CDATA[a]]></var>
        <var name="filter/group"><![CDATA[1]]></var>
        <var name="filter/adressType"><![CDATA[default_billing]]></var>
        <var name="filter/telephone"><![CDATA[1]]></var>
        <var name="filter/postcode"><![CDATA[7]]></var>
        <var name="filter/country"><![CDATA[BS]]></var>
        <var name="filter/region"><![CDATA[WA]]></var>
        <var name="filter/created_at/from"><![CDATA[09/22/09]]></var>
        <var name="filter/created_at/to"><![CDATA[09/24/09]]></var>
    </action>

    De la même manière vous pouvez charger et filtrer les produits catalogue dans la base avec les variables suivantes :

    • filter/name - charge les produits dont le nom commence par la valeur précisée
    • filter/sku - charge les produits dont le SKU commence par la valeur précisée
    • filter/type - charge les produits dont le type est la valeur précisée; Les valeurs possible sont : simple, configurable, grouped, bundle, virtual, downloadable
    • filter/attribute_set - charge les produits dont l'ID de jeu d'attribut est la valeur précisée
    • filter/price/from - charge les produits dont le prix est supérieur à la valeur précisée
    • filter/price/to - charge les produits dont le prix est inférieur à la valeur précisée
    • filter/qty/from - charge les produits dont le stock est supérieur à la valeur précisée
    • filter/qty/to - charge les produits dont le stock est inférieur à la valeur précisée
    • filter/visibility - charge les produits dont l'ID de visibilité est égal à la valeur précisée
    • filter/status - charge les produits dont le statut est égal à la valeur précisée

    Par exemple :

    <action type="catalog/convert_adapter_product" method="load">
        <var name="store"><![CDATA[0]]></var>
        <var name="filter/name"><![CDATA[a]]></var>
        <var name="filter/sku"><![CDATA[1]]></var>
        <var name="filter/type"><![CDATA[simple]]></var>
        <var name="filter/attribute_set"><![CDATA[29]]></var>
        <var name="filter/price/from"><![CDATA[1]]></var>
        <var name="filter/price/to"><![CDATA[2]]></var>
        <var name="filter/qty/from"><![CDATA[1]]></var>
        <var name="filter/qty/to"><![CDATA[2]]></var>
        <var name="filter/visibility"><![CDATA[2]]></var>
        <var name="filter/status"><![CDATA[1]]></var>
    </action>

Il peut sembler rébarbatif de voir tous ces ID de valeurs que vous avez à fournir pour les filtres. Heureusement pour ces deux entités - clients et produits - il existe un assistant qui vous permet de générer ces filtres avec de simples boites de sélection.

Dans une prochaine partie, nous verrons comment utiliser parsers et adapters dans la contexte de parsers.

Traduction par Benjamin Bellamy

Magento DataFlow - L'échange de données rendu flexible [Partie 1]

Une des fonctionnalités principales des solutions e-Commerce est la possibilité de partager des données avec les systèmes de gestion de ventes offline. Magento rend les échanges de données flexibles et relativement simples grâce au module DataFlow (flux de données).

Le module DataFlow est un framework d'échange de données qui recourt à quatre types de composants :

  • l'adapter (adaptateur),
  • le parser (analyseur),
  • le mapper (mise en relation)
  • et le validator (validateur).

Dans l'état actuel des développement, les validators ne sont pas implémentés, mais réservés pour une utilisation future.

Le process du module DataFlow est défini dans un fichier XML appelé profile. Magento fournit un assistant pour générer des profiles d'import/export basiques opérant sur les données produits (catalogue) ou les données clients. Un outil de gestion avancé de profiles est également mis à disposition des utilisateurs confirmés qui souhaitent créer le fichier XML du profile

  • sans passer par l'assistant,
  • et/ou pour créer des opérations de flux de données (DataFlow) plus personnalisées qui requièrent des relations avec d'autres entités.

Les Adapters sont responsables de la connexion à une ressource externe de données, de récupérer les données demandées et filtrées.
Cela peut être utilisé par exemple pour récupérer des données depuis :

  • un fichier local ou distant,
  • un web service,
  • une base de données,
  • et caetera.

Par exemple, pour lire des données depuis un fichier CSV vous pouvez mettre le code suivant dans votre fichier XML :

<action type="dataflow/convert_adapter_io" method="load">
    <var name="type">file</var>
    <var name="path">var/import</var>
    <var name="filename"><![CDATA[products.csv]]></var>
    <var name="format"><![CDATA[csv]]></var>
</action>

Pour lire des données depuis un serveur FTP distant vous pouvez utiliser le meme adapter, mais avec les paramètres suivants :

<action type="dataflow/convert_adapter_io" method="load">
    <var name="type">ftp</var>
    <var name="host"><![CDATA[ftp.server.com]]></var>
    <var name="passive">true</var>
    <var name="user"><![CDATA[user]]></var>
    <var name="password"><![CDATA[password]]></var>
    <var name="path">var/import</var>
    <var name="filename"><![CDATA[products.csv]]></var>
    <var name="format"><![CDATA[csv]]></var>
</action>

Les parsers sont responsables de transformer un format de données en un autre. Il peuvent par exemple être utilisés pour convertir le contenu d'un fichier CSV dans un tableau à deux dimensions, ou l'inverse.

Pour parser le contenu d'un fichier CSV dans l'entité produitde la base de données, vous pouvez utiliser le code suivant dans votre profile :

<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_product</var>
    <var name="method">parse</var>
</action>

L'adapter défini au sein des attributs du parser comme <var name="adapter"> et la méthode de l'adapter <var name="method"> sont responsables de l'analyse (parsing) des données lues. Dans ce cas de figure le parser convertit les données du fichier CSV vers un tableau à deux dimensions et appelle la méthode de l'adapter appelée "parse" pour les traiter.

Le moyen le plus simple de personnaliser l'import est de créer son propre adapter et de le préciser dans la déclaration du parser.
Dans la plupart des cas vous aurez besoin de partir d'un adapter existant et de modifier ou de créer votre méthode d'analyse (parsing).

Les Mappers sont responsables de transformer les valeurs des données. Ceci est utile pour faire correspondre un champ à un autre.

Dans l'exemple ci-dessous, la colonne source 'reference' est mappée dans la colonne 'sku' et la variable '_only_specified' est définie à 'true' :

<action type="dataflow/convert_mapper_column" method="map">
    <var name="map">
        <map name="sku"><![CDATA[reference]]></map>
        <map name="name"><![CDATA[name]]></map>
        <map name="price"><![CDATA[price]]></map>
        <map name="qty"><![CDATA[qty]]></map>
    </var>
    <var name="_only_specified">true</var>
</action>

Tout ceci n'est que la partie émergée de l'icerberg des possibilités que le module DataFlow de Magento permet.

Revenez plus tard pour en savoir plus !

Traduction par Benjamin Bellamy

Tutoriel - Développer un module pour Magento - Où commencer ? [Partie 1]

Avez-vous déjà lu la liste complète des fonctionnalités que Magento propose en standard ? Elle est énorme. Et cela devient encore plus impressionnant lorsque vous regardez sur Magento Connect et toutes les extensions qui s'y trouvent.
Cependant, si vous êtes en train de lire ce billet, vous êtes probablement à la recherche de quelque chose qui n'est pas encore disponible.
Ou alors vous êtes un développeur qui aime juste mettre les mains dans le cambouis.
Dans un cas comme dans l'autre, que cela soit pour des raisons de business ou par esprit hacker, developper un module Magento est fun.

Mettons en place quelque chose de vraiment vraiment simple. Le module.
Vous vous demandez ce que ce sacré module va faire. Et bien dans ce premier épisode il ne va absolument rien faire, rien d'autre que d'être déclaré dans votre site Magento !

Où commencer?

Jetez un œil aux répertoires de votre installation de Magento. Dans app > code > local,
créez un répertoire, qui sera un peu le conteneur de vos modules, dans Magento on l'appelle en général pool de code (code pool). Si vous ne savez pas comment le nommer, le nom de la société pour laquelle vous travaillez est en général une bonne option. Ça l'est dans mon cas. ;-)

Ainsi, créons le :

$ cd app/code/local/
$ mkdir Baobaz

Là, dans ce conteneur, nous devrions créer le module. Dans le cadre de ce blog appelons-le "Reader" (dans les épisodes suivants le choix de ce nom devrait se clarifier, si tel n'est pas le cas... eh bien... ça sonne toujours bien ! ;-) )

$ cd Baobaz
$ mkdir Reader

Jusque là, tout va bien. L'étape suivante est un peu plus complexe mais toujours relativement simple. Changeons de répertoire...

$ cd ../../../etc/modules/

Euh... où sommes-nous ?

$ pwd /Your/favorite/place/for/web/projects/magento/app/etc/modules/

Maintenant, vous devez avertir Magento de l'existence de votre module. Pour ce faire vous allez devoir créer un fichier XML. Lancez votre éditeur favori et créez un fichier nommé Baobaz_Reader.xml (comme vous avez sûrement deviné, le nom est formé sur le schéma <nom_du_conteneur>_<nom_du_module>.xml

$ vi Baobaz_Reader.xml

Maintenant collez ceci dans le fichier :

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

Sauvez le fichier. Et voilà ! That's one small step for a man, one giant leap for man...gento. :-)

Afin d'être sûr que Magento ait bien pris en compte votre module, rendez-vous sur le panneau d'administration. Allez sur System > Configuration, sélectionnez Advanced.

Vous devriez voir Baobaz_Reader en haut (ou quelque part par là) de la liste "Disable modules output".

OK, OK, OK... Je reconnais que notre module ne réalise rien pour le moment mais soyez patient, dans les épisodes suivants nous ajouterons des fonctionnalités plus utiles.

À suivre...

Traduction par Benjamin Bellamy

Afficher un block BestSellers (meilleures ventes) sur la page d'accueil de votre site Magento

Une des questions qui vient souvent lors de la mise en place d'un site Magento est la suivante : comment afficher les BestSellers (meilleures ventes) sur la page d'accueil ?

En effet, Magento - dans sa version actuelle du moins - ne propose pas nativement cette fonctionnalité.

Pour autant, si ce manque peut paraître étrange pour une solution e-commerce, il n'est en rien bloquant. Bien au contraire, il va nous permettre de nous rendre compte de la (relative) facilité avec laquelle il est possible de créer de nouveaux blocs, ou du moins de l'évolutivité de l'architecture de Magento.

  1. Récupérez les données

    C'est sûrement la partie la plus compliquée car elle nécessite de maîtriser le modèle objet de Magento.
    À partir du moment où vous savez où aller chercher les données (ici les produits vendus) et comment les requêter (ici en les triant par nombre de ventes décroissantes), obtenir les informations voulues est très simple et tient sur une seule ligne (en fait plusieurs pour un souci de lisibilité).

    $_productCollection = Mage::getResourceModel('reports/product_collection')
        ->addAttributeToSelect('*')
        ->addOrderedQty()
        ->setOrder('ordered_qty', 'desc');

  2. Créer votre block BestSellers

    Respectez le modèle MVC : dans Magento comme dans Zend, chaque objet a sa place et son rôle.
    Créez vos objets métier :
    Typiquement, dans un fichier app/code/local/ma_librairie/Bestseller/Model/Bestseller.php vous définissez votre classe métier qui contient la règle de calcul (ici : afficher les produit nombre de vente décroissante).
    Puis dans app/code/local/ma_librairie/Bestseller/Block/Bestseller.php vous étendez la classe Mage_Core_Block_Template qui se chargera de transmettre proprement les données au block d'affichage.
    Enfin dans app/design/frontend/mon_theme/default/template/catalog/product/view/bestseller.phtml affichez le contenu du block.
    Bien entendu, ces objets doivent être déclarés dans les fichiers XML adéquats.

  3. Affichez votre block

    Il ne vous reste plus qu'à placer votre block dans votre layout actif.
    Pour ce faire, vous pouvez soit modifier votre fichier XML de layout, soit effectuer l'ajout dans le back-office de configuration Magento sur votre page CMS d'accueil.

Pour plus d'information sur les Templates, consultez le billet Créer un template pour son site Magento.

Importer des fichiers dans Magento

Parmi les nombreuses fonctionnalités natives, l'une d'entre elles est l'objet de nombreux questionnements : l'import de fichiers Magento.

En effet, hormis pour quelques rares pure players qui peuvent se contenter du back-office de Magento, la mise en place d'interfaces de connexion avec un système d'informations existant est un passage quasi-obligé dans la mise en place d'une solution e-Commerce.

Il peut alors s'agir :

  • de mettre à jour votre catalogue Magento (SKU, descriptif, images et photos...) depuis un back-office existant,
  • de mettre à jour les états de stocks depuis un back-office existant,
  • de remonter des commandes, en mode batch (par exemple quotidien) ou interactif (en temps réel), depuis Magento vers l'outil logistique,
  • de redescendre des commandes (état des commandes, partielle ou complète, tracking du transport...), toujours en mode batch (par exemple quotidien) ou interactif (en temps réel), depuis l'outil logistique et d'envoyer des e-mails au clients,
  • de remonter les informations relatives aux commandes dans un outil de gestion comptable,
  • de remonter les informations relatives aux clients dans un outil de CRM,
  • et caetera.

Bien entendu, la mise en place de ces opérations, leur automatisation et, surtout, leur rodage, ne peuvent être intégrés nativement pour les centaines (voire milliers) de cas de figures qui peuvent exister dans un module Magento qui serait totalement générique, ou par simple configuration Magento.
En revanche, Magento met à disposition des API et des connecteurs qui permettent de s'interfacer facilement et proprement avec le coeur du système. La part de développement spécifique s'en trouve alors réduite, la compatibilité avec les versions future peut être garantie et c'est surtout la spécification de vos besoins métiers qui vous demandera finalement le plus d'énergie et de temps.

Magento en 10 points

Magento en 10 points : la solution Magento a bénéficié d'un buzz impressionnant depuis la sortie sa version 1 en 2008 et a révolutionné le monde des solutions e-commerce. Les raisons de cet engouement pour les sites Magento sont multiples, en voici 10, la liste est bien entendu non exhaustive.

  1. Une solution opensource, un éditeur solide

    Écrite en PHP, basée sur le framework Zend, Magento est une solution du monde du logiciel libre.
    Cela signifie que le code source est public : tout le monde y a accès, et ce gratuitement. Les contributions venant de toutes parts sont donc les bienvenues et la vitesse d'intégration de spécificités est accrue, comme ce fut par exemple le cas pour la gestion de la TVA : la version initiale n'était pas adaptée au marché européen mais l'ouverture du code a permis de régler ce problème en quelques semaines.
    Pour autant, Magento est développé par une société à but lucratif, Varien, ce qui garantit une uniformité et une cohérence dans les fonctionnalités et une continuité dans les développements, avec plus de soixante personnes à plein temps travaillant sur la solution.

  2. Une solution clef en main

    Téléchargez Magento, décompressez l'archive sur votre serveur Apache/PHP/MySql, lancez la procédure automatique d'installation, accédez à l'inteface d'administration pour effectuer la configuration Magento : vous êtes prêt !
    Par la suite, accédez à l'interface d'administration pour effectuer les mises à jour de version, et ce en deux clics et pas un de plus.
    Reste bien sûr à personnaliser votre boutique et à y intégrer votre catalogue.

  3. Un modèle de données excessivement maléable, une grande richesse fonctionnelle

    Que vous vendiez des chaussures, des chaussettes, des vêtements, des rideaux, du vin, des chambres d'hôtel ou des produits virtuels téléchargeables, le modèle de données de Magento est conçu et pensé pour s'adapter à vos besoins, tout en proposant les fonctionnalités standard que l'on est en droit d'attendre d'un site e-Commerce : produits personnalisables, attributs (tailles, couleurs...) paramétrables, Cross-Sell, Up-Sell, et caetera.
    En outre, la version 1.3 a introduit la notion de flat catalog qui donne un excellent compromis entre paramétrabilité et performances.
    Parmi les nombreuses fonctionnalités disponibles en standard, on peut également citer les outils de gestion des prix et des promotions, accessibles via un module de règles à la fois fonctionnellement évolué et facilement utilisable, par simples clics dans l'interface graphique du back-office

  4. Une gestion avancée de votre charte graphique

    La gestion du design Magento permet de gérer de manière extrèmement poussée l'ergonomie et le template de votre site Magento.
    Fourni avec un modèle graphique de base, Magento vous permet de mettre en page votre boutique comme bon semble, tout en conservant une parfaite compatibilité avec les versions à venir.
    (Voir le billet Créer un template pour son site Magento à ce sujet.)

  5. Une solution pensée pour le référencement naturel

    Réécriture d'URL, saisie des champs meta, gestion du Google Site Map, et caetera, Magento mets à votre disposition tous les outils qui seront nécessaires au bon référencement naturel de votre site Magento.
    (Voir le billet Magento et le référencement naturel pour plus d'informations à ce sujet.)

  6. Un solution ouverte à l'international

    Avec Magento votre boutique est prête pour l'international, avec la possibilité (mais pas l'obligation) d'avoir pour chaque zone ou pays :

    • sa propre devise,
    • sa propre langue (de nombreuses langues - dont le Français - sont disponibles en standard),
    • sa propre charte graphique,
    • son propre sous-catalogue,
    • ses propres règles de port,
    • et caetera.

  7. De nombreux modules de paiement déjà intégrés

    Magento gère aujourd'hui plus de 200 systèmes de paiement, parmis lesquels :

    • ATOS / Sips,
    • CyberMUT Paiement / Paiement CIC,
    • CyberP@iement,
    • FIAT-NET ReceiveAndpay,
    • Google Checkout,
    • Ogone,
    • Paiement par chèque,
    • Paybox,
    • PayPal,
    • SPPLUS,
    • et caetera.

    Il est en outre aisé d'en ajouter de nouveaux.

  8. De nombreux modules de port déjà intégrés

    Magento gère aujourd'hui plus de 50 systèmes de port, parmis lesquels :

    • Gestion du port gratuit, selon critères,
    • Chronospot,
    • Colissimo,
    • DHL,
    • FedEx,
    • TNT, relais colis,
    • UPS,
    • et caetera.

    Il est en outre aisé de personnaliser un module afin de l'adapter à vos contraintes logistiques et à votre politique tarifaire, voire d'en créer de nouveaux.

  9. Une ouverture native vers vos systèmes d'informations

    Magento fournit en standards des modules d'import/export qui permettent l'import de fichier Magento.
    Ces modules peuvent être aisément personnalisés et automatisés pour correspondre au mieux aux pré-requis de votre système existant.
    (Voir le billet Importer des fichiers dans Magento pour plus d'informations à ce sujet.)

  10. Une solution robuste et éprouvée

    Avec aujourd'hui plusieurs centaintes de sites référencés sur Magento, dont certains ne contiennent pas moins de 300000 références (trois cent mille), Magento est aujourd'hui reconnu comme une solution fiable et digne de confiance, quels que soient vos besoins.