PAIEMENT SÉCURISÉ LIVRAISON 24/48 H PARRAINAGE REVENDEURS 04 42 08 12 34 de 9h - 12h et 14h - 18h

Plusieurs numéros de suivi pour une commande

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&#039;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

COMMENTAIRES

Aucun commentaire pour le moment.

Ajouter un commentaire