🐦 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:
| Aspecto | Classic (PS 8) | Hummingbird (PS 9) |
|---|---|---|
| Framework CSS | Bootstrap 4.0.0-alpha.5 | Bootstrap 5.3.3 |
| JavaScript | jQuery obligatorio | jQuery deprecated, Vanilla JS preferido |
| Selectores JS | Clases CSS (.js-product-miniature) | data-ps-* attributes |
| Templates | Smarty (.tpl) | Smarty (.tpl) con soporte futuro Twig |
| Sistema de grid | Breakpoints BS4 | Breakpoints BS5 (xxl: 1400px) |
| RTL | Parcial | Completo (clases logicas start/end) |
| Dark mode | No | Soporte via prefers-color-scheme |
| Compilador | Webpack | Webpack (Node.js 20.19.5) |
| PHP minimo | 7.2 | 8.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
| BS4 | BS5 | Logica |
|---|---|---|
| .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
| BS4 | BS5 | Notas |
|---|---|---|
| .btn-block | .d-grid > .btn | Boton full-width ya no es clase del btn |
| .close | .btn-close | Boton de cerrar es componente propio |
| .custom-control .custom-checkbox | .form-check | Checkboxes y radios unificados |
| .custom-switch | .form-check .form-switch | Switch es modificador de form-check |
| .badge-pill | .rounded-pill | Ahora es utilidad de border |
| .badge-primary | .bg-primary | Color de badge via utilidad bg-* |
| .card-deck | .row > .col > .card | Usar grid nativo |
| .media | (eliminado) | Reemplazar con d-flex |
| .float-left | .float-start | Logico para RTL |
| .float-right | .float-end | Logico para RTL |
| .text-left | .text-start | Logico para RTL |
| .text-right | .text-end | Logico para RTL |
| .sr-only | .visually-hidden | Clase de accesibilidad renombrada |
| .font-weight-bold | .fw-bold | Abreviatura |
| .font-italic | .fst-italic | Abreviatura |
#Data attributes
| BS4 | BS5 | Componente |
|---|---|---|
| data-toggle | data-bs-toggle | Todos (collapse, modal, tab, dropdown) |
| data-target | data-bs-target | Modal, collapse |
| data-dismiss | data-bs-dismiss | Modal, alert, toast |
| data-ride | data-bs-ride | Carousel |
| data-slide | data-bs-slide | Carousel |
| data-parent | data-bs-parent | Accordion |
#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.