{"id":1303,"date":"2016-03-12T10:02:29","date_gmt":"2016-03-12T08:02:29","guid":{"rendered":"http:\/\/www.h-hennes.fr\/blog\/?p=1303"},"modified":"2016-03-18T13:09:07","modified_gmt":"2016-03-18T11:09:07","slug":"prestashop-mise-en-place-webservices","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2016\/03\/12\/prestashop-mise-en-place-webservices\/","title":{"rendered":"Prestashop : Mise en place webservices"},"content":{"rendered":"<p>Voici donc le d\u00e9but de notre s\u00e9rie sur les webservices prestashop ( <a href=\"https:\/\/www.h-hennes.fr\/blog\/2016\/03\/06\/prestashop-synchronisez-vos-donnees-avec-les-webservices\/\" target=\"_blank\">Sommaire<\/a> )<\/p>\n<p>Pour cette s\u00e9rie nous allons \u00e9crire les appels au webservice via des scripts php, bas\u00e9 sur la librairie fournie par Prestahop\u00a0 : <a href=\"https:\/\/github.com\/PrestaShop\/PrestaShop-webservice-lib\">https:\/\/github.com\/PrestaShop\/PrestaShop-webservice-lib<\/a><\/p>\n<p>Le projet global est disponible sur github : <a href=\"https:\/\/github.com\/nenes25\/prestashop_hhwebservices\" target=\"_blank\">https:\/\/github.com\/nenes25\/prestashop_hhwebservices<\/a><\/p>\n<p>Pour ce premier article je vais vous d\u00e9tailler le mode de fonctionnement de l&rsquo;import<\/p>\n<p><strong>Structure globale et installation<br \/>\n<\/strong><br \/>\nLa structure du projet sera la suivante :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1306\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2016\/03\/structure.jpg\" alt=\"Structure projet\" width=\"123\" height=\"193\" \/><\/p>\n<p>Nos classes sp\u00e9cifiques de gestion seront dans le dossier \u00ab\u00a0classes\u00a0\u00bb, et les fichiers d&rsquo;imports dans le dossier \u00ab\u00a0files\/imports\u00a0\u00bb.<br \/>\nL&rsquo;appel des fonctions se fera via le fichier imports.php<\/p>\n<p>Le module utilise composer pour g\u00e9rer les d\u00e9pendances et l&rsquo;autoload des classes, avant toute chose il est donc n\u00e9cessaire d&rsquo;installer le projet via la commande<\/p>\n<pre lang=\"bash\">composer install\r\n<\/pre>\n<p><strong>Gestion des donn\u00e9es de l&rsquo;import<\/strong><\/p>\n<p>Pour faciliter la gestion des donn\u00e9es de l&rsquo;import, l&rsquo;objectif est de r\u00e9cup\u00e9rer l&rsquo;ensemble des donn\u00e9es \u00e0 importer sous la forme d&rsquo;un tableau associatif tel que l&rsquo;exemple ci-dessous<\/p>\n<pre>[0] =&gt; Array\r\n        (\r\n            [email] =&gt; testhh@yopmail.com\r\n            [id_gender] =&gt; 1\r\n            [firstname] =&gt; herve\r\n            [lastname] =&gt; herve\r\n            [birthday] =&gt; 2010-01-20\r\n            [passwd] =&gt; test\r\n            [toDelete] =&gt; 0\r\n        )<\/pre>\n<p>&#8230;<\/p>\n<p>&nbsp;<\/p>\n<p>Les cl\u00e9s du tableau correspondant aux noms des attributs Prestashop des entit\u00e9s.<\/p>\n<p>Pour g\u00e9rer cela j&rsquo;ai donc cr\u00e9\u00e9 une classe HhWsCsvData qui va se charger de parser les fichiers csv pour r\u00e9cup\u00e9rer les donn\u00e9es avec le format attendu.<br \/>\nLe postulat \u00e9tant que la premi\u00e8re ligne du fichier contient les titres des colonnes.<\/p>\n<p>Le code de cette classe est le suivant :<\/p>\n<pre lang=\"php\" escaped=\"true\">&lt;?php\r\n\r\n\/**\r\n\u00a0* Classe de r\u00e9cup\u00e9ration des donn\u00e9es Csv\r\n\u00a0*\r\n\u00a0* @author hhennes &lt;contact@h-hennes.fr&gt;\r\n\u00a0*\/\r\nclass HhWsCsvData extends HhWsData {\r\n\r\n\u00a0\u00a0\u00a0 \/**\r\n\u00a0\u00a0\u00a0\u00a0 * R\u00e9cup\u00e9ration des donn\u00e9es du fichier csv\r\n\u00a0\u00a0\u00a0\u00a0 * @param string $fileDir\r\n\u00a0\u00a0\u00a0\u00a0 * @param string $fileName\r\n\u00a0\u00a0\u00a0\u00a0 * @param boolean $useCache\r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 public function getDatas($fileDir, $fileName, $useCache = true) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Cl\u00e9 de cache\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $cache_key = str_replace('\/', '_', $fileDir) . $fileName;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Si du cache existe on renvoie le r\u00e9sultat du cache\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (array_key_exists($cache_key, $this-&gt;_datas) &amp;&amp; $useCache) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $this-&gt;_datas[$cache_key];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Ouverture du fichier\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $csvFile = fopen($fileDir . $fileName . '.csv', 'r');\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $keys = array();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $csvDatas = array();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $i = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while ($row = fgetcsv($csvFile, 1000, \";\", '\"')) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Gestion des ent\u00eates\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ($i == 0) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach ($row as $datas) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $keys[] = $datas;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $j = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $rowDatas = array();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach ($row as $datas) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $rowDatas[$keys[$j]] = $datas;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $j++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $csvDatas[] = $rowDatas;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $i++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Mise en cache des donn\u00e9es\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $this-&gt;_datas[$cache_key] = $csvDatas;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Renvoi des donn\u00e9es\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $this-&gt;_datas[$cache_key];\r\n\u00a0\u00a0\u00a0 }\r\n\r\n}\r\n<\/pre>\n<p>Si vous avez des donn\u00e9es d&rsquo;entr\u00e9e sous un autre format, vous pouvez cr\u00e9er votre propre adapteur qui h\u00e9ritera de la classe HhWsData.<\/p>\n<p><strong>Surcharge du Webservice Prestashop, mis en place de fonctions g\u00e9n\u00e9riques.<\/strong><\/p>\n<p>Au cours de notre travail sur les diff\u00e9rentes entit\u00e9s prestashop, certaines actions vont \u00eatre redondantes, c&rsquo;est pourquoi nous allons cr\u00e9er une classe avec des m\u00e9thodes g\u00e9n\u00e9riques.<\/p>\n<p>Cette classe h\u00e9ritera de la classe de base du webservice prestashop, et c&rsquo;est celle-ci que nous appellerons directement.<br \/>\nVoici son contenu :<\/p>\n<pre lang=\"php\" escaped=\"true\"> &lt;?php\r\n\r\ninclude_once dirname(__FILE__) . '\/..\/vendor\/prestashop\/prestashop-webservice-lib\/PSWebServiceLibrary.php';\r\n\r\n\/**\r\n\u00a0* Gestion des webservices Prestashop\r\n\u00a0*\r\n\u00a0* @author hhennes &lt;contact@h-hennes.fr&gt;\r\n\u00a0*\/\r\nclass HhPrestashopWebservice extends PrestaShopWebservice {\r\n\r\n\u00a0\u00a0\u00a0 \/** Nom de la resource, \u00e0 sucharger par les classe qui h\u00e9ritent *\/\r\n\u00a0\u00a0\u00a0 protected $_resource;\r\n\r\n\u00a0\u00a0\u00a0 \/**\r\n\u00a0\u00a0\u00a0\u00a0 * R\u00e9cup\u00e9ration de l'identifiant d'un objet via ses param\u00e8tres\r\n\u00a0\u00a0\u00a0\u00a0 * @return int $objectId || bool \r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 public function getObjectId($value, $field = 'id') {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $options = array(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'resource' =&gt; $this-&gt;_resource,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'filter' =&gt; array($field =&gt; $value)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $xml = $this-&gt;get($options);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $objectId = (string) $xml-&gt;children()-&gt;children()-&gt;attributes();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ($objectId != '')\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $objectId;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 \/**\r\n\u00a0\u00a0\u00a0\u00a0 * R\u00e9cup\u00e9ration d'un objet vide\r\n\u00a0\u00a0\u00a0\u00a0 * @return SimpleXml\r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 public function getEmptyObject() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $options = array(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'url' =&gt; $this-&gt;url.'\/api\/'.$this-&gt;_resource.'\/?schema=synopsis'\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $schema = $this-&gt;get($options);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $schema;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/**\r\n\u00a0\u00a0\u00a0\u00a0 * Suppression d'un objet\r\n\u00a0\u00a0\u00a0\u00a0 * @param type $resource\r\n\u00a0\u00a0\u00a0\u00a0 * @param type $id\r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 public function deleteObject($resource,$id) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $options = array(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'resource' =&gt; $resource,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'id' =&gt; $id,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $this-&gt;delete($options);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n}\r\n<\/pre>\n<p><strong>Le fichier d&rsquo;import<\/strong><\/p>\n<p>Pour finir nous allons \u00e9crire la base de notre fichier imports.php qui sera charg\u00e9 de r\u00e9aliser l&rsquo;import.<\/p>\n<pre lang=\"php\" escaped=\"true\"> &lt;?php \r\n\/\/Inclusion de l'autoload composer\r\ninclude_once 'vendor\/autoload.php';\r\n\r\n\/\/Identifiants d'acc\u00e8s au webservice\r\n$wsUrl = 'http:\/\/www.yourshop.com';\r\n$wsAuthKey = 'yourKey';\r\n\r\n\/\/Initialisation du webservice avec notre classe sp\u00e9cifique\r\n$ws = new HhPrestashopWebservice($wsUrl,$wsAuthKey, false);\r\n\r\n\/\/Instanciation de la classe de r\u00e9cup\u00e9ration des donn\u00e9es csv\r\n$csv = new HhWsCsvData();\r\n<\/pre>\n<p>Nous arrivons au bout de la pr\u00e9paration de l&rsquo;utilisation des webservices.<br \/>\nDans le prochain article nous verrons ensemble comment mettre cette m\u00e9thodologie en \u0153uvre avec la gestion des clients.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voici donc le d\u00e9but de notre s\u00e9rie sur les webservices prestashop ( Sommaire ) Pour cette s\u00e9rie nous allons \u00e9crire les appels au webservice via des scripts php, bas\u00e9 sur la librairie fournie par Prestahop\u00a0 : https:\/\/github.com\/PrestaShop\/PrestaShop-webservice-lib Le projet global est disponible sur github : https:\/\/github.com\/nenes25\/prestashop_hhwebservices Pour ce premier article je vais vous d\u00e9tailler le [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[245],"tags":[104,425],"class_list":["post-1303","post","type-post","status-publish","format-standard","hentry","category-prestashop-2","tag-prestashop","tag-webservices"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=1303"}],"version-history":[{"count":5,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1303\/revisions"}],"predecessor-version":[{"id":1316,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1303\/revisions\/1316"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}