Tabs en la ficha de producto (Front Office)
El hook displayProductExtraContent permite a los modulos añadir tabs adicionales junto a 'Descripcion' y 'Detalles del producto' en la pagina de producto del Front Office. El hook devuelve objetos ProductExtraContent que el tema renderiza automaticamente.
#El hook displayProductExtraContent
| Parametro | Tipo | Descripcion |
|---|---|---|
| $params['product'] | Product | Objeto producto actual |
| $params['id_product'] | int | ID del producto |
| $params['id_product_attribute'] | int | ID de la combinacion activa (0 si no hay) |
| Retorno | array | Array de objetos ProductExtraContent |
#Implementacion basica
<?php
use PrestaShop\PrestaShop\Core\Product\ProductExtraContent;
public function install(): bool
{
return parent::install()
&& $this->registerHook('displayProductExtraContent');
}
/**
* Devuelve un array de tabs para la pagina de producto.
* Cada ProductExtraContent se convierte en un tab.
*/
public function hookDisplayProductExtraContent(array $params): array
{
$product = $params['product'];
$tabs = [];
// Solo mostrar si hay contenido relevante para este producto
$extraData = $this->getProductExtraData((int) $product->id);
if (empty($extraData)) {
return []; // No mostrar el tab si no hay contenido
}
// Asignar datos a Smarty
$this->context->smarty->assign([
'extra_data' => $extraData,
'product_id' => (int) $product->id,
'module_path' => $this->_path,
]);
// Renderizar la plantilla
$content = $this->fetch('module:mymodule/views/templates/front/product_tab.tpl');
// Crear el tab
$tabs[] = (new ProductExtraContent())
->setTitle($this->trans('Informacion adicional', [], 'Modules.Mymodule.Shop'))
->setContent($content)
->setAttr([
'id' => 'mymodule-extra-tab',
'class' => 'mymodule-tab',
]);
return $tabs;
}
private function getProductExtraData(int $productId): array
{
$result = Db::getInstance()->getRow(
'SELECT * FROM `' . _DB_PREFIX_ . 'mymodule_product_data`
WHERE `id_product` = ' . $productId
);
return $result ?: [];
}
#Plantilla Smarty para el contenido
{* Tab de informacion extra del modulo mymodule *}
<div class="mymodule-extra-content">
{if isset($extra_data.title) && $extra_data.title}
<h4>{$extra_data.title|escape:'html'}</h4>
{/if}
{if isset($extra_data.description)}
<div class="extra-description">
{$extra_data.description|nl2br}
</div>
{/if}
{if isset($extra_data.features)}
<ul class="extra-features">
{foreach $extra_data.features as $feature}
<li>{$feature|escape:'html'}</li>
{/foreach}
</ul>
{/if}
</div>
#AJAX: evitar problemas con combinaciones
Cuando el usuario cambia una combinacion (color, talla), PrestaShop reemplaza parte del DOM via AJAX. Si tu tab tiene JS o logica de inicializacion, debes re-ejecutarla al cambio de combinacion.
// views/js/front-product-tab.js
(function () {
'use strict';
function initMyModuleTab() {
var tab = document.getElementById('mymodule-extra-tab');
if (!tab) return;
// Tu logica de inicializacion aqui
// e.g. lazy-load imagenes, activar sliders, etc.
console.log('MyModule tab inicializado');
}
// Inicializacion inicial
document.addEventListener('DOMContentLoaded', initMyModuleTab);
// Re-inicializar cuando cambia la combinacion (OBLIGATORIO)
if (typeof prestashop !== 'undefined') {
prestashop.on('updatedProduct', function (event) {
initMyModuleTab();
});
}
}());
#Orden de los tabs
El orden de los tabs se controla desde Diseno > Posiciones en el BO. Busca el hook displayProductExtraContent y arrastra tu modulo a la posicion deseada. Los tabs 'Descripcion' y 'Detalles del producto' son del core y no aparecen en Posiciones.
La mayoria de temas modernos (Classic, Hummingbird) renderizan los ProductExtraContent como tabs. Algunos temas personalizados los pueden renderizar como acordeones o secciones. El contenido debe ser responsive por si el tema cambia la presentacion.