Prestashop : Restreindre un transporteur par code postal

Ce tutoriel est compatible avec les versions de Prestashop suivantes :
1.6 1.7

On pourrait également compléter le titre également par : « Ville / Nom … « 

C’est une demande qui revient assez régulièrement et qui est d’autant plus d’actualité avec le confinement actuel.
Comment restreindre un transporteur à un certain code postal ?

Ceci permets par exemple de créer un transporteur de clic and collect délimité à certains codes postaux.

C’est très facile à faire dans Prestashop, mais cela nécessite la création ou l’achat d’un module.

Nous allons voir comment procéder techniquement pour faire cela.
Ce tutoriel est valide à la fois pour les versions 1.6.x et 1.7.x de prestashop

Principe de fonctionnement général

Dans Prestashop les activations ou prix des transporteurs sont définis par zones géographiques :
Celles-ci sont visibles dans l’administration via « International / Zones Géographique »

Zones de livraisons

Il est ensuite possible de voir la corrélation entre les 2 lorsque nous allons éditer un transporteur.
Via « Livraison / Transporteur » , éditer un transporteur et dans l’onglet « Destination d’expéditions et coûts »
Par exemple le transporteur de la capture ci-dessous est actif uniquement pour les zones « Europe » et « Amérique du Nord »

Zones de livraison sur un transporteur

Comme le nom des zones est très explicite on peut aisément comprendre que les clients habitant en France feront automatiquement partie de la zone Europe , et c’est bien le cas dans la configuration de prestashop

 

La France est bien en zone Europe

Cependant il existe une possibilité disponible uniquement via le code qui est d’assigner automatiquement une zone à une adresse en fonction de ses paramètres.
Cette fonctionnalité est gérée via le hook actionGetIDZoneByAddressID

Mise en œuvre concrète

Maintenant que le fonctionnement global est connu c’est parti pour un exemple concret d’implémentation.
L’objectif va être le suivant :
Créer un nouveau transporteur « Clic and collect » et le rendre disponible uniquement pour les clients qui habitent dans dans le bas-rhin ( donc un code postal qui commence par 67 )

Pour commencer il faut donc créer :
– une nouvelle zone géographique « Click and Collect » en allant dans le menu « Internationnal / Zones géographique » et récupérer son identifiant technique qu’on va réutiliser plus tard
– créer un nouveau transporteur « Click and collect » qui est uniquement actif sur la zone « click and collect »

C’est parti ensuite pour la création d’un module qui va gérer le rattachement de la zone.
Nous allons l’appeler hh_clicandcollectdelivery

Pour ce module nous allons nous concentrer sur l’essentiel uniquement, toute la logique sera codée en dur pour expliquer le principe.
Le point  essentiel est l’implémentation du hook actionGetIDZoneByAddressID que je détaille ici

     /**
     * Récupération de l'identifiant de la zone
     * @see classes/Address.php:282
     * @param array $params
     * @return mixed
     */
    public function hookActionGetIDZoneByAddressID($params)
    {
	//Chargement de l'objet adresse à partir de son identifiant
	$address = new Address($params['id_address']);
 
        //Identifiant de la zone géographique clic and collect
        $id_zone = 9;
 
        //Dans mon cas je veux que la zone soit renvoyée uniquement pour les codes postaux du type
        // 67xxx (bas-rhin )    
	if (preg_match('#^67[0-9]{3}$#', $address->postcode)) {
			return $id_zone; //L'important est de retourner la zone ici
	}
 
	//Par contre ici vous avez accès à l'ensemble des champs de l'adresse
	//Du coup vous pouvez conditionner la zone à n'importe quel champ
	//Par exemple si la ville (city = 'Paris', le nom  = 'Hervé' ) ect ...
 
    }

Si on test en tant que client on peut voir que c’est bien fonctionnel :
Code postal qui commence par 67000
(Note : Comme vous le voyez les autres transporteurs ne sont pas disponibles , il faut penser à les activer également pour cette nouvelle zone )

Code postal qui commence par autre chose , seuls les autres transporteurs sont affichés.

Module basique

Voici donc le code le plus basique du module qui permets de gérer ça.

    class Hh_clicandcollectdelivery extends Module
{
 
    public function __construct()
    {
        $this->name = 'hh_clicandcollectdelivery';
        $this->tab = 'others';
        $this->version = '0.1.0';
        $this->author = 'hhennes';
        $this->bootstrap = true;
        parent::__construct();
 
        $this->displayName = $this->l('Hh Clic and collect delivery');
        $this->description = $this->l('Allow clic and collect to certain postcode');
    }
 
    /**
     * Installation du module
     * @return bool
     */
    public function install()
    {
        if (
            !parent::install()
            || !$this->registerHook('actionGetIDZoneByAddressID')
        ) {
            return false;
        }
 
        return true;
    } 
 
    /**
     * Récupération de l'identifiant de la zone
     * @see classes/Address.php:282
     * @param array $params
     * @return mixed
     */
    public function hookActionGetIDZoneByAddressID($params)
    {
	//Chargement de l'objet adresse à partir de son identifiant
	$address = new Address($params['id_address']);
 
        //Identifiant de la zone géographique clic and collect
        $id_zone = 9;
 
        //Dans mon cas je veux que la zone soit renvoyée uniquement pour les codes postaux du type
        // 67xxx (bas-rhin )    
	if (preg_match('#^67[0-9]{3}$#', $address->postcode)) {
			return $id_zone; //L'important est de retourner la zone ici
	}
 
	//Par contre ici vous avez accès à l'ensemble des champs de l'adresse
	//Du coup vous pouvez conditionner la zone à n'importe quel champ
	//Par exemple si la ville (city = 'Paris', le nom  = 'Hervé' ) ect ...
 
    }
}

Module plus complet

C’est fonctionnel mais j’en conviens ce n’est pas vraiment adapté à une utilisation directement en production.
Car un peu trop manuel, vous pouvez donc télécharger ci-dessous un module un peu plus complet qui va ajouter les fonctionnalités suivantes :

  • Création automatique de la nouvelle zone lors de l’installation du module
  • Configuration de la plage de code postal directement depuis l’administration ( via une expression régulière )

Le but de ce module reste très basique, pour des besoins plus complet allez voir sur addons il existe pleins de modules qui gèrent très bien ce sujet, dans le cas ou il est nécessaire d’avoir plus de règles !

Laisser un commentaire

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