Back-office product list

Añadir columna al listado de productos de Prestashop 1.5.4

20 noviembre, 2013

La idea principal es ampliar la funcionalidad del listado de productos para mostrar una nueva columna con una característica predeterminada. Mostraremos un campo de texto que almacenamos como característica del producto. Los pasos a seguir serán los siguientes:

  • Determinar el elemento a mostrar: prestashop > ps_feature_lang > id_feature. En el ejemplo aquí mostrado id_feature = 7 = shopname.

phpMyAdmin

  • Hacer la consulta ampliada a la base de datos: La query MySQL de la versión 1.5.4.1 de Prestashop sobre la que trabajamos es:
SELECT SQL_CALC_FOUND_ROWS
a.`id_product`,b.name as name,`reference`,a.price as price,a.active as active
, MAX(i.id_image) id_image,cl.name `name_category` , a.`price`, 0 AS price_final, sav.`quantity` as sav_quantity, a.`active`
FROM `ps_product` a
LEFT JOIN `ps_product_lang` b ON (b.`id_product` = a.`id_product` AND b.`id_lang` = 1 AND b.`id_shop` = 1)
LEFT JOIN `ps_image` i ON (i.`id_product` = a.`id_product` AND i.cover=1)
LEFT JOIN `ps_category_lang` cl ON (a.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang` AND cl.id_shop = 1)
LEFT JOIN `ps_stock_available` sav ON (sav.`id_product` = a.`id_product` AND sav.`id_product_attribute` = 0 AND sav.id_shop = 1 )
WHERE 1
GROUP BY a.id_product
ORDER BY a.id_product ASC LIMIT 0,50

Usando MySQL Workbech podemos ver los resultados siguientes:

default query

Lo siguiente que debemos hacer es introducir tres nuevas lineas (fp.`id_feature` = 7):

SELECT SQL_CALC_FOUND_ROWS
a.`id_product`,b.name as name,`reference`,a.price as price,a.active as active
/* new */
, fl.value `feature`
, MAX(i.id_image) id_image,cl.name `name_category` , a.`price`, 0 AS price_final, sav.`quantity` as sav_quantity, a.`active`
FROM `ps_product` a
LEFT JOIN `ps_product_lang` b ON (b.`id_product` = a.`id_product` AND b.`id_lang` = 1 AND b.`id_shop` = 1)
LEFT JOIN `ps_image` i ON (i.`id_product` = a.`id_product` AND i.cover=1)
/* new */
LEFT JOIN `ps_feature_product` fp ON (fp.`id_product` = a.`id_product` AND fp.`id_feature` = 7)
LEFT JOIN `ps_feature_value_lang` fl ON (fp.`id_feature_value` = fl.`id_feature_value` AND b.`id_lang` = fl.`id_lang`)
LEFT JOIN `ps_category_lang` cl ON (a.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang` AND cl.id_shop = 1)
LEFT JOIN `ps_stock_available` sav ON (sav.`id_product` = a.`id_product` AND sav.`id_product_attribute` = 0 AND sav.id_shop = 1 )
WHERE 1
GROUP BY a.id_product
ORDER BY a.id_product ASC LIMIT 0,50

extended query

  1. 1.Definición de columna donde se mostraran los resultados.
  2. 2.Seleccionamos los identificadores de la categoría 7 y exportamos sus valores en el idioma seleccionado por el usuario.
  3. 3.Resultado mostrado.
  • Introducir la query en el PHP de Prestashop: El fichero que controla como se muestra el listado de productos (Catalog > Products) se encuentra en

/prestashop/controllers/admin/AdminProductsController.php

Editamos el fichero para añadir las líneas 164-172 y 233-239 en las que vemos:

/* START: add column to product list: new feature */
/* configuration parameters */
define('_ID_FEATURE', 7);
define('_ID_FEATURE_WIDTH', 'auto');
define('_ID_FEATURE_TITLE', 'Features:');
/* database query */
$this->_join .= ' LEFT JOIN `'._DB_PREFIX_.'feature_product` fp ON (fp.`id_product` = a.`id_product` AND fp.`id_feature` = '._ID_FEATURE.') ';
$this->_join .= ' LEFT JOIN `'._DB_PREFIX_.'feature_value_lang` fl ON (fp.`id_feature_value` = fl.`id_feature_value` AND b.`id_lang` = fl.`id_lang`) ';
/* END: add column to product list: new feature */

En el primer bloque (configuration parameters) introducimos las variables de la característica que queremos mostrar; ID, tamaño de columna y título de la misma. A continuación colocamos las dos queries LEFT JOIN mostradas anteriormente.

/* START: add column to product list: new feature */
$this->fields_list['feature'] = array(
'title' => $this->l(_ID_FEATURE_TITLE),
'width' => _ID_FEATURE_WIDTH,
'filter_key' => 'fl!value',
);
/* END: add column to product list: new feature */

El array fields_list incluye los elementos a mostrar. Añadimos al array las líneas anteriores para que se incluya la información nueva.

Ya podemos ir al back-office de Prestashop y ver el resultado deseado: Catalog > Products

Back-office product list

Podemos ver una nueva columna con el valor que cada producto tiene para la característica seleccionada. Hemos cambiado el código principal de Prestashop así que debemos estar atentos al actualizar el e-commerce ya que estas actualizaciones pueden sobrescribir el fichero y perder estos cambios.

Ficheros: snippets.zip

Saludos.

    Etiquetas: , ,

    7 comentarios

    1. Quentin dice:

      Hi,

      Thanks for this guide.
      Do you know how to show all the features, not just one (with the ID we provide). Separated with “-” for exemple.
      Best regards,
      uentin

    2. varan dice:

      Como comentan arriba, alguna formade mostrar más de una o todas?

        • ES: Siguiendo mis instrucciones se muestra 1 columna. De la misma forma se pueden mostrar otras columnas; solo hay que buscar los campos necesarios de las tablas de la base de datos. Solo recordar que cuantas más columnas añadamos, mas scroll horizontal tendremos (algunas veces molesto).
        • EN: Following my instructions 1 column is shown. Likewise other columns can be displayed; you just have to find the necessary fields of the tables in the database. Just remember that the more columns you add, the more horizontal scroll you have (sometimes annoying).
    3. Atiqah dice:

      Hi,
      I am trying to add a new column to my product catalog for wholesale price. So, I am following your way. The column is added, but when I’m trying to save edited product details, the screen go blank. It seems that my AdminProductsController.php cannot be edited. Is there any other way to add a new column? Thanks for help.

    4. Name *Calvin dice:

      thank you for the tutorial, it still works in 1.6.1.8, however i would like to add more than one features column, yet when i add one more line

      LEFT JOIN `psxs_feature_product` fp ON (fp.`id_product` = a.`id_product` AND fp.`id_feature` = 6)
      LEFT JOIN `psxs_feature_product` fp ON (fp.`id_product` = a.`id_product` AND fp.`id_feature` = 6)

      it will return error not unique table/alias: ‘fp’

      can you help me please?

    Dejar un comentario