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