💻 DéveloppementIntermédiaire PS 1.7 PS 8.x

Afficher delivery_out_stock dans le panier PrestaShop

Comment ajouter et afficher la variable delivery_out_stock dans le panier PrestaShop. Override Cart.php, requête SQL et piège classique des langues.

En bref : Pour afficher delivery_out_stock dans le panier PrestaShop, il faut overrider Cart.php pour ajouter ce champ à la requête SQL de getProducts(). Le piège principal est un décalage d'id_lang qui rend la variable vide — vérifiez que le contenu est rempli pour toutes les langues actives.

Publié le 21 mars 2026 5 min de lecture Alexandre Carette

Le besoin : afficher le délai de livraison hors stock dans le panier

Par défaut, PrestaShop stocke deux informations de livraison pour chaque produit : le délai en stock (delivery_in_stock) et le délai hors stock (delivery_out_stock). Ces champs sont enregistrés dans la table ps_product_lang car ils sont traduisibles.

Sur la fiche produit, ces informations s'affichent nativement. En revanche, dans le panier, la variable {$product.delivery_out_stock} n'est pas disponible par défaut. Pour l'exposer, il faut intervenir sur la classe Cart via un override.

Étape 1 : créer l'override de Cart.php

La méthode à surcharger est getProducts(), qui construit la requête SQL récupérant les produits du panier. Il faut y ajouter le champ delivery_out_stock dans le SELECT.

Créez le fichier override/classes/Cart.php :


<?php
/**
 * @author Alexandre Carette <contact@alexandrecarette.fr>
 * @copyright 2026 Alexandre Carette
 * @license Propriétaire et Confidentiel
 */

class Cart extends CartCore
{
    public function getProducts($refresh = false, $id_product = false, $id_country = null, $fullInfos = true)
    {
        // Appel de la méthode parente
        $products = parent::getProducts($refresh, $id_product, $id_country, $fullInfos);

        if (!empty($products)) {
            foreach ($products as &$product) {
                // Récupération du champ delivery_out_stock depuis product_lang
                $delivery = Db::getInstance()->getValue(
                    'SELECT `delivery_out_stock`
                     FROM `' . _DB_PREFIX_ . 'product_lang`
                     WHERE `id_product` = ' . (int) $product['id_product'] . '
                     AND `id_lang` = ' . (int) $this->id_lang . '
                     AND `id_shop` = ' . (int) Context::getContext()->shop->id
                );
                $product['delivery_out_stock'] = $delivery ?: '';
            }
        }

        return $products;
    }
}

PrestaShop 8.x : le mécanisme d'override reste fonctionnel mais Symfony encourage les décorateurs de service. Pour un champ simple comme celui-ci, l'override reste la solution la plus pragmatique.

Après création du fichier, supprimez le cache des classes :


rm var/cache/prod/class_index.php
rm var/cache/dev/class_index.php

Étape 2 : utiliser la variable dans le template du panier

Une fois l'override en place, la variable est accessible dans les templates Smarty du panier :


{if $product.delivery_out_stock}
    <span class="delivery-out-stock">
        {$product.delivery_out_stock}
    </span>
{/if}

Le fichier à modifier dépend de votre thème. Dans le thème classic, c'est typiquement :


themes/votre-theme/templates/checkout/_partials/cart-detailed-product-line.tpl

Le piège classique : l'id_lang incorrect

C'est le problème le plus fréquent lors de cet override, et il est particulièrement vicieux : la variable reste vide alors que le code semble correct.

Pourquoi ça arrive

La table ps_product_lang stocke les traductions avec un id_lang. Si votre requête SQL utilise un id_lang qui ne correspond pas à celui où le contenu a été saisi, le résultat sera vide.

Ce décalage survient typiquement quand :

  • **Plusieurs langues sont installées** mais le contenu n'est rempli que dans une seule
  • **L'id_lang par défaut n'est pas 1** — sur certaines installations, le français peut être `id_lang = 2` ou `3` selon l'historique d'installation
  • **La langue active du contexte** ne correspond pas à celle attendue dans la jointure SQL

Comment diagnostiquer

Pour vérifier quel id_lang est utilisé dans votre contexte :


// Dans votre override, temporairement :
error_log('Cart id_lang: ' . $this->id_lang);
error_log('Context id_lang: ' . Context::getContext()->language->id);

Puis vérifiez en base quelles langues contiennent effectivement la donnée :


SELECT id_lang, delivery_out_stock
FROM ps_product_lang
WHERE id_product = 123;

Si le champ est vide pour certaines langues, c'est la source du problème.

La solution

Deux approches :

  1. **Remplir le champ pour toutes les langues actives** dans le back-office (Catalogue > Produits > onglet Livraison). C'est la solution propre.
    1. **Forcer un fallback** dans le code si le champ est vide pour la langue courante :
    2. 
      $delivery = Db::getInstance()->getValue(
          'SELECT `delivery_out_stock`
           FROM `' . _DB_PREFIX_ . 'product_lang`
           WHERE `id_product` = ' . (int) $product['id_product'] . '
           AND `id_lang` = ' . (int) $this->id_lang . '
           AND `id_shop` = ' . (int) Context::getContext()->shop->id
      );
      
      // Fallback : langue par défaut si vide
      if (empty($delivery)) {
          $delivery = Db::getInstance()->getValue(
              'SELECT `delivery_out_stock`
               FROM `' . _DB_PREFIX_ . 'product_lang`
               WHERE `id_product` = ' . (int) $product['id_product'] . '
               AND `id_lang` = ' . (int) Configuration::get('PS_LANG_DEFAULT') . '
               AND `id_shop` = ' . (int) Context::getContext()->shop->id
          );
      }
      

      Approche alternative : modifier directement la requête SQL de getProducts

      Si vous préférez éviter les requêtes supplémentaires dans une boucle, vous pouvez copier intégralement la méthode getProducts() dans votre override et ajouter pl.delivery_out_stock dans le SELECT de la requête principale.

      Cette approche est plus performante (une seule requête au lieu de N+1) mais plus fragile : chaque mise à jour de PrestaShop risque de modifier la méthode originale, rendant votre override obsolète.

      
      // Dans la requête SQL de getProducts(), ajoutez dans le SELECT :
      // pl.delivery_out_stock,
      

      Conseil : si vous choisissez cette voie, documentez la version de PrestaShop sur laquelle l'override a été créé pour faciliter la maintenance lors des mises à jour.

      Vérification en base de données

      Avant de toucher au code, vérifiez toujours que vos données sont cohérentes :

      
      -- Vérifier les langues actives
      SELECT id_lang, iso_code, name, active
      FROM ps_lang
      WHERE active = 1;
      
      -- Vérifier que delivery_out_stock est rempli pour toutes les langues
      SELECT pl.id_product, pl.id_lang, l.iso_code, pl.delivery_out_stock
      FROM ps_product_lang pl
      JOIN ps_lang l ON l.id_lang = pl.id_lang
      WHERE pl.id_product = 123
      ORDER BY pl.id_lang;
      

      Récapitulatif des fichiers impactés

      FichierAction `override/classes/Cart.php`Ajout du champ `delivery_out_stock` `themes/votre-theme/templates/checkout/_partials/cart-detailed-product-line.tpl`Affichage de la variable `var/cache/*/class_index.php`À supprimer après l'override Back-office > Produits > LivraisonRemplir le champ pour toutes les langues
#override #cart #delivery_out_stock #smarty #product_lang #langues

Questions fréquentes

Tout ce que vous devez savoir sur ce sujet.

Un projet PrestaShop ?

Discutons-en directement.

★★★★★

193 projets livrés

Gratuit & sans engagement — réponse sous 24h

Alexandre Carette

Alexandre Carette

Expert PrestaShop & Architecture E-commerce

Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.