1.6 1.7 1.7.2 1.7.4 1.7.7 1.7.8 8.0 +
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.
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' ], ]; } } |
Merci pour ce partage de connaissances. vous participez activement à la richesse de la communauté prestashop. Je vais tester votre solution sous peu. Merci encore
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
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é
Merci ca marche très bien, par contre je ne vois pas comment limiter les infos en fonction de l’id_shop une idée ?
Merci
danyway
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é
Je n’ai pas compris ce qui doit etre ajouté dans la définition ?
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é.
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 ?
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é
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(
)
]
)
;
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 ?
voilà le résultat de webservice
je voudrais ajouter 3 champs avec des valeurs statiques au départ
oui ,j’ai ajouté en webservice BO , l’appel en front se fait bien .
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
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é
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 !
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!