Añade un campo a la ficha de producto con actionPresentProduct
Gustavo compartió en el grupo cómo mostrar la ubicación del producto en la ficha usando el hook actionPresentProduct, con dos líneas en el módulo y un bloque en la plantilla. Lo explicamos paso a paso y añadimos el fallo típico al registrar un hook propio.
Necesitas enseñar en la ficha de producto un dato que PrestaShop no muestra, por ejemplo la ubicación del almacén. Gustavo, de la comunidad, lo resolvió para un cliente en agosto de 2023 con el hook actionPresentProduct: el módulo añade el dato al producto antes de que llegue a la plantilla y la plantilla lo pinta. Sin overrides. Funciona desde PrestaShop 1.7.8.
Qué hace actionPresentProduct
Antes de mostrar un producto, PrestaShop lo prepara en un formato para la plantilla, el producto «presentado». Este hook se ejecuta en ese momento y le pasa al módulo ese producto. Lo que añadas ahí aparece en Smarty como cualquier otro dato de $product.
El código
En el módulo
Registra el hook al instalar:
public function install()
{
return parent::install()
&& $this->registerHook('actionPresentProduct');
}Y añade el dato. En el ejemplo de Gustavo, con un valor fijo para probar:
public function hookActionPresentProduct($params)
{
$params['presentedProduct']['ubicacion'] = 'XXXXXXXXX';
}En un módulo real, ahí lees el dato que necesites (de la combinación, de una tabla propia) a partir del identificador del producto.
De dónde sale el dato
En el caso de Gustavo, el cliente quería ver en la ficha el campo de ubicación que PrestaShop guarda en el producto y en cada combinación, y que de serie solo se ve en el back-office. Dentro del hook tienes los identificadores en $params['presentedProduct']['id_product'] y $params['presentedProduct']['id_product_attribute']: con ellos lees la ubicación de la combinación elegida y, si está vacía, la del producto. En los listados de categoría y búsqueda PrestaShop usa otro hook, actionPresentProductListing; si también quieres el dato ahí, engánchate a los dos y que la consulta sea ligera, porque se ejecuta para cada producto.
En la plantilla
En la plantilla de la ficha de tu tema hijo, donde quieras que salga:
{if isset($product.ubicacion)}
<div class="product-reference">
<label class="label">{l s='Ubicación' d='Shop.Theme.Catalog'} </label>
<span>{$product.ubicacion}</span>
</div>
{/if}El isset evita avisos en las fichas en las que el módulo no añade nada, y reutilizar la clase product-reference hace que el dato tenga el mismo aspecto que la referencia.
Versiones
Gustavo lo dejó claro: solo para 1.7.8.x o superior. En versiones anteriores toca modificar plantillas y engancharse a otros hooks de visualización, y él mismo comentaba lo complicado que era comparado con esto. Si tienes una tienda 1.7 anterior a la 1.7.8, es una razón más para actualizar.
Y si lo que necesitas es tu propio hook
En el mismo grupo, otro compañero quería crear un hook propio para colocarlo en la página de confirmación del pedido, y no se ejecutaba. Su error, que él mismo encontró: registraba el hook con el prefijo hook delante del nombre. El nombre se registra sin el prefijo; el prefijo solo va en el método:
// Al instalar
$this->registerHook('displayRangoPrecios');
// En la clase del módulo
public function hookDisplayRangoPrecios($params)
{
// lo que devuelvas aquí se pinta donde pongas el hook
}Y en la plantilla, donde quieras que aparezca:
{hook h='displayRangoPrecios'}Gustavo recordaba que se podía indicar también el módulo, para que solo se ejecute el tuyo; el parámetro es mod: {hook h='displayRangoPrecios' mod='mimodulo'}. Usa el prefijo display para los hooks que pintan algo y action para los que solo ejecutan lógica. Pruébalo antes en una copia de la tienda.
Si necesitas guardar y enseñar datos propios por producto o combinación sin programar, el módulo de campos extra de Rekire lo hace desde el back-office.
Esto salió en @PrestashopEsp, la mayor comunidad PrestaShop de España en Telegram. Ver la conversación