Prestashop : Ajouter un objet dans l’api

Ce tutoriel est compatible avec les versions de Prestashop suivantes :
1.6 1.7 1.7.2 1.7.4 1.7.7 1.7.8 8.0 +
Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

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'
            ],
        ];
    }
 
}

17 réflexions sur “Prestashop : Ajouter un objet dans l’api”

  1. Merci pour l’article

    Je veux faire de meme pour ajouter une table en accès via le ws prestashop

    Par contre je ne comprends pas la methode pour créer le module

        1. Bonjour,

          Le modèle de l’exemple ne gère effectivement pas le multi-boutique.
          Comme il étends l’objetModel natif de prestashop il suffit de lui rajouter l’option dans sa définition.

          public static $definition = [
          'table' => 'table_name',
          'primary' => 'id_key',
          'multilang' => true,
          'multilang_shop' => true, //Ajouter ici pour gérer le multishop
          'fields' => [
          ...
          ]
          ];

          Vous pouvez ensuite filtre les différents résultats comme expliqué sur la documentation officielle.

          https://devdocs.prestashop.com/1.7/webservice/tutorials/advanced-use/manage-multishop/

          Cordialement,
          Hervé

          1. J’ai édité mon commentaire qui n’était pas super clair en effet :p
            Il faut rajouter le paramètre ‘multilang_shop’ ( et mettre à jour la base de données en conséquence )
            Et le multi-shop sera géré sur votre entité.

  2. Bonjour ,

    Je suis debutant en prestashop , je veux juste ajouter un champ id_user dans la table customer predéfini , par la suite lorsque j’invoque l’api customer via post , je peux inserer id_user , alors comment je procede ?

  3. Salut ,
    super tutoriel.
    j’arrive pas à ajouter plusieurs nodes et lui affecter des valeurs , j’ai appliqué sur ps_customtext comme ceci :
    protected $webserviceParameters = array(

    ‘objectsNodeName’ => ‘CustomText’,
    ‘objectNodeName’ => ‘text_contentR’,
    ‘fields’ => [
    ‘test’ => array(
    )
    ]
    )
    ;

  4. Bonjour,
    Des années après et vos tutoriels sont encore d’actualités, merci pour cela.

    Sinon, j’essaie d’ajouter des éléments en webservice en multilingue, et je n’y arrive pas.
    J’ai bien accès au webservice, mais on dirait que le multilingue ne se fait pas tout seul.

    Table product_fields
    id_field | id_product
    1 | 9

    Table product_fields_lang
    id_field | id_lang | subtitle | champs1 | champs2
    1 | 1 | Super | lorem FR | lorem FR
    1 | 2 | Awesome | lorem FR | lorem EN

    Mon résultat quand j’appelle l’API, il cherche dans la table product_fields et ignore product_fields_lang :
    {« product_fields »:{« id »:1, »id_shop »: » », »id_lang »: » », »subtitle »:null, »champs1″:null, »champs2″:null}}

    Avez-vous une idée ?
    https://replit.com/@Shonen/Shonens-webservice?v=1

    1. Bonjour,
      Je n’ai jamais été confronté à ce soucis, est-ce que vos champs langues sont bien déclarés comme langue dans la définition ( $definition ) de votre classe ?
      Et et-ce que le paramètre multilangue est bien sur votre classe ?

      public static $definition = [
      'table' => 'product',
      'primary' => 'id_product',
      'multilang' => true, //Utilisation de la langue
      'multilang_shop' => true,
      'fields' => [
      'meta_description' => ['type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 512], //Champ langue
      ]

      Cordialement,
      Hervé

      1. J’avais multilang_shop à false, je suis donc passé à true mais bien sûr il m’a mis une erreur puisque je n’ai pas de id_shop dans ma table.
        Quand j’ai remis à multilang_shop à false, j’ai correctement mes langues dans l’API !
        Autre petite erreur que j’avais oublié qui probablement me pénalisait, je n’avais pas inclus ma classe dans mon module…
        include_once dirname(__FILE__) . ‘/classes/ProductFields.php’;
        En tout cas merci de votre réponse aussi rapide, ça m’a mis sur la piste et c’est très appréciable. Bonne continuation ne vous arrêtez pas !

  5. Great tutorial, thank you. Saved me much time, if i ever reached the solution. Needed to integrate webservice in an existing module, this installs the API seamlessly.
    Good job!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *