Ajouter une nouvelle méthode de livraison, le guide complet

  • De le 21 novembre 2012
  • Difficulté : 3/4

Ajouter une nouvelle méthode de livraison, le guide complet La plupart des commerçants utilisent l'extension Owebia Shipping pour la gestion des modes de livraison. Ce module est très efficace, mais d'autres alternatives existes, comme l'ajout de modules de livraison indépendants les uns des autres.

Introduction

Livraison Magento

Développer une nouvelle extension pour l'ajout d'une méthode de livraison n'est pas extrêmement complexe. Une fois le principe de base maîtrisé, il est facile d'imaginer y appliquer de nombreuses règles : frais de ports offerts pour une deuxième commande, remise spécifique des frais de port selon les produits du panier...

Les modules étudiés dans cet article ont pour fonction d'ajouter un mode de livraison supplémentaire. Nous travaillerons dans un premier temps sur un module simpliste (colissimo), dans un second temps nous nous intéresserons à l'objet request ainsi qu'aux objets de session, permettant de récupérer un certain nombre d'informations sur la panier, enfin nous étudierons un module de livraison avec configuration poussée depuis l'interface d'administration (chronopost).

Exemple 1 : Colissimo

Architecture du module

Informations

Ce module est volontairement simplifié à l'extrême, il peut servir de base pour le développement d'un module de livraison plus poussé (voir chapître "Exemple 2 : Chronopost").

L'extension n'apparaîtra pas dans le menu Système > Configuration > Ventes > Modes de Livraison, les variables de configuration nécessaires seront définies par défaut dans le fichier config.xml.

Le mode de livraison sera accessible quelque soit le pays de livraison.

Développement du module

Commençons par le fichier de configuration. Nous avons besoin de déclarer les alias pour les modèles ainsi que les assistants. Nous définissons ensuite le modèle de classe à utiliser pour créer et ajouter le nouveau mode de livraison, que nous activons par défaut (carriers/colissimo/active).

Nous ajoutons également le nom du transporteur dans la configuration par défaut (carriers/colissimo/title), cette variable est nécessaire lors de l'affichage des modes de livraison dans les différents blocs.

app/code/local/Magentix/Colissimo/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_Colissimo>
            <version>0.1.0</version>
            <depends>
                <Mage_Shipping/>
            </depends>
        </Magentix_Colissimo>
    </modules>
    <global>
        <models>
            <colissimo>
                <class>Magentix_Colissimo_Model</class>
            </colissimo>
        </models>
        <helpers>
            <colissimo>
                <class>Magentix_Colissimo_Helper</class>
            </colissimo>
        </helpers>
    </global>
    <default>
        <carriers>
            <colissimo> <!-- Code -->
                <model>Magentix_Colissimo_Model_Carrier_Colissimo</model>
                <active>1</active> <!-- carriers/colissimo/active -->
                <title>La Poste</title> <!-- carriers/colissimo/title -->
            </colissimo>
        </carriers>
    </default>
</config>

Ajoutons l'assistant, pour les éventuels traductions dont nous aurions besoin :

app/code/local/Magentix/Colissimo/Helper/Data.php

<?php

class Magentix_Colissimo_Helper_Data extends Mage_Core_Helper_Abstract
{

}

Ajoutons enfin la classe Magentix_Colissimo_Model_Carrier_Colissimo. C'est elle qui va réaliser le traitement de la commande pour créer et ajouter le nouveau mode de livraison.

Cette classe doit indiquer à la demande du système de livraison deux informations : un code qui la différencie des autres modes de livraison et un nom, renvoyé par la méthode getAllowedMethods.

La méthode principale collectRates doit renvoyer un résultat en fonction d'une requête indiquant la commande en cours.

La valeur de $_code doit être identique au chemin de configuration choisi : carriers/colissimo/title (voir noeud default du fichier config.xml).

app/code/local/Magentix/Colissimo/Model/Carrier/Colissimo.php

<?php

class Magentix_Colissimo_Model_Carrier_Colissimo
        extends Mage_Shipping_Model_Carrier_Abstract
        implements Mage_Shipping_Model_Carrier_Interface
{

    protected $_code = 'colissimo';

    protected $_isFixed = true;

    public function collectRates(Mage_Shipping_Model_Rate_Request $request)
    {
        $method = Mage::getModel('shipping/rate_result_method');
        $result = Mage::getModel('shipping/rate_result');

        $method->setCarrier($this->_code);
        $method->setCarrierTitle('La Poste');

        $method->setMethod($this->_code);
        $method->setMethodTitle('Colissimo');

        $method->setCost(5.90);
        $method->setPrice(5.90);

        $result->append($method);

        return $result;
    }

    public function getAllowedMethods()
    {
        return array('colissimo' => Mage::helper('colissimo')->__('Colissimo'));
    }

}

Notez que pour simplifier nous avons indiqué directement dans le code le nom du transporteur (La Poste), l'intitulé du mode de livraison (Colissimo) et le prix (5,90€). Pour plus de souplesse ces valeurs pourront par la suite être saisies directement dans l'interface d'administration.

Le nom du transporteur (La Poste) indiqué ici en dur n'est pas repris lors de l'affichage du mode de livraison sur le site. Les blocs se réfèrent à une méthode getCarrierName. Cette méthode récupère le transporteur directement dans la configuration : carriers/colissimo/title.

Nous venons d'ajouter un nouveau mode de livraison ! Il nous reste à éditer le fichier de déclaration :

app/etc/modules/Magentix_Colissimo.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_Colissimo>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Shipping />
            </depends>
        </Magentix_Colissimo>
    </modules>
</config>

La livraison Colissimo apparaît lors du choix du mode de livraison :

Sélection du mode de livraison Colissimo

Objet Request (Mage_Shipping_Model_Rate_Request)

Nous savons maintenant comment ajouter une méthode de livraison simple. L'objectif est ensuite d'établir des règles de calcul des frais de port : remises particulières, livraison gratuite... Et selon certains paramètres : montant HT du panier, coupon de réduction...

collectRates

Reprenons la classe Magentix_Colissimo_Model_Carrier_Colissimo de notre module. La méthode collectRates accepte en argument un objet request de la classe Mage_Shipping_Model_Rate_Request :

app/code/local/Magentix/Colissimo/Model/Carrier/Colissimo.php

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{

}

Attributs

L'objet request contient toutes sortes de données à propos de la commande : produits du panier, lieu de livraison, montant HT des produits...

Nous pouvons donc l'exploiter afin de définir des règles spécifiques sur notre méthode de livraison. Voici les principaux attributs associés à l'objet :

app/code/local/Magentix/Colissimo/Model/Carrier/Colissimo.php

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
    /* Informations sur la boutique */
    $request->getStoreId(); // (int) Ex : 1
    $request->getWebsiteId(); // (int) Ex : 2
    $request->getBaseCurrency()->getCurrencyCode(); // (string) Ex : EUR

    /* Produits du panier */
    $items = $request->getAllItems();
    foreach($items as $item) {
        // $item > Mage_Sales_Model_Quote_Item
        $item->getSku();
        $item->getName();
        $item->getQty();
        $item->getPrice();
        /* ... */
    }
    
    /* Origine du colis (lieu d'expédition) */
    $request->getOrigCountryId(); // (string) Ex : FR
    $request->getOrigRegionId(); // (int) Ex : 241
    $request->getOrigPostcode(); // (string) Ex : 59100
    $request->getOrigCity(); // (string) Ex : Roubaix

    /* Destination du colis (adresse de livraison du client) */
    $request->getDestCountryId(); // (string) Ex : FR
    $request->getDestRegionId(); // (int) Ex : 241
    $request->getDestRegionCode(); // (string) Ex : 59
    $request->getDestPostcode(); // (string) Ex : 59000
    $request->getDestCity(); // (string) Ex : Lille
    $request->getDestStreet(); // (string) Ex : 30 rue des Lilas

    /* Informations sur le colis */
    $request->getPackageValue(); // (float) Ex : 200 (total HT des produits du panier sans remise)
    $request->getPackageValueWithDiscount(); // (float) Ex : 180 (total HT des produits du panier avec remise)
    $request->getPackagePhysicalValue(); // (float) Ex : 200
    $request->getPackageQty(); // (float) Ex : 2 (nombre de produits du panier)
    $request->getPackageWeight(); // (float) Ex : 400 (poids des produits en gramme)
    $request->getPackageCurrency()->getCurrencyCode(); // (string) Ex : EUR

    /* Informations sur le panier */
    $request->getBaseSubtotalInclTax(); // (float) Ex : 239.20
}

Exemple

Nous souhaitons que la livraison soit offerte lorsque le montant total HT des produits du panier dépasse les 150€ :

app/code/local/Magentix/Colissimo/Model/Carrier/Colissimo.php

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
    $method = Mage::getModel('shipping/rate_result_method');
    $result = Mage::getModel('shipping/rate_result');

    $method->setCarrier($this->_code);
    $method->setCarrierTitle('La Poste');

    $method->setMethod($this->_code);
    $method->setMethodTitle('Colissimo');

    /* La valeur du colis dépasse les 150€ */
    $price = $request->getPackageValueWithDiscount() > 150 ? 0 : 5.90;

    $method->setCost($price);
    $method->setPrice($price);

    $result->append($method);

    return $result;
}

Session

Récupérer des objets en session

L'objet Request ne permet malheureusement pas de récupérer l'ensemble des informations de la commande : coupon de réduction, client...

Dans ce cas il nous faut récupérer les informations stockées en session :

app/code/local/Magentix/Colissimo/Model/Carrier/Colissimo.php

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
    $customer = $this->getCustomer();
    $quote = $this->getQuote();
}

protected function getQuote()
{
    return Mage::getSingleton("checkout/session")->getQuote();
}

protected function getCustomer()
{
    return Mage::helper('customer')->getCustomer();
}

Exemple

Dans cet exemple nous appliquons un frais de port gratuit si le client a déjà passé commande et s'il n'a pas appliqué de code promo :

app/code/local/Magentix/Colissimo/Model/Carrier/Colissimo.php

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
    $method = Mage::getModel('shipping/rate_result_method');
    $result = Mage::getModel('shipping/rate_result');

    $method->setCarrier($this->_code);
    $method->setCarrierTitle('La Poste');

    $method->setMethod($this->_code);
    $method->setMethodTitle('Colissimo');

    /* Détermine le montant des frais de port */
    $customer = $this->getCustomer();
    $orderQty = 0;
    if($customer->getId()) {
        $orderQty = count(Mage::getResourceModel('sales/order_collection')
                          ->addAttributeToFilter('customer_id',$customer->getId()));
    }
    $price = $orderQty && !$this->getQuote()->getCouponCode() ? 0 : 5.90;
    /* ************************************** */

    $method->setCost($price);
    $method->setPrice($price);

    $result->append($method);

    return $result;
}

protected function getQuote()
{
    return Mage::getSingleton("checkout/session")->getQuote();
}

protected function getCustomer()
{
    return Mage::helper('customer')->getCustomer();
}

Exemple 2 : Chronopost

Architecture du module

Informations

Ce module proposera cette fois une configuration complète depuis l'interface d'administration. Nous exploiterons les méthodes de la classe Mage_Shipping_Model_Carrier_Abstract dont hérite notre modèle principal.

Il sera possible :

  • D'activer ou de désactiver le mode de livraison
  • De modifier le nom de transporteur et le titre de la méthode
  • De définir si le montant des frais de port doit être calculé par produits ou pour l'ensemble de la commande
  • De définir un frais de traitement supplémentaire (Handling fee)
  • De définir le poids maximum d'un colis
  • D'appliquer le frais de port uniquement pour certains pays

Il sera également nécessaire de ne pas faire payer le frais de port si les produits sont téléchargeables, ou si un code promo "frais de port offerts" est appliqué.

Ce module se veut assez complet, à vous de désactiver les options dont vous n'avez pas besoin.

Développement du module

Comme pour le précédent module, nous commençons par ajouter le fichier de configuration ainsi que la classe d'assistance :

app/code/local/Magentix/Chronopost/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_Chronopost>
            <version>0.1.0</version>
            <depends>
                <Mage_Shipping/>
            </depends>
        </Magentix_Chronopost>
    </modules>
    <global>
        <models>
            <chronopost>
                <class>Magentix_Chronopost_Model</class>
            </chronopost>
        </models>
        <helpers>
            <chronopost>
                <class>Magentix_Chronopost_Helper</class>
            </chronopost>
        </helpers>
    </global>
    <default>
        <carriers>
            <chronopost>
                <model>Magentix_Chronopost_Model_Carrier_Chronopost</model>
            </chronopost>
        </carriers>
    </default>
</config>

app/code/local/Magentix/Chronopost/Helper/Data.php

<?php

class Magentix_Chronopost_Helper_Data extends Mage_Core_Helper_Abstract
{

}

La classe Magentix_Chronopost_Model_Carrier_Chronopost est étroitement lié à la configuration. Il est indispensable de configurer le module avant que le frais de port puisse fonctionner correctement.

Le fichier system.xml présente l'ensemble des variables dont nous avons besoin :

app/code/local/Magentix/Chronopost/etc/system.xml

<?xml version="1.0"?>
<config>
    <sections>
        <carriers>
            <groups>
                <chronopost translate="label" module="chronopost">
                    <label>Chronopost</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>13</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                    <fields>
                        <active translate="label">
                            <label>Enabled</label>
                            <frontend_type>select</frontend_type>
                            <source_model>adminhtml/system_config_source_yesno</source_model>
                            <sort_order>1</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </active>
                        <title translate="label">
                            <label>Title</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>2</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </title>
                        <name translate="label">
                            <label>Method name</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>3</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </name>
                        <type translate="label">
                            <label>Type</label>
                            <frontend_type>select</frontend_type>
                            <!-- Magentix_Chronopost_Model_System_Config_Source_Shipping_Chronopost -->
                            <source_model>chronopost/system_config_source_shipping_chronopost</source_model>
                            <sort_order>4</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </type>
                        <price translate="label">
                            <label>Price</label>
                            <frontend_type>text</frontend_type>
                            <validate>validate-number validate-zero-or-greater</validate>
                            <sort_order>5</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </price>
                        <handling_fee translate="label">
                            <label>Handling fee</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>6</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </handling_fee>
                        <handling_type translate="label">
                            <label>Calculate Handling Fee</label>
                            <frontend_type>select</frontend_type>
                            <source_model>shipping/source_handlingType</source_model>
                            <sort_order>7</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </handling_type>
                        <handling_action translate="label">
                            <label>Handling Applied</label>
                            <frontend_type>select</frontend_type>
                            <source_model>shipping/source_handlingAction</source_model>
                            <sort_order>8</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </handling_action>
                        <max_package_weight>
                            <label>Maximum Package Weight</label>
                            <frontend_type>text</frontend_type>
                            <validate>validate-number validate-zero-or-greater</validate>
                            <sort_order>9</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </max_package_weight>
                        <sallowspecific translate="label">
                            <label>Ship to applicable countries</label>
                            <frontend_type>select</frontend_type>
                            <sort_order>10</sort_order>
                            <frontend_class>shipping-applicable-country</frontend_class>
                            <source_model>adminhtml/system_config_source_shipping_allspecificcountries</source_model>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </sallowspecific>
                        <specificcountry translate="label">
                            <label>Ship to Specific countries</label>
                            <frontend_type>multiselect</frontend_type>
                            <sort_order>11</sort_order>
                            <source_model>adminhtml/system_config_source_country</source_model>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </specificcountry>
                        <showmethod translate="label">
                            <label>Show method if not applicable</label>
                            <frontend_type>select</frontend_type>
                            <sort_order>12</sort_order>
                            <source_model>adminhtml/system_config_source_yesno</source_model>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </showmethod>
                        <sort_order translate="label">
                            <label>Sort order</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>13</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </sort_order>
                    </fields>
                </chronopost>
            </groups>
        </carriers>
    </sections>
</config>

Le nom des champs ne doit pas être modifié, les variables sont utilisés dans les classes du core Magento. Il est tout à fait possible cependant d'ajouter de nouveaux champs, par exemple "Frais de port gratuit à partir de". Les nouveaux champs pourront être exploités dans la méthode collectRates.

Dans ce fichier de configuration nous déclarons un nouveau type de modèle pour la gestion du champ Type. Il s'agit d'une liste déroulante contenant les valeurs : Per Order et Per Item.

La classe Magentix_Chronopost_Model_System_Config_Source_Shipping_Chronopost contient une unique méthode toOptionArray dont l'objectif et de retourner un tableau contenant les valeurs :

app/code/local/Magentix/Chronopost/Model/System/Config/Source/Shipping/Chronopost.php

<?php

class Magentix_Chronopost_Model_System_Config_Source_Shipping_Chronopost
{
    public function toOptionArray()
    {
        return array(
            array('value' => '', 'label' => Mage::helper('adminhtml')->__('None')),
            array('value' => 'O', 'label' => Mage::helper('adminhtml')->__('Per Order')),
            array('value' => 'I', 'label' => Mage::helper('adminhtml')->__('Per Item')),
        );
    }
}

Au final nous obtenons le menu suivant :

Configuration de la méthode de livraison Chronopost

Nous pouvons enfin attaquer la classe Magentix_Chronopost_Model_Carrier_Chronopost. Nous trouvons toujours les 2 méthodes obligatoires collectRates et getAllowedMethods.

collectRates est cependant beaucoup plus complète. La méthode gère l'ensemble des variables définies dans la configuration. Elle permet des calculs avancés. Par exemple, imaginons le cas de figure suivant :

  • Le prix de la livraison est à 9.90€
  • Le calcul est basé sur le nombre de produits dans le panier puis le nombre de colis
  • Un frais de traitement de 5% est appliqué sur le montant HT des frais de port
  • Le frais de traitement est appliqué par colis
  • Un colis est limité à 30kg (30.000 grammes)

Notre panier contient 3 produits de chacun 15kg.

Le calcul effectué sera donc le suivant :


/**
 * ((FP*QTY)+(HF/100)*(FP*QTY))*ceil((PP*QTY)/30000)
 * FP = Frais de port
 * QTY = Nombre de produit
 * HF = Frais de traitement
 * PP = Poids total des produits
 */

((9.90*3)+(5/100)*(9.90*3))*ceil((15000*3)/30000) = 62.37€

Pour ce calcul 2 méthode vont nous simplifier la vie :

  • getTotalNumOfBoxes(float $weight) : détermine le nombre de colis en fonction du poids
  • getFinalPriceWithHandlingFee(float $shippingPrice) : ajoute les frais de traitement

Finalement, la classe Magentix_Chronopost_Model_Carrier_Chronopost contiendra le code suivant :

app/code/local/Magentix/Chronopost/Model/Carrier/Chronopost.php

<?php

class Magentix_Chronopost_Model_Carrier_Chronopost
    extends Mage_Shipping_Model_Carrier_Abstract
    implements Mage_Shipping_Model_Carrier_Interface
{

    protected $_code = 'chronopost';

    protected $_isFixed = true;

    /**
     * Collect Shipping Rate
     *
     * @param Mage_Shipping_Model_Rate_Request $data
     * @return Mage_Shipping_Model_Rate_Result
     */
    public function collectRates(Mage_Shipping_Model_Rate_Request $request)
    {

        if (!$this->getConfigData('active')) {
            return false;
        }

        /* Produits du panier dont les frais de port sont inutiles */
        $freeBoxes = 0;
        if ($request->getAllItems()) {
            foreach ($request->getAllItems() as $item) {

                if ($item->getProduct()->isVirtual() || $item->getParentItem()) {
                    continue;
                }

                if ($item->getHasChildren() && $item->isShipSeparately()) {
                    foreach ($item->getChildren() as $child) {
                        if ($child->getFreeShipping() && !$child->getProduct()->isVirtual()) {
                            $freeBoxes += $item->getQty() * $child->getQty();
                        }
                    }
                } elseif ($item->getFreeShipping()) {
                    $freeBoxes += $item->getQty();
                }
            }
        }
        $this->setFreeBoxes($freeBoxes);

        /* Nombre de colis en fonction du poids des produits */
        $this->getTotalNumOfBoxes($request->getPackageWeight());

        $result = Mage::getModel('shipping/rate_result');

        /* Type de calcul : par produit ou par commande */
        if ($this->getConfigData('type') == 'O') { // Par commande
            $shippingPrice = $this->getConfigData('price');
        } elseif ($this->getConfigData('type') == 'I') { // Par produit
            $shippingPrice = ($request->getPackageQty() * $this->getConfigData('price')) - ($this->getFreeBoxes() * $this->getConfigData('price'));
        } else {
            $shippingPrice = false;
        }

        /* Prix final avec frais de traitement */
        $shippingPrice = $this->getFinalPriceWithHandlingFee($shippingPrice);

        if ($shippingPrice !== false) {

            $method = Mage::getModel('shipping/rate_result_method');

            $method->setCarrier($this->_code);
            $method->setCarrierTitle($this->getConfigData('title'));

            $method->setMethod($this->_code);
            $method->setMethodTitle($this->getConfigData('name'));

            /* Vos propres règles */
            // $shippingPrice = $request->getPackageValueWithDiscount() > 150 ? $shippingPrice - 3 : $shippingPrice;

            /* Frais de port offerts (un code promo est appliqué ou les produits sont des produits téléchargeables par exemple) */
            if ($request->getFreeShipping() === true || $request->getPackageQty() == $this->getFreeBoxes()) {
                $shippingPrice = '0.00';
            }

            $method->setCost($shippingPrice);
            $method->setPrice($shippingPrice);

            $result->append($method);

        }

        return $result;
    }

    /**
     * Get allowed shipping methods
     *
     * @return array
     */
    public function getAllowedMethods()
    {
        return array('chronopost' => Mage::helper('chronopost')->__('Chronopost'));
    }

}

Il nous reste à éditer le fichier de déclaration :

app/etc/modules/Magentix_Chronopost.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_Chronopost>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Shipping />
            </depends>
        </Magentix_Chronopost>
    </modules>
</config>

Conclusion

Livraison Magento

Ajouter un module par mode de livraison respecte à mon sens d'avantage la modularité de Magento. Les méthodes sont dissociées, la configuration est aisée.

Une fois le principe assimilé, les possibilités de règles de frais de port sont infinies, n'importe quelle opération marketing peut être facilement intégrée.

commentaires

Commentez cet article : Ajouter une nouvelle méthode de livraison, le guide complet