21/10/2023 Franck Bugnet Tuto

Import de packs de produits PrestaShop

Un pack est un produit du catalogue contenant plusieurs autres produits, ou déclinaisons de produits, pour les vendre ensemble. En boutique le prix du lot sera bien souvent inférieur aux prix additionés des produits le composant. Souvent les clients adorent ce type de réduction. 

La création et la gestion des packs multi produits dans PrestaShop est une fonction relativement simple à utiliser mais prend du temps.
Si vous en avez beaucoup à générer, il est sans doute plus rapide de passer par l'importation d'un fichier catalogue et consacrer votre temps précieux à vos clients.

Il existes beaucoup de modules d'import spécialisés, mais pourquoi faire l'achat d'un enième module et ralentir encore votre boutique alors que notre application Merlin, véritable couteau suisse, sait aussi le faire. Cet article vous explique comment créer facilement des packs produits avec le module Merlin et sa fonction d'import dans des champs custom (disponible à partir de la version 1.6).


Création d'un csv ou xls (xlsx) contenant les packs


La première étape consiste à comprendre ou sont stockés les packs dans la base de données et sous quelle forme.
Sous PHPMyAdmin, on trouve dans la base une table nommée pack (ou ps_pack si le préfix est par exemple ps_ ), qui contient ces colonnes :

Table pack dans la base de PrestaShop

On comprend que la rubrique id_product_pack est l'identifiant PrestaShop du pack (c'est aussi un produit) et que id_product_item est l'identifiant PrestaShop d'un des produits du pack. Si le pack contient x produits, il faudra insérer x lignes de ce type.
Les autres rubriques sont facultatives. La quantité vaudra par exemple 1 par défaut.
On peut aussi en remplissant la rubrique id_product_attribute_item, faire des packs de déclinaisons. L'exemple ci dessous ne couvre pas ce cas, mais sachez que la procédure est la même, en ajoutant une colonne supplémentaire dans le fichier, contenant l'identifiant de la déclinaison, en la mappant à pack.id_product_attribute_item.

En analysant les tables de base product et product_shop, on peut voir qu'elles contiennent aussi des données relatives aux packs : "pack_stock_type" par exemple qui défini comment doit être géré le stock :

  • 0 pour indiquer que seul le stock du pack sera décrémenté lors d'une vente
  • 1 pour indiquer que seules les quantités des produits enfants seront décrémentés lors d'une vente
  • 2 pour que les deux soient décrémentés
  • 3 pour que la gestion pour ce pack soit celle définie au niveau global dans PrestaShop


Dans la table product on trouve aussi la rubrique booléene (vaut 0 ou 1) "cache_is_pack" servant à mémoriser le fait que le produit est un pack. Par expérience cela fonctionne sans, mais on va l'inclure quand même pour que l'exercice soit complet.

A partir de cette analyse rapide, prenons un exemple et préparons un fichier.
Voici la situation de départ, supposons que nous souhaitions transformer le premier produit (Id=1, sans déclinaisons) en un pack contenant les produits 2 et 3 (eux aussi sans déclinaisons pour simplifier l'exercice) et lors de la même opération, ajouter au catalogue une nouvelle offre contenant les produits 9 et 10 :

Produits à regrouper dans un pack

Pour cela on créé un fichier xlsx dans Excel, ou un simple csv, constitué ainsi :
Quatre lignes, une pour chaque composant des packs.

  • Une colonne pour l'identifiant du produit modifié ou créé. Pour le second produit, qui n'existe pas encore, notez que je lui donne cependant un identifiant (valeur 100, non encore utilisée) et vous expliquerai pourquoi un peu plus tard.
  • Une seconde colonne avec la même valeur, qui ira remplir la rubrique id_product_pack dans la table pack.
  • Une colonne pour lui donner un nom ou changer son nom
  • Une autre contenant les identifiants des produit contenus dans le lot.
  • Une autre pour le mode de gestion de la quantité (on pourrait s'en passer, ce paramètre prendrait alors la valeur par défaut).
  • Et enfin une dernière pour cache_is_pack (ça marche aussi sans doute sans).


A noter que l'on peut donner aux colonnes n'importe quel nom. La seule rêgle avec Merlin étant que chaque colonne doit avoir un titre et qu'il soit unique.
Cependant, par habitude, j'ai donné à certaines colonnes le nom du champ dans la base, comme id_product ou name, car cela permet de gagner encore un peu de temps lors de l'étape suivante, grâce au mapping automatique.
J'aurais pu être encore plus efficace, en titrant la colonne C : pack.id_product_pack et la D : pack.id_product_item, on verra plus loin pourquoi.

Bien sûr, il est possible d'aller beaucoup plus loin, en incluant d'autres rubriques pour importer ou mettre à jour le prix du pack, ht ou ttc, sa règle de taxes, ses images, sa description et son résumé dans une langue quelconque, ses catégories associées, ses caractéristiques, d'autres champs texte libres. Bref n'importe quels champs permettant de définir un produit.

Fichier d'import de packs

Préparation de l'import des packs dans le module Merlin Backoffice pour boutique PrestaShop


Première étape, lancez le module Merlin, connectez le à la boutique. Puis créez une nouvelle tâche d'importation. Pour rappel une tâche est un document contenant tous les réglages d'importation, pouvant être ré-utilisée à l'infini, planifiée... :

  1. Pour ouvrir la fenêtre d'importation cliquez sur ce bouton dans l'onglet "Import et scripts".
  2. Cliquez sur "nouvelle".
  3. Donnez un nom à votre tâche.
  4. Validez


Nouvelle tâche d'importation

Puis allez chercher votre fichier :

Choix du fichier d'import de packs

Indiquez à Merlin qu'il s'agit de produits ou de déclinaisons (ici des produits) :

Fichier d'import de produits

Mapping du fichier d'import de packs


On créé à présent un nouveau modèle de mapping pour ce document :

  1. cliquez sur l'onglet "Etape 2" et vérifier le choix de la langue par défaut (important pour la localisation des noms et autres champs texte et ne pas devoir les traduire par la suite).
  2. cliquez sur "Créer un nouveau modèle à partir du fichier". 
  3. Saisissez un nom pour ce modèle.
  4. Validez. Le script lit automatiquement les colonnes et recherche dans sa liste des rubriques qui correspondent.



Créer un nouveau modèle de mapping

  1. Grâce aux titres bien choisis, ces trois colonnes se sont mappées automatiquement. On remarque que pack_stock_type est déjà nativement gérée par l'outil d'import de Merlin et s'est aussi auto mappée (rubrique "gestion quantités du pack").
  2. Il ne reste plus qu'à les cocher pour demander à Merlin de les utiliser aussi bien pour créer des produits que pour les mettre à jour. A noter que pour les colonnes de texte comme la description, il est souvent utile de ne pas cocher la case d'utilisation lors des mises à jour, pour éviter d'écraser les modifications réalisées depuis l'import précédent.
  3. Sélectionnez la premiere colonne non mappée et cliquez sur la flèche de la liste déroulante pour ouvrir la fenêtre de mapping et choisir une rubrique.
  4. Pour notre colonne contenant l'identifiant des produits pack, comme cette colonne n'est pas proposée dans la liste, on choisi "Autre rubrique libre" (fonction présente à partir de la version 1.6).
  5. Cela ouvre une pop up permettant d'indiquer le nom de la table et du champ libre dans lesquels importer. Par défaut Merlin prend le nom de la colonne. C'est ici que l'on aurait pu gagner un peu de temps en nommant directement la colonne avec la syntaxe nomdelatable.nomdelarubrique. Saisissez pack.id_product_pack dans le champ.
  6. Validez



Mappage des colonnes 1/2

  1. Cocher les deux cases pour que Merlin utilise cette colonne aussi bien en mode création que mise à jour.
  2. Mappez de la même manière les deux autres colonnes de type "Autre rubrique libre" en saisissant bien le nom de la table et du champ (pack.id_product_item et product.cache_is_pack). A noter qu'il n'est pas nécessaire de fermer la fenêtre de mapping entre chaque colonne, il suffit de sélectionner une autre colonne.
  3. Parmis les options proposées, choisir pour les deux colonnes de la table pack, la première option "Valeurs uniques sans suppression" (ou "Valeurs uniques et suppression des lignes actuelles non vides" si vous devez importer plusieurs fois, de manière à éviter la création de doublons).


Mappage des colonnes 2/2

Options particulières pour les packs


La suite n'a rien de spécial, si vous avez déjà importé avec Merlin, procédez comme d'habitude, à une nuance près : il faut pour les nouveaux produits, forcer les identifiants.

En effet, la table attend dans la colonne id_product_pack, l'identifiant du produit. Or si celui-ci n'existe pas encore et qu'il est créé lors de la même opération, cet id n'est pas connu. C'est pourquoi dans le fichier j'ai volontairement donné le numéro 100 (qui ne correspond à ce stade à aucun produit existant) au produit à créer et ai recopié cette valeur dans la colonne id product pack. Il faut demander au moteur SQL d'utiliser cette valeur d'id 100, à la place de l'identifiant auto incrémenté. C'est justement ce que fait l'option "Forcer les ids" de Merln.

Pour résumer, les sous-étapes importantes :

  1. Cliquez sur l'onglet "Etape 3".
  2. Bien choisir les clés de synchro. Ici le choix "Identifiant produit" s'impose.
  3. Cliquez sur "Afficher le contenu"
  4. Cliquez sur "Toutes" pour que l'importation traite toutes les lignes. ATTENTION, comme d'habitude, ne le faire qu'à la fin, après avoir d'abord testé l'import sur deux lignes.
  5. Allez à la section "Etape 4".
  6. Cochez "Créer produits non existants", sauf si vous ne faites ques de la mise à jour.
  7. TRES IMPORTANT : cochez "Forcer les identifiants". Voir explication plus haut.
  8. Vérifiez les valeurs par défaut dans cette section, en particulier si comme dans notre exemple le fichier ne contient pas d'information sur la catégorie par défaut des produits, les nouveaux produits seront créés dans la catégorie choisie ici. Vous pouvez aussi choisir de cocher "activer" pour que les nouveaux packs soient directement disponibles à la vente.


Ne reste plus qu'à lancer l'écriture dans la base.
Attention : on ne le répétera jamais assez, avant de lancer un nouveau type d'import, toujours faire une sauvegarde de la base de données. Rien de plus simple ni rapide à faire depuis le BO de PrestaShop.

Réglages des options d'import d'un pack de produits

Lancer l'importation

  1. Si pas déjà fait, sélectionnez toutes les lignes (rappel : faites toujours d'abord un essai sur une ou deux lignes)
  2. Cliquez sur Etape 5.
  3. Cliquez sur "Importer les lignes sélectionnées"
  4. Validez



On vérifie dans la 1ere colonne qu'il n'y a pas d'échec :

Vérification du statut des lignes importées

Pour vérifier le résultat final, on peut soit aller regarder le contenu de la table pack :

Vérification du contenu de la table ps_pack dans la base de données

Soit tout simplement visualiser la page sur le site.
Retournez sur la fenêtre principale de Merlin et rafraichissez l'affichage des produits. Pour rappel, pour ouvrir la page d'un produit directement depuis Merlin, faires un clic droit pour ouvrir le menu contextuel et cliquer dans la ligne de ce dernier et cliquez sur "Voir page web".

Visualiser la page produit

Voici notre produit numéro 1 transformé en vente d'un lot de deux produits. Restera à modifier les stocks / quantités, les prix, descriptions, changer la photo etc, mais bien sûr on aurait pu tout faire en même temps en ajoutant dans le fichier les colonnes nécessaires :

Pack de produit en vente sur le site

Attention au piège avec PrestaShop 1.5 ou 1.6 : il faut que le paramètre PS_PACK_FEATURE_ACTIVE soit activé dans la configuration de la boutique. Cela peut se faire de plusieurs manières, soit en allant modifier la valeur de ce paramètres dans la table configuration dans la base, soit en créant un premier pack manuellement dans le back office de PS. Ce problème ne se pose pas avec PrestaShop 1.7 car l'un des produits de démo est un pack, donc le paramètre PS_PACK_FEATURE_ACTIVE a déjà été passé à 1.

Autres articles de la catégorie Importation dans la base de données PrestaShop

Réglages
  • Identification
    • £ GBP
    • $ USD
Menu