Mais, comment faire, avec Prestashop 1.5, pour définir plusieurs numéros d'expéditions (plusieurs numéros de colis) sur la livraison d'une commande ?
Nous verrons dans cet article que, grâce à l'override de Prestashop 1.5, cela est possible ...
Pour ce faire, vous devrez modifier 3 fichiers, et en créer 2.
Tout d'abord, il faut rendre possible cette saisie dans le Back Office (l'administration) de Prestashop. Pour se faire, nous allons modifier le fichier AdminOrdersController.php qui se trouve dans : votre_dossier_prestashop/override/controllers/admin
Etape 1 - AdminOrdersController.php :
public function __construct() { parent::__construct(); $this->_select .= ', ca.`name` as `carrier_name`'; $this->_join .= ' LEFT JOIN `'._DB_PREFIX_.'carrier` ca ON (ca.`id_carrier` = a.`id_carrier`)'; $this->fields_list['carrier_name'] = array( 'title' => $this->l('Transporteur'), 'width' => 100, 'callback' => 'transporteur' ); $this->_select .= ', a.`id_order` as `id_tracking`'; $this->fields_list['id_tracking'] = array( 'title' => $this->l('Tracking Number'), 'width' => 100, 'callback' => 'tracking', 'orderby' => false, 'search' => false ); } public function transporteur($carrier_name) { return $carrier_name; } public function tracking($id_order) { $order = new Order($id_order); if (!Validate::isLoadedObject($order)) return ''; $tracking_numbers = $this->getTrackingNumbers((int)$id_order); $track_number = array(); foreach ($tracking_numbers as $tracking_number) { if ($tracking_number['tracking_number'] != NULL) { $carrier = new Carrier((int)$order->id_carrier, $order->id_lang); $track_number[$i]['tracking_number'] = $tracking_number['tracking_number']; $track_number[$i]['url'] = str_replace('@', $track_number[$i]['tracking_number'], $carrier->url); $i++; } } $this->context->smarty->assign(array( 'track_number' => $track_number )); return $this->createTemplate('_tracking_number.tpl')->fetch(); } public function getTrackingNumbers($id_order) { return Db::getInstance()->executeS('SELECT `tracking_number` FROM `'._DB_PREFIX_.'order_carrier` WHERE `id_order` = '.(int)$id_order); } public static function getOrderInvoiceId($id_order) { $sql = 'SELECT `id_order_invoice` FROM `'._DB_PREFIX_.'order_invoice` WHERE `id_order` = '.(int)$id_order; return Db::getInstance()->getValue($sql); } public function postProcess() { parent::postProcess(); /* Update shipping number */ if (Tools::isSubmit('OsubmitShippingNumber')) { $order = new Order(Tools::getValue('id_order')); if ($this->tabAccess['edit'] === '1') { $order_carrier = new OrderCarrier(Tools::getValue('id_order_carrier')); if (!Validate::isLoadedObject($order_carrier)) $this->errors[] = Tools::displayError('Order carrier ID is invalid'); elseif (!Validate::isTrackingNumber(Tools::getValue('tracking_number'))) $this->errors[] = Tools::displayError('Tracking number is incorrect'); else { // update shipping number // Keep these two following lines for backward compatibility, remove on 1.6 version $order->shipping_number = Tools::getValue('tracking_number'); $order->update(); // Update order_carrier $order_carrier->tracking_number = pSQL(Tools::getValue('tracking_number')); if ($order_carrier->update()) { // Send mail to customer $customer = new Customer((int)$order->id_customer); $carrier = new Carrier((int)$order->id_carrier, $order->id_lang); if (!Validate::isLoadedObject($customer)) throw new PrestaShopException('Can't load Customer object'); if (!Validate::isLoadedObject($carrier)) throw new PrestaShopException('Can't load Carrier object'); // Tracking numbers $tracking_numbers = $this->getTrackingNumbers((int)$order->id); $track_number = array(); foreach ($tracking_numbers as $tracking_number) { if ($tracking_number['tracking_number'] != NULL) { $carrier = new Carrier((int)$order->id_carrier, $order->id_lang); $followup .= '<a href="'.str_replace('@', $tracking_number['tracking_number'], $carrier->url).'">'. $tracking_number['tracking_number'] .'</a> '; } } $templateVars = array( '{followup}' => $followup, '{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{id_order}' => $order->id, '{order_name}' => $order->getUniqReference() ); if (@Mail::Send((int)$order->id_lang, 'in_transit', Mail::l('Package in transit', (int)$order->id_lang), $templateVars, $customer->email, $customer->firstname.' '.$customer->lastname, null, null, null, null, _PS_MAIL_DIR_, true, (int)$order->id_shop)) { Hook::exec('actionAdminOrdersTrackingNumberUpdate', array('order' => $order)); Tools::redirectAdmin(self::$currentIndex.'&id_order='.$order->id.'&vieworder&conf=4&token='.$this->token); } else $this->errors[] = Tools::displayError('An error occurred while sending e-mail to the customer.'); } else $this->errors[] = Tools::displayError('Order carrier can't be updated'); } } else $this->errors[] = Tools::displayError('You do not have permission to edit here.'); } if (Tools::isSubmit('submitAddTrackingNumber')) { $order = new Order(Tools::getValue('id_order')); if ($order->hasInvoice()) { $order_invoice = new OrderInvoice($this->getOrderInvoiceId((int)$order->id)); if ($order_invoice->id != 0) { $order_carrier = new OrderCarrier(Tools::getValue('id_order_carrier')); $order_carrier->id_order = (int)$order->id; $order_carrier->id_carrier = (int)$order->id_carrier; $order_carrier->id_order_invoice = (int)$order_invoice->id; $order_carrier->weight = 0; $order_carrier->shipping_cost_tax_excl = 0; $order_carrier->shipping_cost_tax_incl = 0; $order_carrier->tracking_number = Tools::getValue('tracking_number_add'); $order_carrier->add(); // Send mail to customer $customer = new Customer((int)$order->id_customer); $carrier = new Carrier((int)$order->id_carrier, $order->id_lang); if (!Validate::isLoadedObject($customer)) throw new PrestaShopException('Can't load Customer object'); if (!Validate::isLoadedObject($carrier)) throw new PrestaShopException('Can't load Carrier object'); // Tracking numbers $tracking_numbers = $this->getTrackingNumbers((int)$order->id); $track_number = array(); foreach ($tracking_numbers as $tracking_number) { if ($tracking_number['tracking_number'] != NULL) { $carrier = new Carrier((int)$order->id_carrier, $order->id_lang); $followup .= '<a href="'.str_replace('@', $tracking_number['tracking_number'], $carrier->url).'">'. $tracking_number['tracking_number'] .'</a> '; } } $templateVars = array( '{followup}' => $followup, '{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{id_order}' => $order->id, '{order_name}' => $order->getUniqReference() ); if (@Mail::Send((int)$order->id_lang, 'in_transit', Mail::l('Package in transit', (int)$order->id_lang), $templateVars, $customer->email, $customer->firstname.' '.$customer->lastname, null, null, null, null, _PS_MAIL_DIR_, true, (int)$order->id_shop)) { Hook::exec('actionAdminOrdersTrackingNumberUpdate', array('order' => $order)); Tools::redirectAdmin(self::$currentIndex.'&id_order='.$order->id.'&vieworder&conf=4&token='.$this->token); } else $this->errors[] = Tools::displayError('An error occurred while sending e-mail to the customer.'); } } } }
Etape 2 - _shipping.tpl :
Ce fichier n'existe pas, il faudra créer un dossier orders dans le dossier votre_dossier_prestashop/override/controllers/admin/templates, puis à l'intérieur créer le fichier _shipping.tpl
Votre arborescence devrait être : votre_dossier_prestashop/override/controllers/admin/templates/orders
Dans ce dossier vous allez créer le fichier _shipping.tpl qui contiendra les lignes de code suivantes :
<table class="table" width="100%" cellspacing="0" cellpadding="0" id="shipping_table"> <colgroup> <col width="15%"> <col width="15%"> <col width=""> <col width="10%"> <col width="20%"> </colgroup> <thead> <tr> <th>{l s='Date:'}</th> <th>{l s='Type'}</th> <th>{l s='Carrier'}</th> <th>{l s='Weight'}</th> <th>{l s='Shipping cost'}</th> <th>{l s='Tracking number'}</th> </tr> </thead> <tbody> {foreach from=$order->getShipping() item=line} <tr> <td>{dateFormat date=$line.date_add full=true}</td> <td>{$line.type}</td> <td>{$line.state_name}</td> <td>{$line.weight|string_format:"%.3f"} {Configuration::get('PS_WEIGHT_UNIT')}</td> <td> {if $order->getTaxCalculationMethod() == $smarty.const.PS_TAX_INC} {displayPrice price=$line.shipping_cost_tax_incl currency=$currency->id} {else} {displayPrice price=$line.shipping_cost_tax_excl currency=$currency->id} {/if} </td> <td> <span id="shipping_number_show">{if $line.url && $line.tracking_number}<a href="{$line.url|replace:'@':$line.tracking_number}">{$line.tracking_number}</a>{else}{$line.tracking_number}{/if}</span> {if $line.can_edit} <form style="display: inline;" method="post" action="{$link->getAdminLink('AdminOrders')|escape:'htmlall':'UTF-8'}&vieworder&id_order={$order->id|escape:'htmlall':'UTF-8'}"> <span class="shipping_number_edit" style="display:none;"> <input type="hidden" name="id_order_carrier" value="{$line.id_order_carrier|htmlentities}" /> <input type="text" name="tracking_number" value="{$line.tracking_number|htmlentities}" /> <input type="submit" class="button" name="OsubmitShippingNumber" value="{l s='Update'}" /> </span> <a href="#" class="edit_shipping_number_link"><img src="../img/admin/edit.gif" alt="{l s='Edit'}" /></a> <a href="#" class="cancel_shipping_number_link" style="display: none;"><img src="../img/admin/disabled.gif" alt="{l s='Cancel'}" /></a> </form> {/if} </td> </tr> {/foreach} <tr class="current-edit"> <td>{dateFormat date=$line.date_add full=true}</td> <td>{$line.type}</td> <td>{$line.state_name}</td> <td colspan = "2"></td> <td> <form style="display: inline;" method="post" action="{$link->getAdminLink('AdminOrders')|escape:'htmlall':'UTF-8'}&addtrackingnumber&id_order={$order->id|escape:'htmlall':'UTF-8'}"> <input type="text" value="" name="tracking_number_add"> <input type="submit" value="Ajouter" name="submitAddTrackingNumber" class="button"> </form> </td> </tr> </tbody> </table>
Etape 3 - _tracking_number.tpl :
A l'étape 2, vous avez créez l'arborescence suivante: votre_dossier_prestashop/override/controllers/admin/templates/orders
C'est dans ce dossier que nous allons créer le fichier _tracking_number.tpl qui contiendra les lignes de code suivantes :
<span style="width:20px; margin-right:5px;"> {foreach from=$track_number item=line} <span id="shipping_number_show">{if $line.url && $line.tracking_number}<a target="_blank" href="{$line.url}">{$line.tracking_number}</a>{else}{$line.tracking_number}{/if}<br /></span> {/foreach} </span>
Etape 4 - Le mail :
Il va nous falloir modifier une ligne du template de mail in_transit.html qui se situe (pour la version française) dans le dossier votre_dossier_prestashop/mails/fr afin que les numéros de colis soient affichés correctement. La modification a réalisé se situe à la ligne 35, ou vous remplacerez la ligne existante par celle-ci :
<td align="left">Vous pouvez suivre l'avancement de la livraison en cliquant sur le(s) lien(s) suivant(s) : {followup}</td>
Si vous possédez un site multi-langue, il faudra procéder de la même dans tous les fichiers de la langue concernée.
Etape 5 - Afficher les liens de suivi colis sur l'interface client :
Le fichier concerné se situe dans le thème de votre boutique. Il s'agit du fichier order_detail.tpl.
Recherchez le code suivant :
{if isset($followup)} <p class="bold">{l s='Click the following link to track the delivery of your order'}</p> <a href="{$followup|escape:'htmlall':'UTF-8'}">{$followup|escape:'htmlall':'UTF-8'}</a> {/if}
et remplacez le par :
{if $order->getShipping()|count > 0} <p class="bold">{l s='Click the following link to track the delivery of your order'}</p> {foreach from=$order->getShipping() item=line} <span id="shipping_number_show">{if $line.tracking_number}{if $line.url && $line.tracking_number}<a href="{$line.url|replace:'@':$line.tracking_number}">{$line.url|replace:'@':$line.tracking_number}</a>{else}{$line.tracking_number}{/if}{else}-{/if}</span><br /> {/foreach} {/if}
Vous voilà fin prêt !
Publié le 01/12/2012 dans Astuces Prestashop version 1.5
» Aucun nouveau produit à l'heure actuelle
COMMENTAIRES