Prestashop – Mise à jour automatique des stocks
Pour la réalisation d’un projet de boutique en ligne je me suis intéressé à Prestashop. Il existe d’autres moteurs de boutique web mais aujourd’hui je vais seulement parler de celui ci.
Ma problématique était de mettre à jour automatiquement les stocks en lignes par rapport aux stocks réels de la boutique physique. La chance que j’ai c’est que l’outil informatique de la boutique physique permet d’exporter un fichier csv des produits et que Prestashop sait traiter ce type de fichier. Seulement tout ça se fait sur la partie administration et manuellement. J’ai donc chercher à automatiser cette partie.
Il existe surement de multiple solutions je vous propose la solution que j’ai trouvé et qui utilise la commande WGET. Ainsi il sera possible de faire un simple script Shell qui sera exécuté par CRON. Voici les détails de ce script :
Configuration du script
Pour faciliter la configuration du script j’ai renseigné des variables au début. Veillez à bien renseigner chacune des variables avec les paramètres de votre site. Le script entier est en téléchargement à la fin de l’article. Il est composé de nombreux commentaires pour vous aider.
Détails des paramètres : Ici je m’identifie avec l’email “cron@prestashop” et le mot de passe “motdepass” qui doit correspondre à un employé enregistré dans prestashop. ”urladminsite” dois contenir l’adresse de la partie administration de presatshop. Je lui dis que je veux aller dans la partir “Import” en renseignant la variable “tab“. Puis que je souhaite importer le fichier “monfichier.csv” (fichier qui dois se trouver dans le répertoire “import” de “adminxxx” de votre prestashop). Pour finir je décris chaque colonne de mon fichier csv à l’aide de type_value[num_colonne]=type_de_colonne.
email=cron@prestashop.com passwd=motdepass tab=Import admintab='Admin'$tab urladminsite=http://www.prestashop.eu/adminxxx/ csvfile='monfichier.csv' typevalue='&type_value[0]=id&type_value[1]=name&type_value[2]=no&type_value[3]=quantity'
Identification automatique
Une fois tous ces paramètres renseignés, il faut s’en servir. Pour cela il faut s’identifier au près de notre administartion prestashop, enregistrer le cookie d’identification et récupérer un “token” donnant droit à accéder à la partie que l’on souhaite (ici la partie Import).
Première étape Identification et enregistrement du cookie :
Ici nous envoyons l’email et le mot de passe au script “login.php” de notre boutique. Nous demandons aussi d’enregistrer le cookie dans “cookie.txt“. Vous remarquez que j’enregistre aussi le résultat dans un fichier nommé “login.php“, je m’en sert dans mon script pour détecter les erreurs.
wget --save-cookies=cookie.txt --post-data='email='$email'&passwd='$passwd'&Submit=submit' --keep-session-cookies -q -O login.php $urladminsite'login.php'
Deuxième étape récupération du TOKEN :
Qu’est ce que le “token” ?
Le “token” est en fait un “code” généré par prestashop qui réuni des informations relatives à l’employé et à l’onglet qu’il veut visiter. Il est la pour sécuriser l’accès à votre boutique et vous éviter de faire des choses qui vous serez commandé par quelqu’un d’autre au travers d’un lien. Sans “token“, quelqu’un de mal intentionné pourrait vous envoyer un lien contenant des paramètres pouvant altérer votre base de données. Étant identifié comme administrateur sur votre ordinateur ce code n’aurait aucun mal à être exécuté. Le “token” étant connu que de vous seul et de votre prestashop toutes commandes exempts de ce token sera refusées.
Revenons à notre code. Ici aussi j’utilise la commande WGET, elle est très présente dans ce script. On va charger le cookie enregistré précédemment et attaquer la page d’index (index.php) de notre administration. Très important cette fois ci j’enregistre le résultat dans un fichier “index.php” pour récupérer le token qui nous intéresse.
Dans la deuxième ligne je récupère le token avec les commandes standards GREP et SED. Je ne rentre pas dans les détails mais je vais chercher le token se rapportant à l’onglet que je souhaite (Import).
wget --load-cookies=cookie.txt --keep-session-cookies -q -O index.php $urladminsite'index.php' token=$(grep 'index.php?tab='$admintab'\&token=' index.php | sed 's/.*token=\(.*\)\">'$tab'.*/\1/g')
Voici pour ce qui est de l’identification. Passons maintenant à l’exécution de notre mise à jour csv.
Mise à jour des stocks
On ne change pas une équipe qui gagne. Ici encore j’utilise la commande WGET. Comme pour la commande précédente j’attaque la page “index.php” et je lui envoie le cookie. Petite différence ici, j’ajoute des paramètres qui vont être envoyés par la méthode POST à mon script. Il aura alors l’impression que je lui envoi des données renseignées par un formulaire, ici notre formulaire d’importation. Pour cela j’utilise la commande “post-data” de “wget“.
Les premiers paramètres sont l’onglet et le token précédemment récupéré. Ensuite viennent les paramètres utiles à l’importation. A vous de changer ces paramètres à votre guise suivant le format de votre fichier csv. Les paramètres de type de colonne sont récupéré de la variable “typevalue” renseigné dans la partie configuration en début de script.
wget --load-cookies=cookie.txt --keep-session-cookies --post-data='tab='$admintab'&token='$token'&skip=0&csv='$csvfile'&entity=1&iso_lang=fr&separator=;&multiple_value_separator=,'$typevalue'&import=Import CSV data' -q -O maj.php $urladminsite'index.php'
Voilà j’espère que tout ceci aidera le plus grand nombre. Je vous met le code complet de mon script et un lien pour le télécharger si vous le souhaitez. Vous restera plus qu’a executer ce script au travers de CRON pour avoir une mise à jour régulière.
Le script :
#!/bin/sh ##################################################################### # # # SRIPT DE YANNICK KERMAREC # # HTTP://WWW.KERMAREC.COM # # # ##################################################################### ####################### PARAMÈTRES PRESTASHOP ####################### email=cron@prestashop.com passwd=motdepass tab=Import # Onglet auquel vous voulez accéder admintab='Admin'$tab # Les script de prestashop vont chercher les onglets avec Admin devant urladminsite=http://www.prestashop.com/adminxxx/ # L'url de la partie administration de prestashop csvfile='monfichiert.csv' # Le nom de votre fichier csv se trouvant dans le répertoire 'import' de la partie adminxxx # Les type de valeur pour chaque colonne de votre CSV : # /!\ ATTENTION /!\ N'oubliez pas de bien renseigner cette partie car c'est ce qui va être utilisé pour mettre à jour la BD typevalue='&type_value[0]=id&type_value[1]=name&type_value[2]=no&type_value[3]=quantity' ####################### IDENTIFICATION ####################### # Identification et récupération du cookie wget --save-cookies=cookie.txt --post-data='email='$email'&passwd='$passwd'&Submit=submit' --keep-session-cookies -q -O login.php $urladminsite'login.php' if [ -n "$(grep 'error' login.php)" ] then error=$(grep '<li>.*</li>' login.php | sed 's/.*<li>\(.*\)<\/li>/\1/g') echo 'ERREUR : '$error else # Si pas d'erreur premier accès à la partie administration wget --load-cookies=cookie.txt --keep-session-cookies -q -O index.php $urladminsite'index.php' # Accès à la partie administration token=$(grep 'index.php?tab='$admintab'\&token=' index.php | sed 's/.*token=\(.*\)\">'$tab'.*/\1/g') # Extraction du token de la page index.php pour l'onglet qui nous intéresse fi ####################### IMPORTATION CSV ####################### if [ -n "$(echo $token | grep ^[a-z0-9]*)" ] then echo 'TOKEN : '$token # Affichage du token récupéré wget --load-cookies=cookie.txt --keep-session-cookies --post-data='tab='$admintab'&token='$token'&skip=0&csv='$csvfile'&entity=1&iso_lang=fr&separator=;&multiple_value_separator=,'$typevalue'&import=Import CSV data' -q -O maj.php $urladminsite'index.php' else echo 'ERREUR : Pas de token' fi
Le script : Mise à jour automatique des stocks de prestashop.
Ces articles peuvent vous intéresser :
- Prestashop – Mise à jour des commandes Mondial Relay Chargé de maintenir la boutique d’une Parapharmacie j’ai été amené...
- Prestashop – Mondial Relay (module) Je vous propose le module mondial relay 1.4 modifié pour...
- Galeries et slideshows de photos pour Mootools (14) Partager des photos sur Internet c’est bien mais pour que...
- Prestashop – Google Cloud Print Voici mon premier module gratuit pour prestashop qui vous permet...
- Mootools 1.2.1 est sorti Petite news rapide pour prévenir de la sortie de la...
Related posts brought to you by Yet Another Related Posts Plugin.
Tags: cron, developpement, développeur web, frameworks, grep, navigateur, php, prestashop, sed, web, web 2.0, wget



Pratique scolaire
Bonne connaissance
Excellente pratique
February 16th, 2011 at 9:55 am
Bonjour,
j’ai été obligé de faire une petite modif pour que ça fonctionne :
#token=$(grep ‘index.php?tab=’$admintab’\&token=’ index.php | sed ‘s/.*token=\(.*\)\”>’$tab’.*/\1/g’)
token=$(grep ‘index.php?tab=’$admintab’\&token=’ index.php | sed ‘s/.*token=\(.*\)\”>.*/\1/g’)
Mais ça m’a bien aidé quand même, un grand merci pour ce script.
February 16th, 2011 at 10:29 am
Il faut aussi mettre l’onglet importation directement sur l’accueil
February 17th, 2011 at 12:42 pm
Je n’avais pas eu a mettre l’onglet directement sur l’accueil mais je suis sous Prestashop 1.4. Tu peux aussi ajouter un autre wget qui va aller sur la page “Outils” si tu veux garder ton interface admin propre.
Personnellement j’ai même ajouté un onglet “Import plus” dans cette page pour avoir un import plus complet avec des options personnelles.
February 23rd, 2011 at 10:32 am
A lire rapidement, je recherche un peu à faire cela, mais j’ai une boutique de vêtements et la quantité est la somme des stocks des attributs/déclinaisons d’un articles (1 chemise XL colori bleu par exemple). Votre système fonctionne-t-il pour cela ?
February 25th, 2011 at 3:55 am
Essayez de faire une mise à jour avec un fichier csv dans la partie importation de Prestashop. Si les stocks sont correctement mis à jour, ça devrait fonctionner.
June 29th, 2011 at 15:19 pm
Pour ceux qui veulent je pense proposer un service de mise à jour automatique.
- Mise à jour des produits
- Mise à jour des déclinaisons
- Mise à jour des catégories
Contactez moi si vous êtes intéressé.
October 27th, 2011 at 15:08 pm
Voila qui m’intéresse beaucoup ! Je cherche actuellement une solution pour synchroniser un logiciel CRM qui exporte une base produit, avec un prestashop. Cela concernerait des champs comme le produit, ses déclinaisons, son prix, etc… Pouvez vous me contacter ?
November 15th, 2011 at 13:52 pm
Bonjour, le script ne fonctionne pour moi sur mon prestashop v1.4.
Je le met sur le server et lorsque je tappe via ma console ssh : ./importCSV.sh
j’ai cette erreur :
importCSV.sh: line 43: Erreur de syntaxe près du symbole inattendu « fi »
importCSV.sh: line 43: `fi’
Quelqu’un saurait-il d’où ca vient?
January 11th, 2012 at 11:50 am
Bonjour Yannnick et merci pour ce truc génial.
je suis novice sur prestashop et en php aussi et je vais faire la mise à jour du mon stock (des produits +déclinaisons) prestashop a partir de mon stock magasin.
j’ai téléchargé ton script mais je ne sais pas comment l’utiliser sur ma boutique en local? merci de me dire ou il faut mettre se script et comment je fais appel .
merci d’avance
January 11th, 2012 at 12:08 pm
j’ai oublié de préciser que je travaille avec la version 1.2.5 du prestashop
January 11th, 2012 at 20:06 pm
Bonjour,
Merci pour le script.
Petite question , serait-il possible de faire une boucle pour importer tous les fichier *.csv d’un répertoire ?
Pour faire simple , à chaque modification du stock magasin , celui-cui génére un fichier csv.
Le Script d’import pour prestashop et dans un crontab toutes les heures et import tous les fichiers *.csv ?
Cordialement ,
January 17th, 2012 at 12:41 pm
@Overdoz : c’est un script shell il faut l’exécuter en ligne de commande ou dans un CRON.
@Damien : Suffit d’ajouter une boucle en shell pour le faire.
January 17th, 2012 at 18:37 pm
Bonjour,
Pour ma part je viens de mettre ca en place, et le rapport CRON que je recois m’affiche la totalité du fichier tel qu’il est écrit, alors que j’ai bien renseigné les variables de début et qu’un fichier “monfichier.csv” est présent dans import.
Des idées ?
January 17th, 2012 at 22:17 pm
Tu as mis les droits d’exécution sur le script ? chmod -x script
January 18th, 2012 at 10:12 am
je les ai passé en 755 avec filezilla oui
January 25th, 2012 at 2:44 am
Bonjour,
Super tuto ! et tout fonctionne nickel !
Ma question est simple: ou trouver le nom des variables à indiquer dans la ligne typevalue
J’ai besoin de modifier les champs remise de l’onglet prix de la fiche produit avec les dates, montant etc …
Merci pour votre réponse.
Cordialement
January 29th, 2012 at 15:24 pm
@Romuald : Ce sont les champs proposé dans la partie “outils > import” de l’administration de Prestashop. Si tu essayes d’importer un fichier de produits, tu as une liste de champs qui apparaît sur la droite de l’écran.
March 13th, 2012 at 12:39 pm
Merci beaucoup Yannick !
Je cherchais désespérement à faire exactement ce que ton script permet de faire.
J’ai eu quelques difficultés à mettre le script en place, j’ai compris par la suite que mon PHP appelait le sh qui était dans le dossier admin de mon prestashop, du coup la création des “index.php, login.php…” ne fonctionnait pas. J’ai juste déplacé le sh dans un sous-dossier /cron de mon dossier admin et ça fonctionnait nickel chrome.
En tous cas c’est de l’excellent boulot et ça m’a fait gagner pas mal de temps de dev sur un projet
.
Chapeau m’sieur !
March 13th, 2012 at 15:00 pm
Content d’avoir pu t’aider.
Fais attention aux effets de bord de ce genre de mise à jour.
March 13th, 2012 at 16:38 pm
Oui pas de souci, j’ai testé le tout dans tous les sens, ça fonctionne sans problème ! Merci encore.
March 21st, 2012 at 16:59 pm
Bonjour,
Ce script me parait génial, j’ai simplement un message d’erreur a la fin du script « Pas de token ». Pouvez-vous m’éclairer ?
Merci beaucoup.
March 22nd, 2012 at 14:18 pm
Je réponds ici aussi pour d’autres personnes qui auraient le problème :
Le Token :
Il n’a pas du réussir à récupérer le token après l’identification.
Chaque page de l’admin a un token qui est généré par rapport à la personne connectée. Pour être sur que ce lien n’est pas un lien envoyé par quelqu’un d’extérieur. C’est une sécurité dans l’admin de Prestashop.
A vérifier :
- cURL est installé sur la machine
- Le couple login, mot de passe est bon
- La configuration du script est correcte
A savoir :
Ce script se connecte à l’administration via cURL, il peut donc être installé n’importe ou et sur n’importe quel serveur ayant un accès web.
April 28th, 2012 at 9:27 am
Bonjour Yannick,
Merci pour ce script,
dans ton dernier post tu parles de curl, mais dans ton script, il n’y a pas de trace de curl, mais wget.
Tu parles également de la colonne “no” ( type_value[2]=no ), a quel colonne du fichier csv correspond t’elle ?
Je te pose ces questions car j’ai aussi un ERREUR : Pas de token
que je n’arrive pas à résoudre.
peut etre que mon problème de token vient du fait que mon fichier csv contient 3 colonnes :
id;Name*;quantity
1;toto;5
au lieu des 4, avec le champ no.
Je ne sais pas si c’est tres clair mon histoire!!!
April 28th, 2012 at 15:07 pm
Oui j’ai confondu wget et curl car j’ai refait une version plus complète en php avec curl.
Le token est une clé générée par sécurité donc rien à voir avec les champs du fichier csv.
April 28th, 2012 at 19:16 pm
une version plus complète en php ???
c’est disponible quelque part ?
Car je dois t’avouer que tu es le seul à avoir développé ce genre d’outil que je cherche depuis un certain temps .
Merci à toi
Cordialement
April 28th, 2012 at 19:50 pm
C’est une version que j’ai commercialisée c’est pour ça que je ne l’ai pas mise en ligne. Elle n’est compatible qu’avec les version 1.4 et supérieur de Prestashop.
April 28th, 2012 at 19:52 pm
elle coûte combien?
May 1st, 2012 at 10:39 am
Je m’en sert surtout pour faire des exports personnalisés pour des boites qui me le demandent. Du coup je ne le vend pas tel quel car en plus on ajoute un traitement des données pour se caler au format existant. Exemple : Logiciel de caisse, logiciel de gestion des stocks etc …
May 28th, 2012 at 22:55 pm
Les identifiants pour l’import Prestashop c’est le nom des Produits et non l’identifiant. Possible que ça ré-importe si le nom n’est pas le même.