Prestashop : ajouter le poids du colis sur le bon de livraison

Dans Prestashop, vous avez la possibilité de générer un bon de livraison pour votre transporteur. Il reprend les informations importantes de la commande dont le nom des produits, mode de paiement, adresse de livraison et facturation, nom du transporteur, numéro de commande, etc.

bon-commande-prestashop

Certains transporteurs nous demande néanmoins le poids du colis pour x raison. Nous allons donc l’ajouter.

Dans un premier temps, ouvrez le fichier delivery-slip.tpl du dossier /prestashop/pdf/. Concrètement, ce fichier est le template du bon de commande. Vous pouvez le modifier à votre sauce. Repérez la ligne {if isset($carrier)}, 96 chez moi et ajoutez la définition du poids juste en-dessous :

{if isset($carrier)}
	<b>{l s='Carrier:' pdf='true'}</b><br />
	{$carrier->name}<br />
	<br />
{/if}
{if isset($weight)}
	<br />
	<b>{l s='Poids du colis :' pdf='true'}</b><br />
	{$weight}<br />
	<br />
{/if}

Comme vous le voyez, nous faisons appel à une variable smarty qui n’est pas encore définie dans notre classe. Nous devons donc modifier le core de Prestashop. Pour cela, copiez le fichier HTMLTemplateDeliverySlip.php du dossier /prestashop/classes/pdf/ et collez le dans le dossier /prestashop/override/classes/pdf/.

Videz le cache et assurez-vous de voir cette ligne dans le fichier class_index.php du dossier /prestashop/cache/ :

'HTMLTemplateDeliverySlipCore' => 
array (
	'path' => 'override/classes/pdf/HTMLTemplateDeliverySlip.php',
	'type' => 'class',
	'override' => false,
),

Ouvrez le fichier que vous venez de dupliquer dans le dossier override et repérez la ligne ci-dessous (68 chez moi) :

$order_details = $this->order_invoice->getProducts();

Puis ajoutez le code manquant ci-dessous :

$order_details = $this->order_invoice->getProducts();
$total_weight = 0;
foreach($order_details as $order_detail) {
	$total_weight += $order_detail['product_weight'] * $order_detail['product_quantity'];
}

Vous trouverez un peu plus loin dans ce même fichier, la déclaration des variables Smarty. Ajoutez la variable weight que nous utilisons dans notre template :

$this->smarty->assign(array(
	'order' => $this->order,
	'order_details' => $order_details,
	'delivery_address' => $formatted_delivery_address,
	'invoice_address' => $formatted_invoice_address,
	'order_invoice' => $this->order_invoice,
	'carrier' => $carrier,
	'weight' => $total_weight . Configuration::get('PS_WEIGHT_UNIT')
));

Mon poids reste à 0 dans le bon de commande

Nous avons remarqué ce qui semble être un bug au niveau de la génération du bon de commande sur Prestashop 1.6.0.14 que nous utilisons. Malgré la définition du poids dans les caractéristiques d’un produit, il est toujours à 0 dans le bon.

definition-poids

Si vous avez le même soucis, nous avons une parade. Toujours au niveau du produit, onglet Livraison, nous allons définir le poids du colis :

poids-colis

Il faudra également adapter la classe que vous avez modifié précédemment. Nous utiliserons weight au lieu de product_weight.

$order_details = $this->order_invoice->getProducts();
$total_weight = 0;
foreach($order_details as $order_detail) {
	$total_weight += $order_detail['weight'] * $order_detail['product_quantity'];
}

Et voila, le poids total du colis apparaît bien :

poids-bon-commande

Besoin d'aide ?

Si vous recherchez à améliorer votre boutique...

Contactez nous !
Prestashop : comment augmenter le nombre de résultats dans le bloc recherche
Prestashop : améliorer le tunnel de commande

11 Comments on “Prestashop : ajouter le poids du colis sur le bon de livraison”

  1. Bonjour,
    Merci de cet article très utile pour le bon de commande !
    Pensez-vous qu’il soit possible d’ajouter ce poids mais sur le panier afin que le client puisse lire le poids de la commande avant de la valider ?
    Cdt

    1. Bonjour,
      tout à fait, le principe est le même.
      Il faut cependant rentrer dans le code.
      Si ce n’est dans dans vos cordes et nécessaire pour votre boutique, je suis à votre disposition.

  2. Bonjour,
    Article très très utile et merci !

    Malheureusement, chez moi ça ne fonctionne pas, j’ai toujours le poids à 0kg qui s’affiche malgré avoir suivi à la lettre les explications. Pour info, je suis sur PS 1.5.6.2

    1. Bonjour,
      Le poids est une caractéristique du produit et non un attribut.
      Sur votre boutique, c’est un attribut.
      Avez-vous bien rempli la caractéristique ‘poids’ de vos produits ?

  3. Merci pour ce tuto,

    Chez moi pas de ligne :
    $order_details = $this->order_invoice->getProducts();

    Dans HTMLTemplateDeliverySlip.php…

    j’ai ajouté la boucle pour additionner les poids dans la function : public function getContent()

    Mais sans résultat,

    Merci pour votre aide

    1. Bonjour,

      Vous avez quelle version ?
      Même sur la 1.6.1.3 la ligne est dans ce fichier (ligne 170 dans mon fichier).

  4. Bonjour,

    Merci pour le tuto, mais ne fonctionne pas en 1.6.0.9 (le HTMLTemplateDeliverySlip.php est completement différent).
    Je ne peux pas passer en 1.6.1.x pour diverses raisons.
    Si vous avez une idée ce serai top !
    Merci encore

    1. Bonjour,

      L’article a été réalisé avec une version 1.6.0.14.
      Si cette modification est importante pour vous, vous pouvez me contacter en privé afin de creuser le problème.
      Je devrais pouvoir vous débloquer du temps.

      Merci

  5. Bonjour Jérôme,

    Je suis sur une problématique similaire pour afficher le code Taric sur la facture .PDF.
    J’ai créé un nouveau champ dans la base de données ps_product_lang pour afficher le code Taric des produits.
    Pas de problème pour le formulaire en administration, pour l’affichage (si besoin) dans la fiche produit, par contre impossible d’assigner le champs sur la facture.

    Si tu as une astuce, je suis preneur.

    Merci pour ta réponse,
    Cordialement,

  6. Bonjour,
    Serait il possible de me dire comment vous arriver à avoir l’onglet livraison au niveau du produit?
    Merci cordialement,
    Flavie Rouaix

Laisser un commentaire

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