🐦 Hummingbird + Bootstrap 5 — PrestaShop 9

Actualizado: 2026-04

#Hummingbird vs Classic

Hummingbird es el nuevo tema por defecto de PrestaShop 9.x. Reemplaza a Classic que se mantiene como tema legacy. Las diferencias fundamentales son:

AspectoClassic (PS 8)Hummingbird (PS 9)
Framework CSSBootstrap 4.0.0-alpha.5Bootstrap 5.3.3
JavaScriptjQuery obligatoriojQuery deprecated, Vanilla JS preferido
Selectores JSClases CSS (.js-product-miniature)data-ps-* attributes
TemplatesSmarty (.tpl)Smarty (.tpl) con soporte futuro Twig
Sistema de gridBreakpoints BS4Breakpoints BS5 (xxl: 1400px)
RTLParcialCompleto (clases logicas start/end)
Dark modeNoSoporte via prefers-color-scheme
CompiladorWebpackWebpack (Node.js 20.19.5)
PHP minimo7.28.1

#Bootstrap 5.3.3 — cambios de clases

El cambio de Bootstrap 4 a 5 afecta masivamente al HTML de tus modulos si inyectan clases CSS en el front. Aqui la tabla completa de migracion:

#Utilidades de spacing

BS4BS5Logica
.ml-1, .ml-2, .ml-3....ms-1, .ms-2, .ms-3...margin-start (izq en LTR, der en RTL)
.mr-1, .mr-2, .mr-3....me-1, .me-2, .me-3...margin-end
.pl-1, .pl-2....ps-1, .ps-2...padding-start
.pr-1, .pr-2....pe-1, .pe-2...padding-end

#Componentes

BS4BS5Notas
.btn-block.d-grid > .btnBoton full-width ya no es clase del btn
.close.btn-closeBoton de cerrar es componente propio
.custom-control .custom-checkbox.form-checkCheckboxes y radios unificados
.custom-switch.form-check .form-switchSwitch es modificador de form-check
.badge-pill.rounded-pillAhora es utilidad de border
.badge-primary.bg-primaryColor de badge via utilidad bg-*
.card-deck.row > .col > .cardUsar grid nativo
.media(eliminado)Reemplazar con d-flex
.float-left.float-startLogico para RTL
.float-right.float-endLogico para RTL
.text-left.text-startLogico para RTL
.text-right.text-endLogico para RTL
.sr-only.visually-hiddenClase de accesibilidad renombrada
.font-weight-bold.fw-boldAbreviatura
.font-italic.fst-italicAbreviatura

#Data attributes

BS4BS5Componente
data-toggledata-bs-toggleTodos (collapse, modal, tab, dropdown)
data-targetdata-bs-targetModal, collapse
data-dismissdata-bs-dismissModal, alert, toast
data-ridedata-bs-rideCarousel
data-slidedata-bs-slideCarousel
data-parentdata-bs-parentAccordion

#JavaScript: jQuery → Vanilla

jQuery sigue disponible en PS 9 pero esta deprecated. Sera eliminado en PS 10. Tu modulo debe migrar progresivamente:

Equivalencias jQuery → Vanilla JS
javascript
// Selectores
$('.mi-clase')                → document.querySelectorAll('.mi-clase')
$('#mi-id')                   → document.getElementById('mi-id')
$('.parent .child')           → document.querySelectorAll('.parent .child')

// Eventos
$(el).on('click', fn)         → el.addEventListener('click', fn)
$(document).ready(fn)         → document.addEventListener('DOMContentLoaded', fn)
$(el).trigger('change')       → el.dispatchEvent(new Event('change'))

// DOM
$(el).addClass('active')      → el.classList.add('active')
$(el).removeClass('active')   → el.classList.remove('active')
$(el).toggleClass('active')   → el.classList.toggle('active')
$(el).hasClass('active')      → el.classList.contains('active')
$(el).attr('data-id')         → el.getAttribute('data-id') o el.dataset.id
$(el).html(content)           → el.innerHTML = content
$(el).text()                  → el.textContent
$(el).val()                   → el.value
$(el).show() / .hide()        → el.style.display = '' / 'none'
$(el).append(html)            → el.insertAdjacentHTML('beforeend', html)

// AJAX
$.ajax({ url, method, data }) → fetch(url, { method, body: data })
$.getJSON(url)                → fetch(url).then(r => r.json())
$.post(url, data)             → fetch(url, { method: 'POST', body: data })

#Convencion data-ps-*

Hummingbird introduce una nueva convencion para selectores JavaScript. En lugar de usar clases CSS (que pueden cambiar con el diseño), se usan atributos data-ps-*:

Usar selectores data-ps-* en tu modulo
javascript
// Seleccionar por referencia
const products = document.querySelectorAll('[data-ps-ref="product-miniature"]');

// Escuchar acciones
document.querySelectorAll('[data-ps-action="add-to-cart"]').forEach(btn => {
    btn.addEventListener('click', handleAddToCart);
});

// Eventos nativos de PrestaShop (siguen funcionando)
prestashop.on('updatedProduct', (event) => {
    console.log('Producto actualizado:', event);
});

#Estructura de archivos Hummingbird

Arbol de directorios
text
themes/hummingbird/
├── config/
│   └── theme.yml            # Identidad del tema, parent: null
├── assets/
│   ├── css/                 # CSS compilado
│   ├── js/                  # JS compilado
│   └── img/                 # Imagenes del tema
├── _dev/                    # Fuentes para compilar
│   ├── css/                 # SCSS sources
│   ├── js/                  # JS modules
│   └── webpack.config.js    # Config de build
├── templates/
│   ├── layouts/             # layout-both-columns.tpl, layout-full-width.tpl
│   ├── _partials/           # header.tpl, footer.tpl, head.tpl
│   ├── catalog/             # product.tpl, listing/
│   ├── checkout/            # cart.tpl, checkout-process.tpl
│   ├── customer/            # my-account.tpl, identity.tpl
│   ├── cms/                 # page.tpl, sitemap.tpl
│   └── errors/              # 404.tpl, maintenance.tpl
└── modules/                 # Overrides de templates de modulos

#Child theme de Hummingbird

config/theme.yml para child theme
yaml
parent: hummingbird
name: mi_tema_custom
display_name: Mi Tema Personalizado
version: 1.0.0
author:
  name: Mi Empresa
  url: https://miempresa.es
assets:
  use_parent_assets: true
  css:
    all:
      - id: custom-theme
        path: assets/css/custom.css
        media: all
        priority: 200

#Adaptar modulos al tema

Detectar tema activo y adaptar clases
php
// En tu modulo, detectar si el tema es Hummingbird
$isHummingbird = ($this->context->shop->theme_name === 'hummingbird');

// Asignar clases CSS segun el tema
$this->context->smarty->assign([
    'btn_class'    => $isHummingbird ? 'btn btn-primary' : 'btn btn-primary btn-block',
    'sr_class'     => $isHummingbird ? 'visually-hidden' : 'sr-only',
    'margin_class' => $isHummingbird ? 'ms-2' : 'ml-2',
]);

// O en la template Smarty:
{if $page.theme_name == 'hummingbird'}
    <div class="d-grid"><button class="btn btn-primary">{l s='Add to Cart'}</button></div>
{else}
    <button class="btn btn-primary btn-block">{l s='Add to Cart'}</button>
{/if}

#Compilar assets — Node.js 20

PS 9.1 requiere Node.js 20.19.5 para compilar los assets del tema Hummingbird:

Compilar assets de Hummingbird
bash
# Instalar dependencias
cd themes/hummingbird/_dev
npm install

# Build de produccion
npm run build

# Watch mode (desarrollo)
npm run watch

# Si usas nvm:
nvm use 20
npm run build
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.