Focus Magento – Association automatique des frais de port Focus Magento – Association automatique des frais de port

Focus Magento – Association automatique des frais de port

par ,
le 18 septembre 2013

0
0

Magento propose par défaut à l’internaute de calculer les frais de port depuis le panier en renseignant le pays, la région et le code postal de l’adresse de livraison. Ce système n’est pas forcément judicieux car on observe souvent que le prix des frais de port pour un pays reste identique, quelque soit la région ou le code postal de livraison.

estimate

L’objectif est de donner au client un aperçu du montant total de sa commande – frais de port inclus – sans qu’aucune action ne soit nécessaire de sa part. Dès le panier, l’internaute aura ainsi connaissance du montant total de sa commande. Il pourra par la suite s’il le souhaite modifier ces frais de port en choisissant une autre option (une livraison express par exemple).

Magento a besoin au minimum du pays de livraison afin d’obtenir la liste des frais de port à proposer. Si le site ne permet la livraison que pour un seul pays, celui-ci sera alors associé automatiquement à l’adresse de livraison. Dans le cas d’un site e-commerce multi-pays, le pays peut être récupéré par un système de géo-localisation, par exemple celui proposé par le Webservice MaxMind.

Une fois le pays défini, il suffira d’appliquer des frais de port au choix, généralement l’option la moins onéreuse.

shopping

 

Architecture du module

Un simple observer nous permet d’associer automatiquement les frais de port à la commande.

  • app/etc/modules/Altima_Autoquote.xml
  • app/local/Altima/Autoquote/etc/config.xml
  • app/local/Altima/Autoquote/Model/Observer.php

Développement du module

Le fichier de configuration présente 2 observers, le premier checkout_cart_product_add_after  permet l’association des frais de port à la commande après ajout d’un produit au panier. Le deuxième, checkout_cart_update_items_after exécutera la même action lors d’une mise à jour du panier.

app/local/Altima/Autoquote/etc/config.xml

<?xml version="1.0"?>
<config>
<global>
<models>
<autoquote>
<class>Altima_Autoquote_Model</class>
</autoquote>
</models>
</global>
<frontend>
<events>
<checkout_cart_product_add_after>
<observers>
<altima_autoquote_observer>
<type>singleton</type>
<class>autoquote/observer</class>
<method>addDefaultShipping</method>
</altima_autoquote_observer>
</observers>
</checkout_cart_product_add_after>
<checkout_cart_update_items_after>
<observers>
<altima_autoquote_observer>
<type>singleton</type>
<class>autoquote/observer</class>
<method>addDefaultShipping</method>
</altima_autoquote_observer>
</observers>
</checkout_cart_update_items_after>
</events>
</frontend>
</config>

 

La méthode addDefaultShipping de l’observer doit se charger d’associer le pays et les frais de port par défaut. Dans notre exemple, le pays par défaut sera la France (FR) uniquement si le pays du client n’est pas connu (par le biais d’une commande précédente par exemple).

Pour  définir le pays et le mode de livraison associés à l’adresse, il nous faut récupérer l’objet quote. Dans notre exemple, le code des frais de port sera « tablerate_tablerate ». Le code suivant permet l’association du pays et des frais de port :

// Country Id
$country = 'fr';
$shipping = ' tablerate_tablerate';
// Retrieve Quote
$quote = Mage::getSingleton('checkout/session')->getQuote();
// Set Default Country fot Billing
$quote->getBillingAddress()->setCountryId($country);
// Set Default Country and shipping Method for Shipping
$quote->getShippingAddress()
->setCountryId($country)
->setShippingMethod($shipping)
->setCollectShippingRates(true)
->collectTotals();
// Save Quote
$quote->save();
// Reset Checkout
Mage::getSingleton('checkout/session')->resetCheckout();

 

Si le client est connecté il nous est possible de récupérer le code du pays de livraison de l’adresse de livraison par défaut. Ainsi, si le site propose une expédition multi-pays, il est facile de proposer des frais de port par défaut en conséquent :

var $_country = 'FR';
protected function getCountry() {
$country = $this->_country;
if(Mage::helper('customer')->isLoggedIn()) {
$address = Mage::helper('customer')->getCustomer()->getDefaultShippingAddress();
if($address) {
$country = $address->getCountryId();
}
}
return $country;
}

 

La classe « Altima_Autoquote_Model_Observer » du module ressemble pour finir à :

class Altima_Autoquote_Model_Observer
{
/**
* Quote
*
* @var null
*/
var $_quote = null;
/**
* Default Country Id
*
* @var string
*/
var $_country = 'FR';
/**
* Default Shipping
*
* @var string
*/
var $_shipping = 'tablerate_tablerate';
/**
* Set Default Country and Shipping method
*
* @param Varien_Event_Observer $observer
* @return Mage_Autoquote_Model_Observer
*/
public function addDefaultShipping(Varien_Event_Observer $observer)
{
try {
// Retrieve Country Id
$country = $this->getCountry();
// Set Default Country fot Billing
$this->getQuote()->getBillingAddress()->setCountryId($country);
// Set Default Country and shipping Method fot Shipping
$this->getQuote()->getShippingAddress()
->setCountryId($country)
->setShippingMethod($this->_shipping)
->setCollectShippingRates(true)
->collectTotals();
// Save Quote
$this->getQuote()->save();
// Reset Checkout
$this->getCheckout()->resetCheckout();
} catch (Mage_Core_Exception $e) {
$this->getCheckout()->addError($e->getMessage());
} catch (Exception $e) {
$this->getCheckout()->addException(
$e,
Mage::helper('checkout')->__('Load customer quote error')
);
}
return $this;
}
/**
* Retrieve Default Country
*
* @return string
*/
protected function getCountry() {
$country = $this->_country;
if(Mage::helper('customer')->isLoggedIn()) {
$address = Mage::helper('customer')->getCustomer()->getDefaultShippingAddress();
if($address) {
$country = $address->getCountryId();
}
}
return $country;
}
/**
* Retrieve Checkout Session
*
* @return Mage_Checkout_Model_Session
*/
protected function getCheckout()
{
return Mage::getSingleton('checkout/session');
}
/**
* Retrieve Quote
*
* @return Mage_Sales_Model_Quote
*/
protected function getQuote()
{
if (empty($this->_quote)) {
$this->_quote = $this->getCheckout()->getQuote();
}
return $this->_quote;
}
}

 

Pour finir, il nous reste à déclarer le module à Magento :

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

mots-clés :

,

articles à lire ensuite...

Laisser un commentaire

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

Vos commentaires (0)

Est-il possible de faire sauter « State/Province » et « Postal Code » dans Magento afin de garder que le Pays ?

Car au niveau UX, ce n’est pas très pratique pour un utilisateur de rentrer une région + un code postal + cliquer sur estimer les frais de livraison ….

Il est tout à fait possible de désactiver la région et le code postal au niveau du formulaire. Une modification du template « checkout/cart/shipping.phtml » est nécessaire.

La suppression des champs et du JavaScript associé permet au client de ne saisir que le pays.

A titre d’exemple, le fichier suivant a été modifié pour ne proposer que le pays : Estimate Shipping and Tax (shipping.phtml)

Il faudra bien évidemment s’assurer que les modes de livraison proposés sur le site ne dépendent que du pays.

Salut Matthieu,

Par contre ceci va peut être poser soucis si le client change de mode de livraison (ou de pays) dans le Checkout , puis rajoute un nouveau produit.
Ses infos vont alors se réinitialiser.

Il faudrait rajouter un script permettant de vérifier que ces infos ne sont pas déjà settées.
Du type :

$oShippingObject = Mage::getSingleton(‘checkout/session’)->getQuote()->getShippingAddress();
$sCountryCheck = $oShippingObject->getData(‘country_id’);
$sPostcodeCheck = $oShippingObject->getData(‘postcode’);

/* Si pas d’adresse, j’en set une pour pouvoir générer les modes
* de livraison dès l’entrée dans le Cart.
*/
if (empty($sCountryCheck) && empty($sPostcodeCheck)) {
/* Mettre ton code ici */
}

Merci, votre module viens de me faire gagner un temps précieux ! 🙂

0
0

Focus Magento – Association automatique des frais de port