Après la mise en place de la structure globale pour utiliser les webservices, nous allons à présent importer les clients.

La structure du fichier sera la suivante.

structure-csv

L’email client étant la clé unique.

Pour gérer l’import nous allons créer une classe spécifique qui va hériter de la classe HhPrestashopWebservice
Celle-ci permettra les opérations basiques : Ajouter, modifier, supprimer un utilisateur prestashop via le webservice.

Voici son code commenté :

 /**
 * Gestion webservice des clients
 *
 * @author hhennes <[email protected]>
 */
class HhCustomerWs extends HhPrestashopWebservice {
 
    protected $_resource = 'customers';
 
    /**
     * Création d'un client via le webservice
     * @param array $datas : données du client
     */
    public function createCustomer($datas) {
 
        $schema = $this->getEmptyObject();
        $customerAttributes = $schema->children()->children();
 
        //Parcours des attributs du client, si une data existe on l'associe
        foreach ($customerAttributes as $attribute => $values) {
 
            if (array_key_exists($attribute, $datas))
                $schema->children()->children()->{$attribute} = $datas[$attribute];
 
            //Si le champ est nécessaire et qu'il n'est pas associé cela ne fonctionnera pas, on envoie une exception
            if ($schema->children()->children()->{$attribute}->attributes()->required && !array_key_exists($attribute, $datas)) {
                throw new PrestaShopWebserviceException('Erreur attribut obligatoire ' . $attribute . ' manquant !');
            }
        }
 
        //Si on veut ajouter des données commune ou statiques on peut les ajouter ici
        $customerAttributes->note = 'Client add with webservice';
        $customerAttributes->active = 1;
        $customerAttributes->id_default_group = 3;
 
        //Enregistrement du nouveau client
        $options = array(
            'resource' => $this->_resource,
            'postXml' => $schema->asXML(),
        );
 
        $xml = $this->add($options);
    }
 
    /**
     * Mise à jour d'un client existant via le webservice
     * @param int $id identifiant du client
     * @param array $datas données du client
     */
    public function updateCustomer($id, $datas) {
 
        $options = array(
            'resource' => $this->_resource,
            'id' => $id
        );
 
        $responseXml = $this->get($options);
        $customerXml = $responseXml->children()->children();
 
        $hasDataChange = false;
        foreach ($datas as $key => $value) {
            if ($customerXml->{$key} && $customerXml->{$key} != $value) {
                $hasDataChange = true;
                $customerXml->{$key} = $value;
            }
        }
 
        //On sauvegarde uniquement si il y'a eut des changements
        if ( $hasDataChange ){
            $options = array(
                'resource' => $this->_resource,
                'id' => $id,
                'putXml' => $responseXml->asXML(),
            );
            $this->edit($options);
        }
    }
 
 
    /**
     * Suppression d'un client
     * @param string $email email du client a supprimer
     * @throws PrestaShopWebserviceException
     */
    public function deleteCustomer($email){
 
        if ( $idCustomer = $this->getObjectId($email,'email')) {
            $this->deleteObject($this->_resource,$idCustomer);
        }
        else {
            throw new PrestaShopWebserviceException('Impossible de supprimer le client '.$email.' n\'existe pas');
        }
    }
}

A partir de cette classe, et de la structure précédentes vous pouvez à présent gérer vos clients en quelques minutes via le webservice.

Voici un exemple de script :

 <?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 la classe de gestion des clients
$ws = new HhCustomerWs($wsUrl,$wsAuthKey, false);
 
//Instanciation de la classe de récupération des données csv
$csv = new HhWsCsvData();
 
//Récupération et traitement des données
$customerDatas = $csv->getDatas(dirname(__FILE__) . '/files/imports/', 'customers');
 
//Traitement des clients
foreach ($customerDatas as $customerData) {
    
    //Suppression des clients
    if ($customerData['toDelete'] == 1) {
        try {
            echo 'Suppression du client '.$customerData['email'].'<br />';
            $ws->deleteCustomer($customerData['email']);
        } catch (PrestaShopWebserviceException $e) {
            echo $e->getMessage();
        }
    //Gestion des ajouts et modifications
    } else {
        //On vérifie si le client existe via son email
        if ($customerId = $ws->getObjectId($customerData['email'], 'email')) {
            echo 'Maj du client ' . $customerData['email'] . ' - id prestashop ' . $customerId . '<br />';
            try {
                $ws->updateCustomer($customerId, $customerData);
            } catch (PrestaShopWebserviceException $e) {
                echo $e->getMessage();
            }
        } else {
            echo 'Creation du client' . $customerData['email'] . '<br />';
            try {
                $ws->createCustomer($customerData);
            } catch (PrestaShopWebserviceException $e) {
                echo $e->getMessage();
            }
        }
    }
}

Notre première étape d’import des clients est à présent fonctionnelle 🙂
Nous verrons lors de la prochaine étape comment importer les données des adresses des clients.