{"id":2270,"date":"2021-04-22T21:12:42","date_gmt":"2021-04-22T19:12:42","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=2270"},"modified":"2022-03-30T22:22:23","modified_gmt":"2022-03-30T20:22:23","slug":"prestashop-restreindre-un-transporteur-par-code-postal","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2021\/04\/22\/prestashop-restreindre-un-transporteur-par-code-postal\/","title":{"rendered":"Prestashop : Restreindre un transporteur par code postal"},"content":{"rendered":"\n<p>On pourrait \u00e9galement compl\u00e9ter le titre \u00e9galement par : \u00ab\u00a0Ville \/ Nom &#8230; \u00ab\u00a0<br><br>C&rsquo;est une demande qui revient assez r\u00e9guli\u00e8rement et qui est d&rsquo;autant plus d&rsquo;actualit\u00e9 avec le confinement actuel.<br><strong>Comment restreindre un transporteur \u00e0 un certain code postal ?<\/strong><\/p>\n<p>Ceci permets par exemple de cr\u00e9er un transporteur de clic and collect d\u00e9limit\u00e9 \u00e0 certains codes postaux.<br><br>C&rsquo;est tr\u00e8s facile \u00e0 faire dans Prestashop, mais cela n\u00e9cessite la cr\u00e9ation ou l&rsquo;achat d&rsquo;un module.<br><br>Nous allons voir comment proc\u00e9der techniquement pour faire cela.<br>Ce tutoriel est valide \u00e0 la fois pour les versions 1.6.x et 1.7.x de prestashop<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Principe de fonctionnement g\u00e9n\u00e9ral<\/h3>\n\n\n\n<p>Dans Prestashop les activations ou prix des transporteurs sont d\u00e9finis par zones g\u00e9ographiques :<br>Celles-ci sont visibles dans l&rsquo;administration via \u00ab\u00a0International \/ Zones G\u00e9ographique\u00a0\u00bb<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image.png\"><img loading=\"lazy\" decoding=\"async\" width=\"871\" height=\"494\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image.png\" alt=\"\" class=\"wp-image-2271\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image.png 871w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-300x170.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-768x436.png 768w\" sizes=\"auto, (max-width: 871px) 100vw, 871px\" \/><\/a><figcaption>Zones de livraisons <\/figcaption><\/figure>\n\n\n\n<p>Il est ensuite possible de voir la corr\u00e9lation entre les 2 lorsque nous allons \u00e9diter un transporteur.<br>Via \u00ab\u00a0Livraison \/ Transporteur\u00a0\u00bb , \u00e9diter un transporteur et dans l&rsquo;onglet \u00ab\u00a0Destination d&rsquo;exp\u00e9ditions et co\u00fbts\u00a0\u00bb<br>Par exemple le transporteur de la capture ci-dessous est actif uniquement pour les zones \u00ab\u00a0Europe\u00a0\u00bb et \u00ab\u00a0Am\u00e9rique du Nord\u00a0\u00bb<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"466\" height=\"473\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-1.png\" alt=\"\" class=\"wp-image-2272\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-1.png 466w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-1-296x300.png 296w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/a><figcaption>Zones de livraison sur un transporteur<\/figcaption><\/figure>\n\n\n\n<p>Comme le nom des zones est tr\u00e8s explicite on peut ais\u00e9ment comprendre que les clients habitant en <strong>France<\/strong> feront automatiquement partie de la zone <strong>Europe ,<\/strong> et c&rsquo;est bien le cas dans la configuration de prestashop<\/p>\n<p>&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"864\" height=\"253\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-2.png\" alt=\"\" class=\"wp-image-2273\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-2.png 864w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-2-300x88.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-2-768x225.png 768w\" sizes=\"auto, (max-width: 864px) 100vw, 864px\" \/><\/a><figcaption>La France est bien en zone Europe<\/figcaption><\/figure>\n\n\n\n<p>Cependant il existe une possibilit\u00e9 disponible uniquement via le code qui est d&rsquo;assigner automatiquement une zone \u00e0 une adresse en fonction de ses param\u00e8tres.<br>Cette fonctionnalit\u00e9 est g\u00e9r\u00e9e via le hook <strong>actionGetIDZoneByAddressID<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mise en \u0153uvre concr\u00e8te<\/h3>\n\n\n\n<p>Maintenant que le fonctionnement global est connu c&rsquo;est parti pour un exemple concret d&rsquo;impl\u00e9mentation.<br>L&rsquo;objectif va \u00eatre le suivant :<br><strong>Cr\u00e9er un nouveau transporteur \u00ab\u00a0Clic and collect\u00a0\u00bb et le rendre disponible uniquement pour les clients qui habitent dans dans le bas-rhin <\/strong>( donc un code postal qui commence par 67 )<\/p>\n\n\n\n<p>Pour commencer il faut donc cr\u00e9er :<br>&#8211; une nouvelle zone g\u00e9ographique \u00ab\u00a0Click and Collect\u00a0\u00bb en allant dans le menu \u00ab\u00a0Internationnal \/ Zones g\u00e9ographique\u00a0\u00bb et r\u00e9cup\u00e9rer son identifiant technique qu&rsquo;on va r\u00e9utiliser plus tard<br>&#8211; cr\u00e9er un nouveau transporteur \u00ab\u00a0Click and collect\u00a0\u00bb qui est uniquement actif sur la zone \u00ab\u00a0click and collect\u00a0\u00bb<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"457\" height=\"568\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-3.png\" alt=\"\" class=\"wp-image-2277\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-3.png 457w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-3-241x300.png 241w\" sizes=\"auto, (max-width: 457px) 100vw, 457px\" \/><\/a><\/figure>\n\n\n\n<p>C&rsquo;est parti ensuite pour la cr\u00e9ation d&rsquo;un module qui va g\u00e9rer le rattachement de la zone.<br>Nous allons l\u2019appeler <strong>hh_clicandcollectdelivery<br><br><\/strong>Pour ce module nous allons nous concentrer sur l\u2019essentiel uniquement, toute la logique sera cod\u00e9e en dur pour expliquer le principe.<br>Le point&nbsp; essentiel est l&rsquo;impl\u00e9mentation du hook <strong>actionGetIDZoneByAddressID<\/strong> que je d\u00e9taille ici<\/p>\n\n\n\n<pre escaped=\"true\" lang=\"php\">   \n     \/**\n     * R\u00e9cup\u00e9ration de l'identifiant de la zone\n     * @see classes\/Address.php:282\n     * @param array $params\n     * @return mixed\n     *\/\n    public function hookActionGetIDZoneByAddressID($params)\n    {\n\t\/\/Chargement de l'objet adresse \u00e0 partir de son identifiant\n\t$address = new Address($params['id_address']);\n\t\t\n        \/\/Identifiant de la zone g\u00e9ographique clic and collect\n        $id_zone = 9;\n        \n        \/\/Dans mon cas je veux que la zone soit renvoy\u00e9e uniquement pour les codes postaux du type\n        \/\/ 67xxx (bas-rhin )    \n\tif (preg_match('#^67[0-9]{3}$#', $address-&gt;postcode)) {\n\t\t\treturn $id_zone; \/\/L'important est de retourner la zone ici\n\t}\n\t\t\n\t\/\/Par contre ici vous avez acc\u00e8s \u00e0 l'ensemble des champs de l'adresse\n\t\/\/Du coup vous pouvez conditionner la zone \u00e0 n'importe quel champ\n\t\/\/Par exemple si la ville (city = 'Paris', le nom  = 'Herv\u00e9' ) ect ...\n       \n    }\n<\/pre>\n\n\n\n<p>Si on test en tant que client on peut voir que c&rsquo;est bien fonctionnel :<br>Code postal qui commence par 67000<br>(Note : Comme vous le voyez les autres transporteurs ne sont pas disponibles , il faut penser \u00e0 les activer \u00e9galement pour cette nouvelle zone )<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"737\" height=\"800\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-4.png\" alt=\"\" class=\"wp-image-2280\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-4.png 737w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-4-276x300.png 276w\" sizes=\"auto, (max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<p>Code postal qui commence par autre chose , seuls les autres transporteurs sont affich\u00e9s.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"738\" height=\"852\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-5.png\" alt=\"\" class=\"wp-image-2281\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-5.png 738w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-5-260x300.png 260w\" sizes=\"auto, (max-width: 738px) 100vw, 738px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Module basique<\/h3>\n\n\n\n<p>Voici donc le code <strong>le plus basique<\/strong> du module qui permets de g\u00e9rer \u00e7a.<\/p>\n\n\n\n<pre escaped=\"true\" lang=\"php\">   \n    class Hh_clicandcollectdelivery extends Module\n{\n\n    public function __construct()\n    {\n        $this-&gt;name = 'hh_clicandcollectdelivery';\n        $this-&gt;tab = 'others';\n        $this-&gt;version = '0.1.0';\n        $this-&gt;author = 'hhennes';\n        $this-&gt;bootstrap = true;\n        parent::__construct();\n\n        $this-&gt;displayName = $this-&gt;l('Hh Clic and collect delivery');\n        $this-&gt;description = $this-&gt;l('Allow clic and collect to certain postcode');\n    }\n\n    \/**\n     * Installation du module\n     * @return bool\n     *\/\n    public function install()\n    {\n        if (\n            !parent::install()\n            || !$this-&gt;registerHook('actionGetIDZoneByAddressID')\n        ) {\n            return false;\n        }\n\n        return true;\n    } \n\n    \/**\n     * R\u00e9cup\u00e9ration de l'identifiant de la zone\n     * @see classes\/Address.php:282\n     * @param array $params\n     * @return mixed\n     *\/\n    public function hookActionGetIDZoneByAddressID($params)\n    {\n\t\/\/Chargement de l'objet adresse \u00e0 partir de son identifiant\n\t$address = new Address($params['id_address']);\n\t\t\n        \/\/Identifiant de la zone g\u00e9ographique clic and collect\n        $id_zone = 9;\n        \n        \/\/Dans mon cas je veux que la zone soit renvoy\u00e9e uniquement pour les codes postaux du type\n        \/\/ 67xxx (bas-rhin )    \n\tif (preg_match('#^67[0-9]{3}$#', $address-&gt;postcode)) {\n\t\t\treturn $id_zone; \/\/L'important est de retourner la zone ici\n\t}\n\t\t\n\t\/\/Par contre ici vous avez acc\u00e8s \u00e0 l'ensemble des champs de l'adresse\n\t\/\/Du coup vous pouvez conditionner la zone \u00e0 n'importe quel champ\n\t\/\/Par exemple si la ville (city = 'Paris', le nom  = 'Herv\u00e9' ) ect ...\n       \n    }\n}\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Module plus complet<\/h3>\n\n\n\n<p>C&rsquo;est fonctionnel mais j&rsquo;en conviens ce n&rsquo;est pas vraiment adapt\u00e9 \u00e0 une utilisation directement en production.<br \/>Car un peu trop manuel, vous pouvez donc t\u00e9l\u00e9charger ci-dessous un module un peu plus complet qui va ajouter les fonctionnalit\u00e9s suivantes :<\/p>\n<ul>\n<li>Cr\u00e9ation automatique de la nouvelle zone lors de l&rsquo;installation du module<\/li>\n<li>Configuration de la plage de code postal directement depuis l&rsquo;administration ( via une expression r\u00e9guli\u00e8re )<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-6.png\"><img loading=\"lazy\" decoding=\"async\" width=\"589\" height=\"285\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-6.png\" alt=\"\" class=\"wp-image-2282\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-6.png 589w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2021\/04\/image-6-300x145.png 300w\" sizes=\"auto, (max-width: 589px) 100vw, 589px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-text-align-center has-ast-global-color-0-color has-luminous-vivid-amber-background-color has-text-color has-background\"><a href=\"https:\/\/shop.h-hennes.fr\/fr\/7-restriction-livraison-par-code-postal.html\" target=\"_blank\" rel=\"noreferrer noopener\">T\u00e9l\u00e9charger le module complet ( et gratuit ) sur la boutique<\/a><\/p>\n\n\n\n<p>Le but de ce module reste tr\u00e8s basique, pour des besoins plus complet allez voir sur addons il existe pleins de modules qui g\u00e8rent tr\u00e8s bien ce sujet, dans le cas ou il est n\u00e9cessaire d&rsquo;avoir plus de r\u00e8gles !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>On pourrait \u00e9galement compl\u00e9ter le titre \u00e9galement par : \u00ab\u00a0Ville \/ Nom &#8230; \u00ab\u00a0 C&rsquo;est une demande qui revient assez r\u00e9guli\u00e8rement et qui est d&rsquo;autant plus d&rsquo;actualit\u00e9 avec le confinement actuel.Comment restreindre un transporteur \u00e0 un certain code postal ? Ceci permets par exemple de cr\u00e9er un transporteur de clic and collect d\u00e9limit\u00e9 \u00e0 certains [&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":[568,104],"class_list":["post-2270","post","type-post","status-publish","format-standard","hentry","category-prestashop-2","tag-livraison","tag-prestashop","prestashop-1-6","prestashop-1-7","prestashop-1-7-8","prestashop-8-0","prestashop-8-1"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/2270","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=2270"}],"version-history":[{"count":6,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/2270\/revisions"}],"predecessor-version":[{"id":2425,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/2270\/revisions\/2425"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=2270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=2270"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=2270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}