Nous allons voir comment ajouter un nouvel objet personnalisé dans l’api Prestashop via un module.
Cette méthodologie fonctionne sous Prestashop 1.6 et 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'
            ],
        ];
    }
 
}