Voici donc le début de notre série sur les webservices prestashop ( Sommaire )

Pour cette série nous allons écrire les appels au webservice via des scripts php, basé sur la librairie fournie par Prestahop  : https://github.com/PrestaShop/PrestaShop-webservice-lib

Le projet global est disponible sur github : https://github.com/nenes25/prestashop_hhwebservices

Pour ce premier article je vais vous détailler le mode de fonctionnement de l’import

Structure globale et installation

La structure du projet sera la suivante :

Structure projet

Nos classes spécifiques de gestion seront dans le dossier “classes”, et les fichiers d’imports dans le dossier “files/imports”.
L’appel des fonctions se fera via le fichier imports.php

Le module utilise composer pour gérer les dépendances et l’autoload des classes, avant toute chose il est donc nécessaire d’installer le projet via la commande

composer install

Gestion des données de l’import

Pour faciliter la gestion des données de l’import, l’objectif est de récupérer l’ensemble des données à importer sous la forme d’un tableau associatif tel que l’exemple ci-dessous

[0] => Array
        (
            [email] => [email protected]
            [id_gender] => 1
            [firstname] => herve
            [lastname] => herve
            [birthday] => 2010-01-20
            [passwd] => test
            [toDelete] => 0
        )

 

Les clés du tableau correspondant aux noms des attributs Prestashop des entités.

Pour gérer cela j’ai donc créé une classe HhWsCsvData qui va se charger de parser les fichiers csv pour récupérer les données avec le format attendu.
Le postulat étant que la première ligne du fichier contient les titres des colonnes.

Le code de cette classe est le suivant :

<?php
 
/**
 * Classe de récupération des données Csv
 *
 * @author hhennes <[email protected]>
 */
class HhWsCsvData extends HhWsData {
 
    /**
     * Récupération des données du fichier csv
     * @param string $fileDir
     * @param string $fileName
     * @param boolean $useCache
     */
    public function getDatas($fileDir, $fileName, $useCache = true) {
 
        //Clé de cache
        $cache_key = str_replace('/', '_', $fileDir) . $fileName;
 
        //Si du cache existe on renvoie le résultat du cache
        if (array_key_exists($cache_key, $this->_datas) && $useCache) {
            return $this->_datas[$cache_key];
        }
 
        //Ouverture du fichier
        $csvFile = fopen($fileDir . $fileName . '.csv', 'r');
 
        $keys = array();
        $csvDatas = array();
 
        $i = 0;
        while ($row = fgetcsv($csvFile, 1000, ";", '"')) {
            //Gestion des entêtes
            if ($i == 0) {
                foreach ($row as $datas) {
                    $keys[] = $datas;
                }
            } else {
                $j = 0;
                $rowDatas = array();
                foreach ($row as $datas) {
                    $rowDatas[$keys[$j]] = $datas;
                    $j++;
                }
                $csvDatas[] = $rowDatas;
            }
            $i++;
        }
 
        //Mise en cache des données
        $this->_datas[$cache_key] = $csvDatas;
 
        //Renvoi des données
        return $this->_datas[$cache_key];
    }
 
}

Si vous avez des données d’entrée sous un autre format, vous pouvez créer votre propre adapteur qui héritera de la classe HhWsData.

Surcharge du Webservice Prestashop, mis en place de fonctions génériques.

Au cours de notre travail sur les différentes entités prestashop, certaines actions vont être redondantes, c’est pourquoi nous allons créer une classe avec des méthodes génériques.

Cette classe héritera de la classe de base du webservice prestashop, et c’est celle-ci que nous appellerons directement.
Voici son contenu :

 <?php
 
include_once dirname(__FILE__) . '/../vendor/prestashop/prestashop-webservice-lib/PSWebServiceLibrary.php';
 
/**
 * Gestion des webservices Prestashop
 *
 * @author hhennes <[email protected]>
 */
class HhPrestashopWebservice extends PrestaShopWebservice {
 
    /** Nom de la resource, à sucharger par les classe qui héritent */
    protected $_resource;
 
    /**
     * Récupération de l'identifiant d'un objet via ses paramètres
     * @return int $objectId || bool 
     */
    public function getObjectId($value, $field = 'id') {
 
        $options = array(
            'resource' => $this->_resource,
            'filter' => array($field => $value)
        );
 
        $xml = $this->get($options);
        $objectId = (string) $xml->children()->children()->attributes();
 
        if ($objectId != '')
            return $objectId;
        else
            return false;
    }
    
    /**
     * Récupération d'un objet vide
     * @return SimpleXml
     */
    public function getEmptyObject() {
        
        $options = array(
            'url' => $this->url.'/api/'.$this->_resource.'/?schema=synopsis'
            );
        
        $schema = $this->get($options);
        
        return $schema;
    }
 
    /**
     * Suppression d'un objet
     * @param type $resource
     * @param type $id
     */
    public function deleteObject($resource,$id) {
        $options = array(
            'resource' => $resource,
            'id' => $id,
        );
        $this->delete($options);
    }
 
}

Le fichier d’import

Pour finir nous allons écrire la base de notre fichier imports.php qui sera chargé de réaliser l’import.

 <?php 
//Inclusion de l'autoload composer
include_once 'vendor/autoload.php';
 
//Identifiants d'accès au webservice
$wsUrl = 'http://www.yourshop.com';
$wsAuthKey = 'yourKey';
 
//Initialisation du webservice avec notre classe spécifique
$ws = new HhPrestashopWebservice($wsUrl,$wsAuthKey, false);
 
//Instanciation de la classe de récupération des données csv
$csv = new HhWsCsvData();

Nous arrivons au bout de la préparation de l’utilisation des webservices.
Dans le prochain article nous verrons ensemble comment mettre cette méthodologie en œuvre avec la gestion des clients.