Nous allons voir comment ajouter un nouvel objet personnalisé dans l’api Prestashop via un module.
Cette méthodologie fonctionne sous Prestashop 1.7

L’objectif est d’ajouter de rendre un nouvel objet « Sample » qui pourra être manipulé via l’api.
Pour cela nous allons créer un module hhapisample

Ce module va ajouter une entité « sample » qui sera gérable via l’API.

Cette entité aura uniquement les paramètres suivants :

  • référence
  • nom ( multilingue )
  • description ( multilingue )

Voici le code de cette entité à placer dans le fichier classes/Sample.php du module.

/**
 * Classe d'exemple pour le webservice
 */
class Sample extends ObjectModel {
 
    /** @var string Référence du document */
    public $reference;
 
    /** @var string nom */
    public $name;
 
    /** @var string description */
    public $description;
 
    /**
     * Définition des paramètres de la classe
     */
    public static $definition = array(
        'table' => 'sample',
        'primary' => 'id_sample',
        'multilang' => true,
        'multilang_shop' => false,
        'fields' => array(
            'reference' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml', 'size' => 255),
            'name' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml', 'size' => 255 , 'lang' => true),
            'description' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml' , 'lang' => true),
        ),
    );
 
    /**
     * Mapping de la classe avec le webservice
     * 
     * @var type 
     */
    protected $webserviceParameters = [
        'objectsNodeName' => 'samples', //objectsNodeName doit être la valeur déclarée dans le hookAddWebserviceResources ( liste des entités )
        'objectNodeName' => 'sample', // Détail d'une entité
        'fields' => []
    ];
}

La définition du webservice est géré dans l’objet est configuré dans la variable $webserviceParameters
Pour rendre disponible cette entité, il faut greffer votre module sur le hook addWebserviceResources

/**
     * Ajout de la nouvelle entité au webservice
     * @param $params
     * @return array
     */
    public function hookAddWebserviceResources($params) {
        return [
            'samples' => [ //Nom du paramètre $webserviceParameters['objectsNodeName'] de la classe Objet
                'description' => 'Sample new entity for API',
                'class' => 'Sample'
            ],
        ];
    }

Une fois le module installé, vous pouvez-voir dans la liste des objets de l’api que l’entité sample est bien visible.

En vous rendant dans « Paramètres avancés / Webservice »
Il faut autoriser les utilisateurs api souhaités à accéder à l’entité pour pouvoir la modifier.
Api prestashop

Lors de l’appel à la page de l’api avec un utilisateur qui a les droits nécessaire nous pourrons voir les informations suivantes :

Api Prestashop sample

Notre nouvel objet est donc bien disponible via l’api et il est possible de le géré comme tous les autres 🙂

Voici le code complet du module

//Inclusion de la classe du nouveau modèle
include_once dirname(__FILE__) . '/classes/Sample.php';
 
/**
 *
 * Sample module to add custom object API
 */
class HhApiSample extends Module {
 
    public function __construct() {
        $this->name = 'hhapisample';
        $this->tab = 'others';
        $this->version = '0.1.0';
        $this->author = 'hhennes';
        $this->need_instance = 0;
        $this->bootstrap = true;
 
        parent::__construct();
 
        $this->displayName = $this->l('HH api Sample');
        $this->description = $this->l('Sample module to add custom entity API');
    }
 
    /**
     * Installation du module
     * @return bool
     */
    public function install() {
 
        if (!parent::install() 
            || !$this->registerHook('addWebserviceResources') 
            || !$this->installSql()
        ) {
            return false;
        }
 
        return true;
    }
 
    /**
     * Désinstallation du module
     * @return bool
     */
    public function uninstall() {
        if (!parent::uninstall() || !$this->uninstallSql()
        ) {
            return false;
        }
 
        return true;
    }
 
    /**
     * Install Sql
     * @return bool
     */
    protected function installSql() {
        //Création de la table de l'entité "Sample"
        $sql = "CREATE TABLE `" . _DB_PREFIX_ . "sample` (
                  `id_sample` int(11) unsigned NOT NULL AUTO_INCREMENT,
                  `reference` int(11) DEFAULT NULL,
                  PRIMARY KEY (`id_sample`)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
 
        //Création de la table de langue de l'entité "Sample"
        $sqlLang = "CREATE TABLE `" . _DB_PREFIX_ . "sample_lang` (
                  `id_sample` int(11) unsigned NOT NULL AUTO_INCREMENT,
                  `id_lang` int(11) unsigned NOT NULL,
                  `name` varchar(255) DEFAULT NULL,
                  `description` TEXT DEFAULT NULL,
                  PRIMARY KEY (`id_sample`,`id_lang`)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
 
        return Db::getInstance()->execute($sql) && Db::getInstance()->execute($sqlLang);
    }
 
    /**
     * Uninstall Sql
     * @return bool
     */
    protected function unInstallSql() {
        $sql = "DROP TABLE IF EXISTS " . _DB_PREFIX_ . "sample;"
                . "DROP TABLE IF EXISTS " . _DB_PREFIX_ . "sample_lang;";
        return Db::getInstance()->execute($sql);
    }
 
    /**
     * Ajout de la nouvelle entité au webservice
     * @Todo Vérifier les versions compatibles
     * @param $params
     * @return array
     */
    public function hookAddWebserviceResources($params) {
        return [
            'samples' => [
                'description' => 'Sample new entity for API',
                'class' => 'Sample'
            ],
        ];
    }
 
}