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.
Lors de l’appel à la page de l’api avec un utilisateur qui a les droits nécessaire nous pourrons voir les informations suivantes :
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' ], ]; } } |
mars 28th, 2019
Merci pour ce partage de connaissances. vous participez activement à la richesse de la communauté prestashop. Je vais tester votre solution sous peu. Merci encore
juin 16th, 2020
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
juin 16th, 2020
Bonjour,
L’ensemble des codes nécessaires à la création d’un module et à son ajout son donné dans cet article.
N’hésitez pas à consulter la documentation officielle si des points sont flous pour vous.
https://devdocs.prestashop.com/1.7/modules/
Cordialement,
Hervé
juillet 29th, 2020
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 ?
juillet 31st, 2020
Bonjour Mohamed,
Je ne pense pas totalement comprendre votre question.
Est-ce que ce champ est un nouvel identifiant personnalisé, ou l’identifiant natif de prestashop que vous souhaitez modifier ?
Dans tous les cas la doc officielle sur l’api commence a être pas mal
Cf. https://devdocs.prestashop.com/1.7/webservice/
Cordialement,
Hervé
août 26th, 2020
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(
)
]
)
;
septembre 1st, 2020
Bonjour,
Du coup est-ce que votre instance est visible dans les entités disponibles via l’api ?
Ou est-ce que vous avez juste ajouté le code dans la classe ?
septembre 3rd, 2020
voilà le résultat de webservice
je voudrais ajouter 3 champs avec des valeurs statiques au départ
septembre 3rd, 2020
oui ,j’ai ajouté en webservice BO , l’appel en front se fait bien .