Prestashop : Afficher la référence fournisseur dans la liste admin des produits

Ce tutoriel est compatible avec les versions de Prestashop suivantes :
1.5 1.6 1.7.3 +
Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

Si vous souhaitez rajouter la référence fournisseur dans la liste des produits dans l’administration afin de pouvoir filtrer les produits via ce paramètre voici comment faire :

( Attention en raison de la méthode de stockage, ceci fonctionne uniquement pour les produits qui n’ont pas de déclinaisons )

Créer un override de la classe AdminProductControllers dans l’emplacement override/controllers/admin/ et insérer le code suivant :

<?php
class AdminProductsController extends AdminProductsControllerCore
{
    
    public function __construct()
    {
        
        parent::__construct();
        
        // On joint la table ps_supplier ou la référence est stockée
        $this->_join .= ' LEFT JOIN '._DB_PREFIX_.'product_supplier ps ON ( a.id_product = ps.id_product AND ps.id_product_attribute = 0 )';
        
        //Ajout du champs dans la liste des champs affichés dans l'amdin
        $this->fields_list['product_supplier_reference'] = array(
            'title' => $this->l('Supplier Reference'),
            'align' => 'left',
            'filter_key' => 'ps!product_supplier_reference',
            'width' => 80
        );
    }
}

La nouvelle colonne « Supplier reference » apparait bien ensuite dans le listing des produits, et il est possible de trier via ce paramètre 🙂
Supplier renference admin list

 

Edit 2015-08-20 :
Si vous souhaitez également pouvoir rechercher les produits dans l’administration via ces références, voici comment procéder :

Pour commencer il faut surcharger la fonction searchByName de la classe Product , afin de chercher dans le champ supplier_reference

 

<?php 
class Product extends ProductCore {
 
 
    /**
    * Admin panel product search
    *
    * @param integer $id_lang Language id
    * @param string $query Search query
    * @return array Matching products
    */
    public static function searchByName($id_lang, $query, Context $context = null)
    {
        if (!$context)
            $context = Context::getContext();
        $sql = new DbQuery();
        $sql->select('p.`id_product`, pl.`name`, p.`active`, p.`reference`, m.`name` AS manufacturer_name, stock.`quantity`, product_shop.advanced_stock_management, p.`customizable`');
        $sql->from('category_product', 'cp');
        $sql->leftJoin('product', 'p', 'p.`id_product` = cp.`id_product`');
        $sql->join(Shop::addSqlAssociation('product', 'p'));
        $sql->leftJoin('product_lang', 'pl', '
            p.`id_product` = pl.`id_product`
            AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl')
        );
        $sql->leftJoin('manufacturer', 'm', 'm.`id_manufacturer` = p.`id_manufacturer`');
        $where = 'pl.`name` LIKE \'%'.pSQL($query).'%\'
        OR p.`reference` LIKE \'%'.pSQL($query).'%\'
        OR p.`supplier_reference` LIKE \'%'.pSQL($query).'%\'
        OR  p.`id_product` IN (SELECT id_product FROM '._DB_PREFIX_.'product_supplier sp WHERE `product_supplier_reference` LIKE \'%'.pSQL($query).'%\')';
        $sql->groupBy('`id_product`');
        $sql->orderBy('pl.`name` ASC');
        if (Combination::isFeatureActive())
        {
            $sql->leftJoin('product_attribute', 'pa', 'pa.`id_product` = p.`id_product`');
            $sql->join(Shop::addSqlAssociation('product_attribute', 'pa', false));
 
//Select the product supplier reference            
$sql->select('sp.product_supplier_reference');
 
            //Join Product Supplier Table
            $sql->leftJoin('product_supplier', 'sp', 'sp.`id_product` = p.`id_product`');
            
            //Change Where condition in order to search supplier reference
            $where .= ' OR pa.`reference` LIKE \'%'.pSQL($query).'%\'
                        OR p.`supplier_reference` LIKE \'%'.pSQL($query).'%\'
                        OR `product_supplier_reference` LIKE \'%'.pSQL($query).'%\'';
        }
        $sql->where($where);
        $sql->join(Product::sqlStock('p', 'pa', false, $context->shop));
        $result = Db::getInstance()->executeS($sql);
        if (!$result)
            return false;
        $results_array = array();
        foreach ($result as $row)
        {
            $row['price_tax_incl'] = Product::getPriceStatic($row['id_product'], true, null, 2);
            $row['price_tax_excl'] = Product::getPriceStatic($row['id_product'], false, null, 2);
            $results_array[] = $row;
        }
        return $results_array;
    }
 
}

 

Puis de surcharger le controller AdminSearchController pour afficher ce champ dans la liste

<?php
class AdminSearchController extends AdminSearchControllerCore
{
    protected function initProductList()
    {
        parent::initProductList();
        //Add new field to display
        $this->fields_list['products']['product_supplier_reference'] = array('title' => $this->l('Supplier reference'), 'width' => 'auto');
    }
}

3 réflexions sur “Prestashop : Afficher la référence fournisseur dans la liste admin des produits”

  1. Bonjour,
    Je souhaiterai afficher le nom du fournisseur (et non la référence) dans le back office du produit. J’essaye de m’inspirer de votre code mais je n’arrive pas à écrire la requête pour faire le lien entre le produit et le fournisseur.
    Je vous remercie d’avance pour votre aide.
    Cordialement,
    Bertrand

    1. Bonjour Bertrand,

      Quelle est votre version de prestashop ?
      Si je devais refaire cette modification aujourd’hui je la traiterais plutôt via un module que via une surcharge.
      Dans votre problématique je pense qu’il faudrait faire une jointure sur la table supplier_lang.

      Cordialement,
      Hervé

  2. Bonjour tt le monde j’essai ce code mais rien n’affiche dans la liste de mes produits ..
    j’ai une version de prestashop 1.6
    je vous remercie d’avance pour votre aide

Laisser un commentaire

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