Jump to content

[ASTUCE] Transporteur selon code postal / département


Recommended Posts

La question est revenue plusieurs fois pour notamment proposer une livraison gratuite aux clients proches de votre entreprise.

Voici une solution qui vous conviendra peut-être (attention, ça reste quand même un peu de la bidouille !). Je la teste actuellement.

Dans les transporteurs, activez le Retrait sur place (réglez pour que ça marche pour la France Métropolitaine) et repérez son ID (ce sera l'id carrier retrait sur place).

Ensuite, dans les classes modifiez le fichier Address.php. Il suffit d'insérer la fonction suivante au milieu des autres fonctions :

    static public function getPostcodeByAddress($id_address)
   {
       $result = Db::getInstance()->getRow('
           SELECT `postcode` FROM `'._DB_PREFIX_.'address`
           WHERE `id_address` = '.intval($id_address));
       return isset($result['postcode']) ? $result['postcode'] : false;
   }



Ensuite, à la racine de votre presta, trouvez le fichier order.php et modifiez-le dans sa fonction displayCarrier() (environ ligne 306, dans *carrier step*). Il suffit de remplacer ça :

    $address = new Address(intval($cart->id_address_delivery));
   $id_zone = Address::getZoneById($address->id);
   $result = Carrier::getCarriers(intval($cookie->id_lang), true, false, intval($id_zone));
   $resultsArray = array();


par ça :

    $address = new Address(intval($cart->id_address_delivery));
   $id_zone = Address::getZoneById($address->id);
   $dept = Address::getPostcodeByAddress($address->id);
   //$dept = substr($dept,0,2); //pour prendre le département au lieu de la commune
   $result = Carrier::getCarriers(intval($cookie->id_lang), true, false, intval($id_zone));
   $resultsArray = array();



Enfin, rendez-vous dans le template correspondant, à savoir theme/votretheme/order-carrier.tpl . Dans le début de la boucle d'affichage du tableau, remplacez :

            {foreach from=$carriers item=carrier name=myLoop}


                       <input type="radio" name="id_carrier" value="{$carrier.id_carrier|intval}" id="id_carrier{$carrier.id_carrier|intval}" {if $carrier.id_carrier == $checked || ($checked == 0 && $i == 0) || ($carriers|@sizeof == 1)}checked="checked"{/if} />


par :

            {foreach from=$carriers item=carrier name=myLoop}


                       {if $carrier.id_carrier=='******votre id carrier retrait sur place******'}
                           {if $dept == '*******le code postal exact ou le n° de dept*******'}
                           <input type="radio" name="id_carrier" value="{$carrier.id_carrier|intval}" id="id_carrier{$carrier.id_carrier|intval}" {if $carrier.id_carrier == $checked || ($checked == 0 && $i == 0) || ($carriers|@sizeof == 1)}checked="checked"{/if} />
                           {else}-
                           {/if}
                       {else}
                       <input type="radio" name="id_carrier" value="{$carrier.id_carrier|intval}" id="id_carrier{$carrier.id_carrier|intval}" {if $carrier.id_carrier == $checked || ($checked == 0 && $i == 0) || ($carriers|@sizeof == 1)}checked="checked"{/if} />
                       {/if}


(Remplacez bien les valeurs où il y a des **** )

ça devrait marcher :)

Note : vous pouvez donc choisir de filtrer par code postal exact ou par département (grâce au substr), mais êtes libres d'ajouter d'autres critères comme apr exemple un id d'utilisateur (j'imagine...).
Note 2 : si vous apportez une modif au transporteur "retrait sur place", alors son ID changera ! attention !

Link to comment
Share on other sites

Bonjour,

Je cherche moi aussi une soluce pour gérer mes livraisons en fonction du code postal.
Je suis développeur, mais je ne "tripote" prestashop que depuis quelques jours.
Pour en venir au concret, cette solution "bidouille" me parait pas mal, mais il me semble qu'il y a un souci sur la variable $dept.
=> Je ne vois pas comment elle est passée à Smarty. Du coup le test pour l'affichage (order-carrier.tpl) ne marche pas.

Je vais essayer de trouver une soluce. Mais si qq'un ayant une meilleure connaissance de prestashop que moi a une idée, je reste à l'écoute.

Link to comment
Share on other sites

Exact, la variable est bien définie dans la fonction displayCarrier, mais elle n'est pas "assignée" à smarty.
Pour cela, il faut ajouter une petite ligne de code à la fonction displayCarrier : 'dept' => $dept,

    
$smarty->assign(array(
       'dept' => $dept, //Code Postal
       'checkedTOS' => intval($cookie->checkedTOS),
       'recyclablePackAllowed' => intval(Configuration::get('PS_RECYCLABLE_PACK')),
       'giftAllowed' => intval(Configuration::get('PS_GIFT_WRAPPING')),
       'conditions' => intval(Configuration::get('PS_CONDITIONS')),
       'recyclable' => intval($cart->recyclable),
       'gift_wrapping_price' => floatval(Configuration::get('PS_GIFT_WRAPPING_PRICE')),
       'carriers' => $resultsArray,
       'HOOK_EXTRACARRIER' => Module::hookExec('extraCarrier', array('address' => $address)),
       'checked' => intval($checked),
       'back' => strval(Tools::getValue('back')),
       'total_wrapping' => number_format($wrapping_fees, 2, '.', ''),
       'total_wrapping_tax_exc' => number_format($wrapping_fees_tax_exc, 2, '.', '')));



En tout cas, merci pour ces bouts de code qui m'ont fait gagner pas mal de temps

Link to comment
Share on other sites

  • 5 months later...
  • 3 months later...

Bonjour,

Je sais pas si vous avez trouvé la solution pour ça mais j'ai fait un module pour gérer le cas ou le vendeur veut faire ses propres livraisons.
Cela permet de limiter les livraisons sur une série de codes postaux, et de laisser le client choisir un créneau horaire pour sa livraison.
Il y a même un système de quotas qui permet de ternir compte de la distance de la zone pour chaque créneau horaire.
Pour plus d'infos : myowndeliveries.labulle.net

Link to comment
Share on other sites

  • 9 years later...
On 6/1/2010 at 2:50 PM, EnveloppeBulle said:

La question est revenue plusieurs fois pour notamment proposer une livraison gratuite aux clients proches de votre entreprise.

Voici une solution qui vous conviendra peut-être (attention, ça reste quand même un peu de la bidouille !). Je la teste actuellement.

Dans les transporteurs, activez le Retrait sur place (réglez pour que ça marche pour la France Métropolitaine) et repérez son ID (ce sera l'id carrier retrait sur place).

Ensuite, dans les classes modifiez le fichier Address.php. Il suffit d'insérer la fonction suivante au milieu des autres fonctions :


    static public function getPostcodeByAddress($id_address)
   {
       $result = Db::getInstance()->getRow('
           SELECT `postcode` FROM `'._DB_PREFIX_.'address`
           WHERE `id_address` = '.intval($id_address));
       return isset($result['postcode']) ? $result['postcode'] : false;
   }
 



Ensuite, à la racine de votre presta, trouvez le fichier order.php et modifiez-le dans sa fonction displayCarrier() (environ ligne 306, dans *carrier step*). Il suffit de remplacer ça :


    $address = new Address(intval($cart->id_address_delivery));
   $id_zone = Address::getZoneById($address->id);
   $result = Carrier::getCarriers(intval($cookie->id_lang), true, false, intval($id_zone));
   $resultsArray = array();
 


par ça :


    $address = new Address(intval($cart->id_address_delivery));
   $id_zone = Address::getZoneById($address->id);
   $dept = Address::getPostcodeByAddress($address->id);
   //$dept = substr($dept,0,2); //pour prendre le département au lieu de la commune
   $result = Carrier::getCarriers(intval($cookie->id_lang), true, false, intval($id_zone));
   $resultsArray = array();
 



Enfin, rendez-vous dans le template correspondant, à savoir theme/votretheme/order-carrier.tpl . Dans le début de la boucle d'affichage du tableau, remplacez :


            {foreach from=$carriers item=carrier name=myLoop}


                       <input type="radio" name="id_carrier" value="{$carrier.id_carrier|intval}" id="id_carrier{$carrier.id_carrier|intval}" {if $carrier.id_carrier == $checked || ($checked == 0 && $i == 0) || ($carriers|@sizeof == 1)}checked="checked"{/if} />

 


par :


            {foreach from=$carriers item=carrier name=myLoop}


                       {if $carrier.id_carrier=='******votre id carrier retrait sur place******'}
                           {if $dept == '*******le code postal exact ou le n° de dept*******'}
                           <input type="radio" name="id_carrier" value="{$carrier.id_carrier|intval}" id="id_carrier{$carrier.id_carrier|intval}" {if $carrier.id_carrier == $checked || ($checked == 0 && $i == 0) || ($carriers|@sizeof == 1)}checked="checked"{/if} />
                           {else}-
                           {/if}
                       {else}
                       <input type="radio" name="id_carrier" value="{$carrier.id_carrier|intval}" id="id_carrier{$carrier.id_carrier|intval}" {if $carrier.id_carrier == $checked || ($checked == 0 && $i == 0) || ($carriers|@sizeof == 1)}checked="checked"{/if} />
                       {/if}

 


(Remplacez bien les valeurs où il y a des **** )

ça devrait marcher :)

Note : vous pouvez donc choisir de filtrer par code postal exact ou par département (grâce au substr), mais êtes libres d'ajouter d'autres critères comme apr exemple un id d'utilisateur (j'imagine...).
Note 2 : si vous apportez une modif au transporteur "retrait sur place", alors son ID changera ! attention !
 

bonjour il y a t'il cette technique pour la version 1.6 merci de répondre cela es assez urgents bien a vous

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...