📋

Añadir columnas a listas existentes del Admin

Actualizado: 2024-12-01

El Grid System de PrestaShop expone hooks que permiten a los modulos añadir columnas, filtros y acciones a los grids existentes del core sin modificar ningun archivo del sistema.

#Hooks de modificacion de grids

HookGrid afectado
actionProductGridDefinitionModifierCatalogo > Productos
actionOrderGridDefinitionModifierPedidos > Pedidos
actionCustomerGridDefinitionModifierClientes > Clientes
actionManufacturerGridDefinitionModifierCatalogo > Marcas
actionCategoryGridDefinitionModifierCatalogo > Categorias
actionCarrierGridDefinitionModifierTransporte > Transportistas
actionSupplierGridDefinitionModifierCatalogo > Proveedores
actionProductGridQueryBuilderModifierQuery del grid de Productos
actionOrderGridQueryBuilderModifierQuery del grid de Pedidos

#Añadir columna al grid de Pedidos

Patron completo: columna + query + filtro
php
<?php

use PrestaShop\PrestaShop\Core\Grid\Column\Type\DataColumn;
use PrestaShop\PrestaShop\Core\Grid\Filter\Filter;
use Symfony\Component\Form\Extension\Core\Type\TextType;

public function install(): bool
{
    return parent::install()
        && $this->registerHook('actionOrderGridDefinitionModifier')
        && $this->registerHook('actionOrderGridQueryBuilderModifier');
}

// 1. Añadir columna a la definicion del grid
public function hookActionOrderGridDefinitionModifier(array $params): void
{
    $definition = $params['definition'];

    // Añadir columna de datos
    $definition->getColumns()->addAfter(
        'reference',
        (new DataColumn('mymodule_status'))
            ->setName($this->trans('Estado externo', [], 'Modules.Mymodule.Admin'))
            ->setOptions(['field' => 'mymodule_status'])
    );

    // Añadir filtro para la columna
    $definition->getFilters()->add(
        (new Filter('mymodule_status', TextType::class))
            ->setTypeOptions(['required' => false])
            ->setAssociatedColumn('mymodule_status')
    );
}

// 2. Modificar la query para traer el campo
public function hookActionOrderGridQueryBuilderModifier(array $params): void
{
    /** @var \Doctrine\DBAL\Query\QueryBuilder $qb */
    $qb = $params['search_query_builder'];
    $sf = $params['search_criteria'];

    $qb->addSelect('moe.status AS mymodule_status');
    $qb->leftJoin(
        'o',
        _DB_PREFIX_ . 'mymodule_order_extra',
        'moe',
        'moe.id_order = o.id_order'
    );

    // Aplicar filtro si existe
    foreach ($sf->getFilters() as $field => $value) {
        if ('mymodule_status' === $field && $value !== '') {
            $qb->andWhere('moe.status LIKE :mymodule_status')
               ->setParameter('mymodule_status', '%' . $value . '%');
        }
    }
}

#Columnas con formato especial

Tipos de columna disponibles en el Grid System
php
<?php

use PrestaShop\PrestaShop\Core\Grid\Column\Type\Common\ToggleColumn;     // Switch on/off
use PrestaShop\PrestaShop\Core\Grid\Column\Type\Common\ImageColumn;     // Imagen
use PrestaShop\PrestaShop\Core\Grid\Column\Type\Common\LinkColumn;      // Enlace
use PrestaShop\PrestaShop\Core\Grid\Column\Type\Common\ColorColumn;     // Color
use PrestaShop\PrestaShop\Core\Grid\Column\Type\Common\DateTimeColumn;  // Fecha
use PrestaShop\PrestaShop\Core\Grid\Column\Type\Common\BadgeColumn;     // Badge

// Columna toggle (activo/inactivo)
$definition->getColumns()->addAfter('name',
    (new ToggleColumn('active'))
        ->setName($this->trans('Activo', [], 'Admin.Global'))
        ->setOptions([
            'field'         => 'active',
            'primary_field' => 'id_order',
            'route'         => 'admin_mymodule_toggle_active',
            'route_param_name' => 'id',
        ])
);

// Columna de fecha formateada
$definition->getColumns()->addAfter('status',
    (new DateTimeColumn('date_add'))
        ->setName($this->trans('Fecha', [], 'Admin.Global'))
        ->setOptions(['field' => 'date_add'])
);
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.