Créer son propre webservice sur Prestashop

webservice-soap-html-xml-diagram1

Prestashop propose depuis la version 1.4 un système de webservice qui permet de récupérer et modifier les données de votre boutique grâce à une api configurable dans le BO. Les éléments accessibles sont déjà nombreux et rempliront la plupart du temps les besoins nécessaires (commandes, clients, etc…) Mais qu’en est-il s’il manque juste le champ dont vous avez besoin ? Ce tutoriel va vous expliquer comment ajouter vos propres tables dans les webservices Prestashop.

Un système simple et efficace, mais…

Le service web de Prestashop est bien conçu de base, et répondra à la plupart des besoins pour établir un pont entre la base de données de votre boutique avec un système extérieur. Mais s’il manque une table qui vous intéresse ? Ou même juste un champ bien précis ? Vous êtes coincés, enfin pas complètement !
En modifiant un peu le code de Prestashop vous pourrez accéder à ce que bon vous semble, et c’est ce que je vais vous expliquer dans cet article.

Ajouter une ressource

Dans ce tuto, nous allons ajouter un service web afin d’accéder aux messages que peuvent ajouter les clients lors de leur commande dans le tunnel d’achat.

Etape 1 : modifier la classe

Dans un premier temps se rendre dans le fichier PHP de la classe correspondante dans l’arborescence de Prestashop, dans notre exemple il s’agit de la classe Message.php. Attention ! Afin de coder proprement, ne modifiez pas directement la classe, mais créez une nouvelle classe dans le ficher override ! Voir cette doc‘ si vous ne voyez pas de quoi je parle.

Repérez l’attribut $fieldsValidate puis ajoutez-en un nouveau juste en dessous :

protected $webserviceParameters = array(
'objectNodeName' => 'message',
'objectsNodeName' => 'messages',
'fields' => array(
'id_cart' => array('xlink_resource'=> 'carts'),
'id_order' => array('xlink_resource'=> 'orders'),
'id_customer' => array('xlink_resource'=> 'customers'),
'message' => array('required' => true),
),
);

Ceci permettra de générer les données au format XML que nous souhaitons récupérer, dans l’ordre :

  • créez un nœud « message » qui contiendra :
  • un nœud « id_cart » avec un lien en paramètre vers l’url concernant ce panier dans le webservice
  • idem avec la commande associée
  • idem avec le client associé
  • et enfin un nœud « message » contenant le message en lui-même, ce champ est requis pour que le message soit accessible

N’hésitez pas à vous inspirer des autres classes !

Etape 2 : mapper le service web avec la classe

Vous devez maintenant modifier une autre classe (toujours avec override 😉 ) : WebserviceRequest.php

Dans cette classe vous devez trouver la fonction getResources() qui gère le mapping entre les classes et le service web. Dans notre cas nous ajoutons juste en-dessous de la ressource manufacturers cette ligne :

'messages' => array('description' => 'The Order messages','class' => 'Message'),

Voilà, c’est tout 🙂

Etape 3 : activer la ressource dans le back office

Retournez dans la partie service web du BO comme expliqué ci-dessus. Vous pourrez voir une nouvelle ligne juste en-dessous de manufacturers, « messages ». Activez GET et HEAD puis enregistrez. Vous pouvez maintenant vérifier si tout fonctionne en allant sur cette url : http://www.votre-boutique.com/api/messages

Vous avez réussi à ajouter la table message dans le service web de votre boutique. Vous auriez aussi pu ajouter un webservice pour une table créée de toute pièce pour les spécificités de votre boutique et ceci uniquement si vous avez ajouté une classe correspondante, mais la méthode reste la même.

Comment afficher ces messages directement dans le détail des commandes ?

Nous pouvons aller encore plus loin dans notre démarche ! En effet avec nos modifications nous récupérons les messages dans une liste, mais cela n’est pas très utile en soi. Il serait plus intéressant de récupérer ces messages lorsque nous consultons le détail d’une commande dans notre api !
Pour mieux me faire comprendre, je vous invite à consulter une commande de votre boutique : http://www.votre-boutique.com/api/orders/id_commande

Vous verrez un nœud « associations » et un nœud enfant « order_rows » qui contient tous les produits de la commande. Voilà notre objectif, ajouter dans le nœud associations un nœud enfant « messages » qui va lister les messages de cette commande.

Etape 1 : modifier la classe Order.php

Toujours en utilisant la surcharge des classes (ou override) nous allons modifier la classe Order.php.
Repérez l’attribut $webserviceParameters qui est déjà existant dans cette classe. Vous constaterez qu’il y a un array « associations » :

'associations' => array(
'order_rows' => array('resource' => 'order_row', 'setter' => false, 'virtual_entity' => true,
'fields' => array(
'id' => array(),
'product_id' => array('required' => true),
'product_attribute_id' => array('required' => true),
'product_quantity' => array('required' => true),
'product_name' => array('setter' => false),
'product_price' => array('setter' => false),
)),
),

Nous allons nous inspirer de l’existant et ajouter un array pour les messages comme ceci :

'associations' => array(
'order_rows' => array('resource' => 'order_row', 'setter' => false, 'virtual_entity' => true,
'fields' => array(
'id' => array(),
'product_id' => array('required' => true),
'product_attribute_id' => array('required' => true),
'product_quantity' => array('required' => true),
'product_name' => array('setter' => false),
'product_price' => array('setter' => false),
)),
'order_messages' => array('resource' => 'order_message', 'setter' => false, 'virtual_entity' => true,
'fields' => array(
'id_message' => array('required' => true),
'id_cart' => array('xlink_resource'=> 'carts'),
'id_customer' => array('xlink_resource'=> 'customers'),
'message' => array('required' => true),
'date_add' => array(),
)),
),

Ce n’est pas encore fini, car la classe dispose d’une fonction dédiée pour récupérer les données à afficher.

Etape 2 : ajouter une fonction dans la classe Order.php

Ajoutez cette fonction dans la classe:

public function getWsOrderMessages()
{
$query = 'SELECT `id_message`, `id_cart`, `id_customer`, `message`, `date_add`
FROM `'._DB_PREFIX_.'message`
WHERE id_order = '.(int)$this->id.'
ORDER BY `date_add`';
$result = Db::getInstance()->executeS($query);
return $result;
}

Il faut bien respecter la syntaxe ! Nous avons ajouté un tableau « order_messages » dans l’attribut $webserviceParameters. Le nom de la fonction doit correspondre à ce tableau : getWsOrderMessages. Sinon Prestashop ne saura pas quelle fonction utiliser pour récupérer les données. Une fois de plus regardez l’existant pour comprendre la logique du code.

Et voilà !

Vous avez pu constater qu’il est assez aisé et rapide d’ajouter ses propres ressources. Si vous avez des critiques ou si vous avez une autre méthode pour modifier le service web de Prestashop, n’hésitez pas à m’en faire part, je suis toujours à l’écoute !

Vous avez aimé ?

Vous pouvez laisser un commentaire

Laissez un commentaire