LogoLogo
Homepage
  • Documentations for PrestaShop 1.4
  • English documentation 1.4
    • Getting Started
    • Updating PrestaShop
    • User Guide
      • Training
      • Customizing your shop
      • Browsing the front-office
      • Connecting to the PrestaShop back-office
      • Adding Products and Product Categories
      • A Look inside the Catalog
      • Managing Customers
      • Managing Orders
      • Managing Payment Methods
      • Managing Shipping
      • Understanding Statistics
      • Managing Modules
      • Managing Employees
      • Understanding the Preferences
      • Exploring PrestaShop's Tools
      • PrestaShop Support
    • System Administrator Guide
    • Developer Guide
      • Developer tutorials
        • Using the REST webservice
          • Chapter 1 - Creating Access to Back Office
          • Chapter 2 - Discovery - Testing access to the web service with the browser
          • Chapter 3 - First steps - Access the Web service and list client
            • 3.1 - Access the web service
            • 3.2 - Handling errors
            • 3.3 - List clients
          • Chapter 4 - Retrieve Data - Retrieving a Client
          • Chapter 5 - Modification - Update client
          • Chapter 6 - Creation - Remote Online Form
          • Chapter 7 - Removal - Remove customer accounts from the database
          • Chapter 8 - Advanced Use
          • Cheat-sheet - Concepts outlined in this tutorial
        • Understanding and using hooks
        • Synchronization via Hooks
        • Modules, Classes and Controller Override
        • Modules, Override, Web Service
        • Db class good practices for Prestashop 1.4
        • Carrier modules - functions, creation and configuration
        • Creating your own payment module
        • Accelerated Security Course - Episode 1 - Never Trust Foreign Data
        • Accelerated Security Course - Episode 2 - SQL Injections
        • Accelerated Security Course - Episode 3 - XSS
        • Accelerated Security Course - Episode 4 - CSRF
      • Fundamentals
      • Creating a PrestaShop module
      • Development standard
      • Public and overloadable methods
      • Web-service reference
      • How to use the forge to contribute to PrestaShop
      • Rocky's guides
        • PrestaShop 1.4.3 Development Guide
          • Architecture
          • Overriding Files
          • Creating Modules
          • Cookie Structure
          • Database Structure
        • PrestaShop 1.4.3 Performance Guide
    • Designer Guide
      • Coding a theme
      • Design tips
      • Implementing layered navigation in a theme
    • Troubleshooting
    • FAQ
    • User contributions
    • Documentation PDFs
  • Documentation française 1.4
    • Guide de démarrage
    • Mettre à jour PrestaShop
    • Guide de l'utilisateur
      • Formation
      • Personnaliser votre boutique
      • Se connecter au back-office de Prestashop
      • Ajouter des produits et des catégories de produits
      • Un aperçu du catalogue
      • Gérer les clients
      • Gérer les commandes
      • Gérer les méthodes de paiement
      • Gérer le transport
      • Comprendre les statistiques
      • Gérer les modules
      • Gérer les employés
      • Comprendre les préférences
      • Explorer les outils de PrestaShop
      • Obtenir de l'aide
    • Guide de l'administrateur système
    • Guide du développeur
      • Fondamentaux
      • Créer un module PrestaShop
      • Tutoriels pour développeurs
        • Tutoriel Webservice REST
          • Chapitre 1 - Mise en place - Création des accès dans le Back Office
          • Chapitre 2 - Découverte - Tester l'accès au service web avec le navigateur
          • Chapitre 3 - Premiers pas - Accéder au service web et lister les clients
            • 3.1 Accéder au service web
            • 3.2 Gestion des erreurs
            • 3.3 Lister les clients
          • Chapitre 4 - Récuperer des données : Récupérer un client
          • Chapitre 5 - Modification : Mettre à jour un client
          • Chapitre 6 - Création : Formulaire d'ajout à distance
          • Chapitre 7 - Suppression : Retirer des comptes client de la base
          • Chapitre 8 – Utilisation avancée
          • Chapitre 9 - Gestion des images
          • Chapitre 10 - Gestion des prix
          • Mémento : Notions énoncées dans ce tutoriel
        • Mieux comprendre et utiliser les hooks
        • La synchronisation via les Hooks
        • Surcharge et override
        • Modules, surcharge, web service
        • Les bonnes pratiques de la classe Db sur Prestashop 1.4
        • Les modules transporteurs - fonctionnement, création, configuration
        • Cours de sécurité accéléré no. 1 - Never trust foreign data
        • Cours de sécurité accéléré no. 2 - Injections SQL
        • Cours de sécurité accéléré no. 3 - XSS
        • Cours de Sécurité accéléré no. 4 - CSRF
    • Guide du designer
      • Conseils en design
      • Créer un thème
    • Guide du Vendeur
    • Import Wiki FR
      • Dépannage
        • Changer la taille maximum de téléchargement de fichiers
        • Comment ajouter une page à PrestaShop
        • Générer le fichier .htaccess par Prestashop pour avoir des URLs simplifiées
        • Générer un nouveau mot de passe manuellement
        • Import CSV
        • Personnalisation des mails clients
        • Problème d'allocation mémoire chez 1&1
        • Problème pour se connecter après avoir effacé une langue
        • Votre site ne répond plus, une page blanche s’affiche
      • Fidéliser les Clients
      • Gestion des Taxes
      • Installer Un Module
      • Sauvegarder votre Base de Données
    • PDF de la documentation
    • Contributions des utilisateurs
    • Questions fréquentes
  • Documentación española 1.4
    • Introducción
    • Actualización de PrestaShop
    • Guía de Usuario
      • Entrenamiento
      • Personalización de su tienda
      • Exploración del front-office
      • Conexión al back-office PrestaShop
      • Añadir Productos y Categorías de Productos
      • Una Mirada Dentro del Catálogo
      • Gestión de Clientes
      • Gestión de Pedidos
      • Gestión de Métodos de Pago
      • Gestión de Envío
      • Comprensión de las Estadísticas
      • Gestión de Módulos
      • Gestión de Empleados
      • Comprensión de Preferencias
      • Exploración de las herramientas de PrestaShop
      • Soporte PrestaShop
    • Guía del Administrador del Sistema
    • Guía del Desarrollador
      • Aspectos Fundamentales
      • Creación de un módulo de PrestaShop
      • Estándares de desarrollo
      • Manuales de desarrollador
        • Utilización del servicio web REST
          • Capítulo 1 - Creación de Acceso al Back Office
          • Capítulo 2 - Descubrimiento - Pruebas de acceso al servicio web con el navegador
          • Capítulo 3 - Primeros pasos - Acceso al servicio Web y lista de clientes
            • 3.1 - Acceso al servicio web
            • 3.2 - Manejo de errores
            • 3.3 - Enumeración de clientes
          • Capítulo 4 - Recuperación de datos - Recuperación de un cliente
          • Capítulo 5 - Modificación - Actualización de cliente
          • Capítulo 6 - Creación - Formulario En Línea Remoto
          • Capítulo 7 - Eliminación - Eliminar cuentas de clientes de la base de datos
          • Capítulo 8 - Uso avanzado
        • Comprensión y uso de hooks
        • Sincronización a través de Hooks
        • Módulos, Reemplazo, Servicio Web
        • Módulos, Clases y Reemplazo del Controlador
        • Buenas prácticas de Clase DB para Prestashop 1.4
        • Módulos de transportistas - funciones, creación y configuración
        • Curso Acelerado de Seguridad - Episodio 1 - Nunca Confíe en Datos Exteriores
        • Curso Acelerado de Seguridad - Episodio 2 - Inyecciones SQL
        • Curso Acelerado de Seguridad - Episodio 3 - XSS
        • Curso Acelerado de Seguridad - Episodio 4 - CSRF
      • Referencia del servicio web
    • Guía de Diseñador
      • Codificación de un tema
      • Consejos de Diseño
    • Solución de problemas
    • Preguntas Frecuentes
Powered by GitBook
On this page
  • Préambule
  • Par où commencer ?
  • Explication de l'exemple
  • Les méthodes constructeur, installation, désinstallation
  • Les méthodes back office
  • Les méthodes front office
  • Pour aller plus loin

Was this helpful?

  1. Documentation française 1.4
  2. Guide du développeur
  3. Tutoriels pour développeurs

Les modules transporteurs - fonctionnement, création, configuration

PreviousLes bonnes pratiques de la classe Db sur Prestashop 1.4NextCours de sécurité accéléré no. 1 - Never trust foreign data

Last updated 4 years ago

Was this helpful?

Cet article a été écrit par Fabien Serny, et .

Préambule

Attention cet article est à l'attention de développeurs avancés (connaissance des hooks, de l'objet Carrier, ...) et est valable à partir de la version 1.4 de PrestaShop. Pour savoir ce qu'est un hook, je vous conseille de vous reporter à l'article de Julien Breux ici :

De base PrestaShop permet de créer des transporteurs et de configurer le calcul des frais de transport à partir de tranches de poids et de tranches de prix que vous pouvez spécifier dans le back office.

Ce système atteint sa limite lorsque vous voulez récupérer les prix via des webservices (UPS, USPS, Fedex) ou encore que vous voulez faire votre propre système de calcul de frais de transports (selon nombre d'articles dans le panier, limitation d'un transporteur à un ou plusieurs pays, etc...).

C'est à ce moment-là qu'interviennent les modules transporteurs.

Par où commencer ?

Il existe un module de base que vous pouvez télécharger ici. L'article partira de ce module de base mais il vous est bien entendu possible de le modifier et de l'adapter à vos besoins.

Notre exemple permet de gérer deux transporteurs auxquels il est possible de fixer un coût additionnel en plus du tarif par tranches configuré dans le back office.

Certaines parties du code sont volontairement dupliquées pour mieux comprendre le mécanisme. Il vous appartient de gérer la liste des transporteurs proprement (à l'aide d'une table de données par exemple).

Explication de l'exemple

Tout d'abord, notez le fait que le module est extends de la classe CarrierModule et non Module. A présent, faisons une petite liste des méthodes contenues dans ce module et son fonctionnement général.

Les méthodes constructeur, installation, désinstallation

Le constructeur :

// L'identifiant carrier se remplit automatiquement avec le bon id selon le transporteur.
// Nous verrons son utilité un peu plus loin.
public  $id_carrier;

private $_html = '';
private $_postErrors = array();
private $_moduleName = 'mycarrier';
/*
** Construct Method
**
*/
public function __construct()
{
       // Variables communes à tous les modules (plus besoin de les présenter)
    $this->name = 'mycarrier';
    $this->tab = 'shipping_logistics';
    $this->version = '1.0';
    $this->author = 'YourName';
    $this->limited_countries = array('fr', 'us');
    parent::__construct ();
    $this->displayName = $this->l('My Carrier');
    $this->description = $this->l('Delivery methods that you want');
       // Si le module est installé, nous faisons quelques vérifications
    if (self::isInstalled($this->name))
    {
        // Nous récupérons la liste des ids des transporteurs
        global $cookie;
        $carriers = Carrier::getCarriers($cookie->id_lang, true, false, false,
        NULL, PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE);
        $id_carrier_list = array();
        foreach($carriers as $carrier)
            $id_carrier_list[] .= $carrier['id_carrier'];

        // Nous regardons si les transporteurs du module ont bien été créés 
        // Et si les frais additionnels ont bien été configurés
        // Ces warnings s'afficheront sur la page qui liste les modules
        $warning = array();
        if (!in_array((int)(Configuration::get('MYCARRIER1_CARRIER_ID')),
                   $id_carrier_list)) $warning[] .= $this->l('"Carrier 1"').' ';
        if (!in_array((int)(Configuration::get('MYCARRIER2_CARRIER_ID')),
               $id_carrier_list)) $warning[] .= $this->l('"Carrier 2 Overcost"').' ';
        if (!Configuration::get('MYCARRIER1_OVERCOST'))
            $warning[] .= $this->l('"Carrier 1 Overcost"').' ';
        if (!Configuration::get('MYCARRIER2_OVERCOST'))
            $warning[] .= $this->l('"Carrier 2 Overcost"').' ';
        if (count($warning))
    $this->warning .= implode(' , ',$warning).$this->l('must be <br />configured');
    }
}

L'installation :

/*
** Install / Uninstall Methods
**
*/
public function install()
{
    // On crée un tableau contenant les informations des deux transporteurs
    // que l'on veut créer
    $carrierConfig = array(
    0 => array('name' => 'Carrier1',
      'id_tax_rules_group' => 0, // On n'applique pas de taxe 
        au transporteur
      'active' => true, 'deleted' => 0, 
      'shipping_handling' => false,
      'range_behavior' => 0,
      'delay' => array(
        'fr' => 'Description 1',
        'en' => 'Description 1',
        Language::getIsoById(Configuration::get
                ('PS_LANG_DEFAULT')) => 'Description 1'),
      'id_zone' => 1, // Zone pour laquelle le transporteur fonctionne
      'is_module' => true, // On précise que c'est un module
      'shipping_external' => true,
      'external_module_name' => 'mycarrier', // On précise le nom 
        du module
      'need_range' => true // On précise que l'on veut le calcul
        des tranches
     // qui sont configurés dans le back office
      ),
     1 => array('name' => 'Carrier2',
      'id_tax_rules_group' => 0,
      'active' => true,
      'deleted' => 0,
      'shipping_handling' => false,
      'range_behavior' => 0,
      'delay' => array(
        'fr' => 'Description 1',
        'en' => 'Description 1',
        Language::getIsoById(Configuration::get
               ('PS_LANG_DEFAULT')) => 'Description 1'),
      'id_zone' => 1,
      'is_module' => true,
      'shipping_external' => true,
      'external_module_name' => 'mycarrier',
      'need_range' => true
    ),
);
    // On crée les deux transporteurs et on récupère les id_carrier
    // Et nous enregistrons les ids en base de données
    //Je vous invite à regarder dans le code le fonctionnement 
    //de <br />installExternalCarrier
    // Cependant vous n'aurez normalement pas besoin de modifier cette fonction
    $id_carrier1 = $this->installExternalCarrier($carrierConfig[0]);
    $id_carrier2 = $this->installExternalCarrier($carrierConfig[1]);
    Configuration::updateValue('MYCARRIER1_CARRIER_ID', (int)$id_carrier1);
    Configuration::updateValue('MYCARRIER2_CARRIER_ID', (int)$id_carrier2);
    // Puis on procède à une installation de modules standard
    // Nous verrons un peu plus loin à quoi sert le hook updatecarrier
    if (!parent::install() ||
        !Configuration::updateValue('MYCARRIER1_OVERCOST', '') ||
        !Configuration::updateValue('MYCARRIER2_OVERCOST', '') ||
        !$this->registerHook('updateCarrier'))
        return false;

    return true;
}

La désinstallation :

public function uninstall()
{
    // On procède tout d'abord à la désinstallation classique d'un module
    if (!parent::uninstall() ||
        !Configuration::deleteByName('MYCARRIER1_OVERCOST') ||
        !Configuration::deleteByName('MYCARRIER2_OVERCOST') ||
        !$this->unregisterHook('updateCarrier'))
        return false;        
    // On efface les transporteurs que l'on avait créé
    $Carrier1 = new Carrier((int)(Configuration::get('MYCARRIER1_CARRIER_ID')));
    $Carrier2 = new Carrier((int)(Configuration::get('MYCARRIER2_CARRIER_ID')));
// Si l'un des deux modules était le transporteur par défaut, 
//on en choisit un <br />autre
    if (Configuration::get('PS_CARRIER_DEFAULT') == (int)($Carrier1->id) ||
        Configuration::get('PS_CARRIER_DEFAULT') == (int)($Carrier2->id))
    {
        global $cookie;
        $carriersD = Carrier::getCarriers($cookie->id_lang, true, false, false,
                NULL, PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE);
        foreach($carriersD as $carrierD)
            if ($carrierD['active'] AND !$carrierD['deleted']
                AND ($carrierD['name'] != $this->_config['name']))
                Configuration::updateValue('PS_CARRIER_DEFAULT',
                                $carrierD['id_carrier']);
    }
    // Puis on efface les transporteurs via la variable delete
    // afin de garder l'historique des transporteurs pour les commandes qui ont 
    //été passés avec
    $Carrier1->deleted = 1;
    $Carrier2->deleted = 1;
    if (!$Carrier1->update() || !$Carrier2->update())
        return false;

    return true;
}

Les méthodes back office

Je ne m'attarderai pas sur la plupart des méthodes du back office (getContent, _displayForm, _postValidation et _postProcess) qui sont relativement simples et qui sont là pour permettre d'administrer les coûts des transporteurs. Je vous laisse les découvrir dans le module d'exemple.

Cependant, j'attire votre attention sur la méthode hookupdateCarrier ci-dessous. Dans PrestaShop, à chaque fois que l'on modifie un transporteur, celui-ci est automatiquement archivé et un nouveau transporteur est créé.

Techniquement, on passe le flag deleted du transporteur à 1 et on en créé un nouveau. C'est pour cela que lorsque vous modifiez un transporteur via l'onglet « Transporteurs » de votre back office, son id change.

Il faut donc hooké le module afin d'actualiser l'id du transporteur lorsque celui-ci change.

/*
** Hook update carrier
**
*/
public function hookupdateCarrier($params)
{
    // On actualise l'id du carrier 1
    if ((int)($params['id_carrier']) == (int)(Configuration::get<br />('MYCARRIER1_CARRIER_ID')))
        Configuration::updateValue('MYCARRIER1_CARRIER_ID', (int)
                ($params['carrier']->id));
    // On actualise l'id du carrier 2
    if ((int)($params['id_carrier']) == (int)(Configuration::get<br />('MYCARRIER2_CARRIER_ID')))
        Configuration::updateValue('MYCARRIER2_CARRIER_ID', (int)
               ($params['carrier']->id));
}

Les méthodes front office

/*
** Front Methods
**
** Si vous avez configuré la variable need_range à true lorsque vous avez créé votre 
** transporteur dans la méthode install(), la méthode appelée par la classe Cart sera 
** getOrderShippingCost()
** Sinon, la méthode appelée sera getOrderShippingCostExternal
**
** La variable $params contient le panier, le client et ses addresses
** La variable $shipping_cost contient les frais calculé par les tranches de prix  
** configurés pour le transporteur dans le back-office
**
*/
public function getOrderShippingCost($params, $shipping_cost)
{
    // Cet exemple retourne les frais de port avec le coût supplémentaire
    // mais vous pouvez appeler un webservice ou faire le calcul que vous voulez
    // avant de retourner le frais de port final

    if ($this->id_carrier == (int)(Configuration::get('MYCARRIER1_CARRIER_ID')) &&
        Configuration::get('MYCARRIER1_OVERCOST') > 1)
        return (float)(Configuration::get('MYCARRIER1_OVERCOST'));

    if ($this->id_carrier == (int)(Configuration::get('MYCARRIER2_CARRIER_ID')) &&
        Configuration::get('MYCARRIER2_OVERCOST') > 1)
        return (float)(Configuration::get('MYCARRIER2_OVERCOST'));
    // Si le transporteur n'est pas renconnu, il suffit de retourner false
    // le transporteur n'apparaitra alors pas dans la liste des transporteurs
    return false;
}
public function getOrderShippingCostExternal($params)
{
    // Cet exemple retourne le coût supplémentaire
    // mais vous pouvez appeler un webservice ou faire le calcul que vous voulez
    // avant de retourner le frais de port final
    if ($this->id_carrier == (int)(Configuration::get('MYCARRIER1_CARRIER_ID')) &&
        Configuration::get('MYCARRIER1_OVERCOST') > 1)
                return (float)(Configuration::get('MYCARRIER1_OVERCOST'));
    if ($this->id_carrier == (int)(Configuration::get('MYCARRIER2_CARRIER_ID')) &&
            Configuration::get('MYCARRIER2_OVERCOST') > 1)
                return (float)(Configuration::get('MYCARRIER2_OVERCOST'));
    // Si le transporteur n'est pas renconnu, il suffit de retourner false
    // le transporteur n'apparaitra alors pas dans la liste des transporteurs
    return false;
}

Pour aller plus loin

Ici l'exemple est très simple, mais vous pouvez créer des modules plus complexes en y associant, par exemple, des webservices (comme c'est le cas dans les modules UPS par exemple) ou encore faire un calcul basé sur le nombre de produits dans votre panier.

Bref, vous avez à présent totalement la main sur le calcul des frais de transport

publié sur le blog de PrestaShop le 26 septembre 2011
Mieux comprendre et utiliser les hooks
(smile)