Añadir columnas a los listados del backoffice

En este post vamos a contar como añadir columnas extras a tus listados del backoffice a través del hook: actionAdmin <ControllerName> ListingFieldsModifier

En muchas ocasiones tenemos que mostrar columnas personalizadas en los listados que genera Prestashop en su backoffice y además necesitamos que estas columnas se puedan filtrar y exportar, pues bien, el mejor método para hacer esto es utilizar el hook
actionAdmin <ControllerName> ListingFieldsModifier que nos proporciona Prestashop registrado en un módulo.

Como siempre con un ejemplo se ve mejor:

En nuestro módulo lo primero que tenemos que hacer es registrar el hook ListingFieldsModifier correspondiente en su función install:

public function install()
{
    return parent::install() &&
        $this->registerHook('actionAdminCustomersListingFieldsModifier') &&
        $this->registerHook('actionAdminOrdersListingFieldsModifier');
}

Aquí es donde vemos la sintaxis especial de este hook:

El nombre del hook es actionAdmin <ControllerName> ListingFieldsModifier pero debemos sustituir el texto contenido entre <> por el nombre del controlador que corresponda, es decir ControllerName por el nombre del controlador y sobre el que queremos trabajar, en el ejemplo Customers y Orders:

  • actionAdminCustomersListingFieldsModifier, para una modificación sobre el listado de clientes (Customers)
  • actionAdminOrdersListingFieldsModifier, para realizar una modificación sobre el listado de pedidos (Orders)

Una vez registrado el hook, el siguente paso es crear la función que le da la funcionalidad a través de hookActionAdmin <ControllerName> ListingFieldsModifier, en nuestro ejemplo vamos a ver la creada para clientes (Customers):

public function hookActionAdminCustomersListingFieldsModifier($params)
{
    if (!isset($params['fields']['customer_group'])) {
        $params['fields']['customer_group'] = array(
            'title' => 'Grupo',
            "align" => "text-center",
            "class" => "fixed-width-xs",
            "filter_key" => "cg!id_group"
        );
    }
    
    if (isset($params['select'])) {
        $params['select'] .= ", cg.id_group AS customer_group";
    }
    if (isset($params['join'])) {
        $params['join'] .= 'LEFT JOIN `' . _DB_PREFIX_ . 'customer_group` cg ON (a.`id_customer` = cg.`id_customer`)';
    }
}

Para poder trabajar en esta función y añadir nuestras columnas lo primero que necesitamos es conocer como es el contenido del parámetro $params:

array(
  'select' => &(string),
  'join' => &(string),
  'where' => &(string),
  'group_by' => &(string),
  'order_by' => &(string),
  'order_way' => &(string),
  'fields' => &(array)
);

Los campos del parámetro $params son los siguientes:

select : se trata de un string que contiene mediante referencia el contenido del select de la query que genera el listado del controlador padre. Al tratarse de un string podemos concatenar al final del mismo nuestro código a medida, por ejemplo:

$params['select'] .= ", cg.id_group AS customer_group";

En este caso estamos indicando que en el SELECT de la query se muestre el nuevo campo id_group llamado customer_group de la tabla nombrada como cg que será el valor de nuestra nueva columna.

join: se trata de un string que contiene mediante referencia el contenido del join de la query que genera el listado del controlador padre. Al tratarse de un string podemos concatenar al final del mismo nuestro código a medida, por ejemplo:

params['join'] .= 'LEFT JOIN `' . _DB_PREFIX_ . 'customer_group` cg ON (a.`id_customer` = cg.`id_customer`)';

IMPORTANTE: la tabla nombrada como a es la principal donde atacará la consulta, es decir, la tabla que irá en el FROM de la query, en este ejemplo será customers.

En esta caso estamos añadiendo a la query, mediante el método LEFT JOIN, la tabla customer_group renombrada como cg donde coincida el id customer de la tabla a con la tabla cg. En la columna del ejemplo queremos mostrar el grupo al que corresponde el cliente, por lo tanto, tenemos que incluir la tabla customer_group.

Otros parámetros que podemos tratar de la misma manera que los anteriores, ya que son strings referenciados de la query padre, son: where, group_by, order_by, order_way.

fields: Por ultimo también tenemos que indicar la columna o las nuevas columnas que queremos añadir en el parámetro fields. En este caso se trata de un array referenciado del campo fields del controlador padre y lo que tenemos que hacer es añadir un nuevo elemento como array asociativo al array padre. Veamos un ejemplo:

$params['fields']['customer_group'] = array(
    'title' => 'Grupo',
    "align" => "text-center",
    "class" => "fixed-width-xs",
    "filter_key" => "cg!id_group"
);

Lo primero que tenemos que dar es una key única a nuestro array e incluir el mismo como un elemento más del array principal:
$params[‘fields’][‘customer_group’]

El contenido de nuestro array para el campo fields deberá ser el siguiente:

  • title – Nombre que aparecerá en la cabecera del listado y identificará la columna
  • align – Como se mostrará el texto alineado en la celda correspondiente
  • class – Podemos personalizar la clase de la celda
  • filter_key – Identificador del campo en la query. Con el siguiente formato aliasdelatabla!nombredelcampo se utilizará para poder filtrar y ordenar los listados por este campo.

Espero que esta información te sea de utilidad, a continuación facilitamos todo el código utilizado en el ejemplo y un archivo .zip con un módulo con el contenido del mismo:

class Columnas extends Module
{
    public function __construct()
    {
        $this->name = 'columnas';
        $this->tab = 'administration';
        $this->version = '1.0.0';
        $this->author = 'Denda Prest';
        $this->need_instance = 0;

        /**
         * Set $this->bootstrap to true if your module is compliant with bootstrap (PrestaShop 1.6)
         */
        $this->bootstrap = true;

        parent::__construct();

        $this->displayName = $this->l('Columnas Extra');
        $this->description = $this->l('Modificar las Columnas de los listados en el backoficce');

        $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_);
    }

    /**
     * Don't forget to create update methods if needed:
     * http://doc.prestashop.com/display/PS16/Enabling+the+Auto-Update
     */
    public function install()
    {
        return parent::install() &&
            $this->registerHook('actionAdminCustomersListingFieldsModifier') &&
            $this->registerHook('actionAdminOrdersListingFieldsModifier');
    }

    public function uninstall()
    {
        return parent::uninstall();
    }

    public function hookActionAdminOrdersListingFieldsModifier($params)
    {
        if (!isset($params['fields']['tracking_number'])) {
            $params['fields']['tracking_number'] = array(
                'title' => 'N Seguimiento',
                "align" => "text-center",
                "class" => "fixed-width-xs",
                "filter_key" => "oca!tracking_number"
            );
        }

        if (!isset($params['fields']['carrier_name'])) {
            $params['fields']['carrier_name'] = array(
                'title' => 'Transportista',
                "align" => "text-center",
                "class" => "fixed-width-xs",
                "filter_key" => "ca!name"
            );
        }
        
        if (isset($params['select'])) {
            $params['select'] .= ", oca.tracking_number AS tracking_number";
            $params['select'] .= ", ca.name AS carrier_name";
        }

        if (isset($params['join'])) {
            $params['join'] .= 'LEFT JOIN `' . _DB_PREFIX_ . 'order_carrier` oca ON (a.`id_order` = oca.`id_order`)';
            $params['join'] .= 'LEFT JOIN `' . _DB_PREFIX_ . 'carrier` ca ON (ca.`id_carrier` = oca.`id_carrier`)';
        }
    }

    public function hookActionAdminCustomersListingFieldsModifier($params)
    {
        if (!isset($params['fields']['customer_group'])) {
            $params['fields']['customer_group'] = array(
                'title' => 'Grupo',
                "align" => "text-center",
                "class" => "fixed-width-xs",
                "filter_key" => "cg!id_group"
            );
        }
        
        if (isset($params['select'])) {
            $params['select'] .= ", cg.id_group AS customer_group";
        }

        if (isset($params['join'])) {
            $params['join'] .= 'LEFT JOIN `' . _DB_PREFIX_ . 'customer_group` cg ON (a.`id_customer` = cg.`id_customer`)';
        }
    }
}

Con esto y más ¡tu tienda online siempre preparada!

¿Necesitas ayuda más avanzada para solucionar tus problemas?

Contáctanos o echa un vistazo a nuestros servicios, entre los cuales podrás encontrar varios planes de mantenimiento de Prestahop.

Nuestros servicios

Impulsa la venta online y haz crecer tu negocio en poco tiempo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *