Prestashop – Afficher le logo du transporteur dans la liste des commandes

Ce tutorial va vous permettre d’ajouter une colonne contenant l’icône du transporteur dans la liste des commandes

Dans le back-office de Prestashop, la liste des commandes contient un certain nombre de colonnes : le nom du client, le mode de paiement, le statut de la commande,… Mais de nombreux commerçants se retrouvent souvent face à cette limite : pour connaître le mode de transport choisi par le client il faut ouvrir chaque commande, impossible d’obtenir cette information d’un simple coup d’oeil depuis la liste.

Or vous êtres nombreux à organiser la préparation des commandes sur la base de ce critère ; parce que le type de livraison est synonyme de degré de priorité (vous avez un mode de livraison rapide, de type « express ») ou parce que vous préparez vos commandes par lots en fonction du transporteur.

Nous allons donc voir comment palier à ce problème.

Ajouter une colonne avec le logo du transporteur dans Prestashop
En modifiant le back-office de Prestashop on peut facilement ajouter une colonne contenant l’icone du transporteur dans la liste des commandes

Intégration de la colonne « Transporteur » dans le tableau des commandes

Pour ajouter la colonne permettant d’indiquer le mode de livraison dans la liste des commandes nous allons créer une surcharge (ou « override ») du contrôleur qui gère l’affichage des commandes dans le backoffice.

Commencez donc par créer un fichier intitulé AdminOrdersController.php dans le répertoire override/controllers/admin. Nous allons ensuite ajouter 3 éléments dans le constructeur du contrôleur (autrement dit la fonction __construct()) :

  • la récupération de l’identifiant du transporteur dans la requête SQL
  • la nouvelle colonne du tableau
  • une méthode qui récupère l’image du logo

Pour la requête SQL on va donc ajouter le champ id_carrier, qui sera récupéré dans la table order_carrier, pour laquelle il faudra mettre en place une jointure.

Ensuite on intègre la nouvelle colonne à la liste existante. Comme elle a déjà été générée par le constructeur parent, on doit aussi la « positionner » vers le début du tableau pour que le logo ne s’affiche pas tout à droite du tableau.

Le code du constructeur ressemble donc maintenant à ça

public function __construct()
{
  // On appelle le constructeur du parent (le controleur natif)
  parent::__construct(); 
  // On recupere l'id_carrier qui va servir pour la methode printCarrierIcon()
  $this->_select .= ', oc.`id_carrier`,';
  // On ajoute une jointure pour atteindre l'id_carrier
  $this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'order_carrier` oc ON (a.`id_order` = oc.id_order)';
 // On definit la nouvelle colonne avec icone du transporteur
 // NB : pour Prestashop 1.7 utiliser le nouveau systeme de traduction en remplacant $this->l('Carrier') par $this->trans('Carrier', array(), 'Admin.Global')
 $carrier_column = array(
      'title' => $this->l('Carrier'),
      'align' => 'text-center',
      'callback' => 'printCarrierIcon',
      'orderby' => true,
       'search' => false,
  );
  // On l'integre a la liste (ici en 3eme position)
  $part1 = array_slice($this->fields_list, 0, 2);
  $part2 = array_slice($this->fields_list, 2);
  $part1['id_carrier'] = $carrier_column;
  $this->fields_list = array_merge($part1, $part2);
}

Il ne nous reste plus qu’à créer la méthode déclarée en callback et qui va se charger de retourner le logo. On ajoute donc le code suivant à la fin de notre fichier

// Recuperation de l'image du transporteur
public function printCarrierIcon($id_order, $tr)
{
  if (file_exists(_PS_TMP_IMG_DIR_ . 'carrier_mini_' . $tr['id_carrier'] . '_1.jpg')) {
    return '<img src="../img/tmp/carrier_mini_' . $tr['id_carrier'] . '_1.jpg'.'" class="imgm img-thumbnail" />';
 }
  return null;
 }

Pour faire plus simple vous pouvez également télécharger le fichier qui correspond à votre version de Prestashop.

Attention, comme pour toutes les overrides vous devez faire une manipulation pour qu’elle soit prise en compte. Sous Prestashop 1.6 il faut supprimer le fichier cache/class_index.php manuellement. Sous Prestashop 1.7 il suffit de vider le cache depuis le menu Paramètres avancés > Performances.

En complément : modifier le transporteur associé à une commande

Pour différentes raisons vous êtes peut-être parfois amené à devoir changer le transporteur associé à une commande. Il existe beaucoup de cas de figures :

  • Vous proposez des modes de transports génériques sur votre boutique (ex : « Livraison à domicile », « Livraison express »,…) puis vous confiez les colis à différents transporteurs en fonction de certains critères (poids, distance,…)
  • Un élément de la commande a varié et vous devez opter pour un transporteur plutôt qu’un autre

Dans ce cas vous êtes bloqué, impossible d’effectuer cette manipulation dans le back-office de Prestashop… sauf si vous passez par le module que nous avons conçu à cet effet.

Cliquez sur le boton ci-dessous pour en apprendre plus le module Modifier le transporteur final pour Prestashop, qui vous permettra de changer très facilement l’option de livraison d’une commande.

4 commentaires à propos de cet article
  1. Une dernière question.
    Comment faire pour que cela soit filtrable ?
    J’ai rajouté ce bout de code mais les résultats de recherche ne sont pas corrects
    $carrier_column = array(
    ‘title’ => $this->l(‘Carrier’),
    ‘align’ => ‘text-center’,
    ‘callback’ => ‘printCarrierName’,
    ‘list’ => $carrier_array,
    ‘filter_key’ => ‘oc!id_carrier’,
    ‘filter_type’ => ‘int’,
    ‘order_key’ => ‘id_carrier’
    );

    Nerci d’avance de votre aide

    • Avec un callback un peu différent, qui ressemblerait à ça

      public function printCarrierName($id_order, $tr)
      {
      return Db::getInstance()->getValue(‘SELECT `name` FROM `’._DB_PREFIX_.’carrier` WHERE `id_carrier` = « ‘.$tr[‘id_carrier’].' » AND `active` = « 1 » AND `deleted` = « 0 »‘);
      }

      Et bien sûr il faut remplacer la ligne
      ‘callback’ => ‘printCarrierIcon’,
      par
      ‘callback’ => ‘printCarrierName’,

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *