EnveloppeBulle Posted June 1, 2010 Share Posted June 1, 2010 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 More sharing options...
manzero17 Posted June 8, 2010 Share Posted June 8, 2010 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 More sharing options...
EnveloppeBulle Posted June 9, 2010 Author Share Posted June 9, 2010 il me semble que le $dept est défini dans la fonction displayCarrier() , qui se trouve dans order.php qui envoi les variables aux .tpl correspondants (+ ou -, je ne suis pas expert), c'est d'ailleurs pourquoi ça marche chez moi... sauf oubli de ma part.. Link to comment Share on other sites More sharing options...
manzero17 Posted June 9, 2010 Share Posted June 9, 2010 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 More sharing options...
EnveloppeBulle Posted June 10, 2010 Author Share Posted June 10, 2010 au temps pour moi : je l'avais évidemment fait mais avais oublié de le mentionner ici (je savais que j'avais oublié un truc...) Link to comment Share on other sites More sharing options...
merchal59 Posted November 13, 2010 Share Posted November 13, 2010 Bonjourj'ai tenté toutes ces modifications mais ça ne change rien du tout, le client peut habiter n'importe quel département ou code postal, il peut toujours choisir le transporteur :/Merci de votre aide Link to comment Share on other sites More sharing options...
labulle Posted March 7, 2011 Share Posted March 7, 2011 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 More sharing options...
steegan Posted October 25, 2020 Share Posted October 25, 2020 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 More sharing options...
steegan Posted October 25, 2020 Share Posted October 25, 2020 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now