🏷️

Tabs en la ficha de producto (Front Office)

Actualizado: 2024-12-01

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

ParametroTipoDescripcion
$params['product']ProductObjeto producto actual
$params['id_product']intID del producto
$params['id_product_attribute']intID de la combinacion activa (0 si no hay)
RetornoarrayArray de objetos ProductExtraContent

#Implementacion basica

Añadir un tab en la ficha de producto
php
<?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

views/templates/front/product_tab.tpl
smarty
{* 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.

Re-inicializar logica al cambiar combinacion
javascript
// 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.

💡
Compatibilidad con temas

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.

Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.