Commerce digital

Akeneo PIM et Dropbox : importer des ressources depuis Dropbox

by Benoit Wannepain 2 décembre 2019

Akeneo PIM est une puissante solution de gestion d’information produit (Product Information Management) aujourd’hui plébiscitée par nombre d’acteurs du e-commerce pour sa simplicité d’utilisation et les services rendus. Akeneo PIM permet de collecter, gérer, enrichir l’information produit, créer des catalogues, afin de les distribuer sur différents canaux de diffusion (web, print, etc…).

logo Akeneologo Dropbox

La collecte des données est un point crucial dans la réussite des projets PIM. Elles peuvent avoir différentes sources dont des solutions de stockage et de partage de fichiers sur le cloud comme Dropbox. Dropbox est une solution très utilisée qui fournit des clients pour la plupart des systèmes d’exploitation (Windows, Linux, Mac OS, Android, iOS, etc…) permettant de synchroniser des ressources entre un système de fichier local et le cloud. Les fichiers déposés dans Dropbox sont également accessibles via un navigateur Web.

Il nous est donc arrivé qu’une entreprise utilisant Akeneo PIM doive importer des ressources (images, pdf, etc…) stockés sur Dropbox et les rattacher aux bons attributs des bons produits. Pour ce faire, nous avons mis en place une méthodologie spécifique.

1 – Convention de nommage et affectation

En premier lieu, nous établissons une convention de nommage des fichiers sur Dropbox, qui nous permettra d’identifier quel produit et quel attribut mettre à jour.

Les attributs susceptibles de se voir affecter des ressources sont de type “collection de ressources”. Supposons que nous ayons les 3 attributs suivants :

  • images_produit
  • documents_legaux
  • documents_commerciaux

Nous mettons en place les règles suivantes de nommage de fichiers sur Dropbox :

  • doivent être affectés à l’attribut “images_produit” les fichiers dont le nom correspond aux patterns suivants :
    • [SKU_produit]_base.jpg
    • [SKU_produit]_small.jpg
    • [SKU_produit]_thumbnail.jpg
  • doivent être affectés à l’attribut “documents_legaux” les fichiers dont le nom correspond au pattern suivant :
    • [SKU_produit]_LEG_[texte_libre].pdf
  • doivent être affectés à l’attribut “documents_commerciaux” les fichiers dont le nom correspond au pattern suivant :
    • [SKU_produit]_COM_[texte_libre].pdf

Cette convention de nommage des fichiers nous permettra d’affecter correctement les ressources aux bons produits et aux bon attributs.

S’ajoute à ceci la possibilité d’ignorer certains fichiers si leur nom est préfixé d’un _ (underscore).

Enfin, le téléchargement ne doit pas supprimer les fichiers de Dropbox, mais nous ne voulons pas non plus les télécharger s’ils l’ont déjà été.

2 – Mise en place d’un job d’import

Afin de mener à bien cette tâche, on peut mettre en place un job d’import constitué de 3 étapes :

  1. téléchargement des fichiers de Dropbox dans un dossier temporaire du système de fichiers local
  2. import de masse des fichiers fraîchement téléchargés dans le PAM de Akeneo PIM
  3. rattachement des ressources aux bons produits et aux bons attributs

La déclaration du job pourra ressembler à ceci :

3 – Préparation de Dropbox

Nous devons dans un premier temps préparer Dropbox à servir des fichiers à Akeneo PIM. Cela nécessite de créer une application sur Dropbox, à laquelle le PIM aura accès grâce à un jeton d’identification (token). Tout ceci se fait à partir de la console Dropbox.

dropbox console app create

Un bouton permet de créer une nouvelle application, à laquelle on donnera des permissions de type “App folder”. Sur cette page, dans la section OAuth2, on trouvera un bouton permettant de générer un Access token. C’est ce token qui permettra au PIM de s’identifier auprès de Dropbox. Il faut donc le récupérer et le stocker précieusement car il ne sera ensuite plus visible.

Une fois l’application créée, un dossier portant le nom de l’application est créé sur Dropbox. C’est dans ce dossier qu’il faut copier ou déplacer tous les ressources que le PIM doit pouvoir télécharger.

4 – Téléchargement des ressources depuis Dropbox

La première étape consiste à récupérer les fichiers depuis Dropbox. La récupération se fait assez simplement grâce à l’excellente librairie PHP Flysystem qui propose une couche d’abstraction unifiée pour lire et écrire sur différents types de systèmes de fichiers. Flysystem est installé par défaut sur le PIM, mais pas l’adaptateur Dropbox qu’il faut ajouter aux dépendances via la commande suivante :

$ composer require spatie/flysystem-dropbox

Une fois les dépendances installées, nous pouvons configurer un service pour communiquer avec Dropbox :

Ce service requiert qu’on lui fournisse le jeton d’accès généré lors de la configuration de l’application Dropbox. Nous pouvons l’ajouter aux paramètres du PIM :

Nous sommes désormais en mesure de parcourir l’arborescence du système de fichier Dropbox grâce au service flysystem.dropbox.filesystem.

Nous pouvons dès à présent ajouter le code de l’étape de téléchargement des ressources :

Pour qu’à l’étape suivante l’import de masse puisse fonctionner, les fichiers doivent être téléchargés dans un sous-dossier du répertoire temporaire définit par le paramètre tmp_storage_dir, dans le fichier app/config/pim_parameters.yml.

Ce sous-dossier porte par convention le nom d’un utilisateur. Ce peut être, dans notre cas, une chaîne de caractères arbitraire, que nous pouvons passer en paramètre du job (ci-dessous dans le paramètre user – pour les généralités sur la création et le paramétrage de jobs dans Akeneo, je vous renvoie vers la documentation officielle.

$user = $stepExecution->getJobParameters()->get('user');
$uploadContext = new UploadContext($this->tmpStorageDir, $user);

Nous ne devons pas télécharger les ressources qui ont déjà été récupérées lors de précédentes exécutions du job. Pour garder une trace des fichiers téléchargés, nous créons donc une entité Doctrine destinée à stocker cette information en base de données :

Nous pouvons dès lors récupérer cette liste depuis le dépôt :

$dropboxBoxRepository = this->doctrine->getRepository(DropboxAsset::class);
$registeredDownloads = $dropboxBoxRepository->flatArray();

Nous demandons alors à Dropbox de nous renvoyer tout le contenu du dossier racine de l’application que nous avons configurée au début de ce tutoriel :

foreach ($this->dropboxFs->listContents('', true) as $file) {

listContents est une méthode de l’API Flysystem qui renvoie une collection d’éléments contenant les métadonnées des fichiers sur Dropbox (chemin, nom et type de fichier, et des métadonnées spécifiques à Dropbox). Le premier argument de la méthode indique le chemin à partir duquel nous souhaitons lister les fichiers (ici la chaîne de caractères vide signifie “à partir de la racine”) et le deuxième argument est un booléen permettant de lister récursivement ou non.

Nous vérifions ensuite si le fichier est bien pris en charge. S’il ne s’agit pas d’un dossier, et que son nom correspond à une expression régulière connue (cf. conventions de nommage présentées plus haut), le fichier peut être téléchargé dans le dossier temporaire :

$fs->putStream($path, $this->dropboxFs->readStream($file['path'])

Le fichier obtenu, nous pouvons stocker en base de données une nouvelle instance de l’entité DropboxAsset, à laquelle nous donnons une valeur unique nous permettant de facilement la retrouver ultérieurement. Cette valeur unique est construite à partir de l’identifiant et de l’attribut du produit auquel appartient la ressource et un timestamp. Ces informations nous seront utiles pour rattacher les ressources à leurs produits respectifs.

Une fois tous les fichiers téléchargés, nous pouvons passer à l’étape suivante : l’import de ces fichiers dans le gestionnaire de ressources du PIM.

5 – Import en masse des fichiers dans le gestionnaire de ressources du PIM

Le PIM Akeneo propose déjà nativement une commande capable d’importer tous les fichiers ressources, s’ils sont contenus dans un sous-dossier du stockage temporaire (cf. section précédente). Pour plus de détails sur la commande elle-même, je vous renvoie à la documentation officielle.

Ce qui nous intéresse ici, c’est l’automatisation de l’exécution de cette commande une fois le téléchargement des ressources depuis Dropbox effectué. Le framework Symfony, sur lequel repose Akeneo, permet de le faire très simplement :

Je vous renvoie vers la documentation officielle de Symfony pour de plus amples détails.

6 – Rattachement des ressources aux bons produits et aux bons attributs

La dernière étape, une fois les fichiers téléchargés et importés dans le gestionnaire de ressources de Akeneo, consiste à les rattacher aux bons produits et aux bons attributs.

Le code suivant récupère de la base de données les informations sur les nouveaux ressources qui n’ont pas encore été traités. Ces informations nous permettent d’identifier le produit auquel relier la ressource et, via une table de correspondance, l’attribut qui doit être mis à jour.

Il est donc relativement simple de récupérer des ressources depuis Dropbox. Cela peut se faire en trois étapes :

    1. télécharger les ressources localement,
    2. importer les ressources dans le PIM,
    3. rattacher les ressources aux produits.

Nous avons pris ici l’exemple de Dropbox, mais grâce à Flysystem, on pourrait tout aussi bien faire la même chose depuis AWS S3, Azure, SFTP, Google Cloud Storage, WebDAV et bien d’autres, sans avoir beaucoup de code à changer.

Si vous souhaitez être accompagné pour la mise en place de votre PIM, n’hésitez pas à demander conseil à nos experts certifiés Akeneo.

Benoit Wannepain

Benoit Wannepain

Lead Developer

J'ai découvert l'informatique et la programmation dans les années 80. L'essor de l'Internet depuis les années 90 m'a progressivement amené au développement d'applications web backend et à la mise en place des infrastructures de serveurs nécessaires au bon fonctionnement de celles-ci. Aujourd'hui, je m'intéresse particulièrement au framework PHP Symfony et à son écosystème (Akeneo, EzPublish, Oro, ...).

Commentaires

Ajouter un commentaire

Votre commentaire sera modéré par nos administrateurs

Vous avez un projet ? Nos équipes répondent à vos questions

Contactez-nous