Si vous recherchez comment créer une API pour Prestashop, vous allez rencontrer pas mal de résultats qui vous montreront comment activer l’accès aux APIs déjà définies par Prestashop.

La document de Prestashop est exclusif sur la manière d’utiliser les APIs  mais pas sur la création d’un webservice non lié à une entité.

Nous allons donc nous concentrer sur la création d’une nouvelle API.

De plus en plus les sites Internet se professionnalisent. Surtout pour les sites de vente en ligne.

Désormais, le site Internet n’est qu’une brique dans le système d’information d’une société. Il est très souvent connecté à un CRM, un ERP, un outil de comptabilité, un outil de statistiques, …. ou tout cela à la fois 😉

Afin que tous ces outils communiquent entre eux sans savoir comment les autres fonctionnent, ils communiquent entre eux, via des API.

Ce sont des librairies qui permettent aux programmes d’interagir les uns avec les autres.

 

Passons à la pratique.

Tout d’abord, il faut indiquer à Prestashop que nous allons créer un nouveau Webservice qui sera disponible via un appel API standard.

!! Attention de toujours faire une sauvegarde de vos fichiers avant de les modifier. !!

Si vous ne comprenez pas ce que vous faites, ne pas modifier votre fichier et demander à votre agence ou une agence de développement spécialisée dans Prestashop d’apporter ces modifications sur votre site Internet.

 

Dans des versions anciennes de Prestashop 1.6, vous devez créer un fichier override :
override/classes/webservice/WebserviceRequest.php

<?php
/*
* 2007-2017 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author Prestashop SA <contact@prestashop.com>
*  @copyright  2007-2017 Prestashop SA
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

class WebserviceRequest extends WebserviceRequestCore
{
    public static function getResources()
    {
	$resources = parent::getResources();
		
	$resources['webservicename'] = array('description' => 'Description of webservice', 'specific_management' => true, 'forbidden_method' => array('PUT', 'POST', 'DELETE'));
	ksort($resources);
        return $resources;
    }

}

Ce fichier permet d’indiquer à Prestashop que nous allons créer un nouveau webservice dont le nom sera « webservicename ».

La description, purement informative, permet d’indiquer plus précisément l’utilité de cette API.

La valeur « specific_management » indique que cela sera une API spécifique et nous interdisons son accès aux méthodes: PUT, POST et DELETE. De ce fait nous autorisons ce webservice uniquement en accès GET par Prestashop.

Le « ksort » permet juste de trier les API sur la page de configuration des webservices dans l’administration de Prestashop.

 

Pour les versions 1.7, la méthode « getResources » du fichier override/classes/webservice/WebserviceRequest.php intègre une appel au hook addWebserviceResources.

 

N’oubliez pas d’ajouter l’accès à ce webservice, dans la rubrique d’administration dédiée de Prestashop.

 

Attachons nous désormais, à la création du contenu de ce qui va être renvoyé par l’API.

override/classes/webservice/WebserviceSpecificManagementWebservicename.php

<?php
/*
* 2007-2017 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author Prestashop SA <contact@prestashop.com>
*  @copyright  2007-2017 Prestashop SA
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

class WebserviceSpecificManagementPliciOrdersJb implements WebserviceSpecificManagementInterface {

    /** @var WebserviceOutputBuilder */
    protected $objOutput;
    protected $output;
	
    /** @var WebserviceRequest */
    protected $wsObject;


  /* ------------------------------------------------
     * GETTERS & SETTERS
     * ------------------------------------------------ */

    /**
     * @param WebserviceOutputBuilderCore $obj
     * @return WebserviceSpecificManagementInterface
     */
    public function setObjectOutput(WebserviceOutputBuilderCore $obj)
    {
        $this->objOutput = $obj;
        return $this;
    }

    public function getObjectOutput()
    {
        return $this->objOutput;
    }

    public function setWsObject(WebserviceRequestCore $obj)
    {
        $this->wsObject = $obj;
        return $this;
    }

    public function getWsObject()
    {
        return $this->wsObject;
    }

    public function manage() {
        return $this->wsObject->getOutputEnabled();
    }


   /**
     * This must be return an array with specific values as WebserviceRequest expects.
     *
     * @return array
     */
    public function getContent() {
	if (!array_key_exists('from', $this->wsObject->urlFragments)) {
		throw new WebserviceException(vsprintf('Parameters "%s" is missing', array('from')), array('100', 500));
	}

	$paramFromData = $this->wsObject->urlFragments['from'];
		
	return json_encode(['results' => array()]);
    }


}

La méthode la plus importante étant getContent. C’est elle qui va produire le contenu a afficher.

Dans les premières lignes, nous testons si l’appel de l’API contient un paramètre.

Ensuite nous forçons le résultat de type json qui va contenir un tableau results contenant un tableau vide. Vous pouvez modifier le mot « results » et le tableau vide peut être remplacé par des objets ou des éléments simples.

Ce n’est pas très joli car vous forcez le type.

En espérant que cela vous permette de développer vos propres webservices.

Bon code.