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.

Un commentaire

  1. Bonjour,

    Il faut a mon avis etre prudent sur ce tuto car il est destiné a la version 1.4 de PrestaShop. La version 1.5 fonctionne différemment et certaines variables ont été renommées.

    Quoi qu’il ne soit, cela depasse de loin mes compétences. Si quelqu’un developpe quelque chose, pour la 1.5, je suis preneur…

  2. Bonjour,

    Pour la version sur 1.5, je pense qu’il faut modifier plusieurs choses notamment le csvfile car sous PS 1.5, il gère le csvfile codé en base64, il faut donc rajouter la ligne suivante.
    csvfileEncode = echo $csvfile | base64 afin de coder le nom du fichier puis se servir de cette variable dans le script

    Par contre avec le script pour la version 1.4, il faut changer quelques lignes pour récupére le token et là j’avoue que je sèche un peu. Quand je fais un echo $token, il m’affiche une ligne vide et donc il ne peut pas passer le test, j’ignore comment récupérer le token car la ligne de code me semble correct, si quelqu’un à une idée ou la réponse, peux-t-il me répondre afin que je puisse mettre en place mon script pour mon PS 1.5

  3. Merci pour le script, sinon pourquoi ne pas passer simplement par du webservice et un CRON ? le webservice est facilement consommable, il faut juste savoir gérer les déclinaisons.

  4. En effet mais à l’époque j’avais un csv a envoyer automatiquement d’une autre machine et je manquais d’expérience. Il y a de bien meilleures solutions que celle-ci pour faire la même chose et surtout avec du Prestashop 1.6. Pour un nouveau projet j’utilise le Webservice de Prestashop 1.6 sur lequel les clients viendront connecter leurs logiciels pour envoyer leurs produits.

Leave a Comment.