🎨 Gestion de assets en temas PrestaShop

Actualizado: 2024-12-01

PrestaShop gestiona los assets (CSS, JS) a traves de un sistema centralizado que permite combinar y comprimir archivos (CCC). Los temas pueden declarar sus assets en theme.yml y los modulos los registran via hooks o metodos del FrontController.

#Declarar assets en theme.yml

theme.yml — declaracion de assets del tema
yaml
name: mytheme
display_name: My Custom Theme
version: 1.0.0
author:
  name: gmartos.es
  url: https://gmartos.es

meta:
  compatibility:
    from: 8.0.0
    to: ~

global_settings:
  # Assets globales — se cargan en TODAS las paginas
  stylesheets:
    - id: theme-main
      path: assets/css/theme.css
      media: all
      priority: 50
  javascript:
    - id: theme-main
      path: assets/js/theme.js
      position: bottom
      priority: 50

# Assets por pagina (cargados condicionalmente)
page_specific_assets:
  product:
    stylesheets:
      - id: product-page
        path: assets/css/product.css
        priority: 60
    javascript:
      - id: product-page
        path: assets/js/product.js
        position: bottom
  checkout:
    javascript:
      - id: checkout
        path: assets/js/checkout.js
        position: bottom

#Registrar CSS/JS desde un modulo

registerStylesheet y registerJavascript en el FrontController
php
<?php

// Desde un FrontController del modulo
public function setMedia(): bool
{
    parent::setMedia();

    // ── CSS ──
    $this->registerStylesheet(
        'mymodule-main',                           // ID unico
        'modules/mymodule/views/css/front.css',    // path relativo a /themes/mytheme/ o PS root
        [
            'media'    => 'all',   // all, screen, print, ...
            'priority' => 200,
        ]
    );

    // ── JS ──
    $this->registerJavascript(
        'mymodule-main',                           // ID unico
        'modules/mymodule/views/js/front.js',      // path
        [
            'position' => 'bottom',  // head | bottom
            'priority' => 200,
        ]
    );

    // ── DESDE UN HOOK (hookActionFrontControllerSetMedia) ──
    return true;
}

// Desde un hook — para cargar assets desde mymodule.php
public function hookActionFrontControllerSetMedia(): void
{
    // Solo en paginas de producto
    if ($this->context->controller->php_self === 'product') {
        $this->context->controller->registerStylesheet(
            'mymodule-product',
            'modules/' . $this->name . '/views/css/product.css'
        );
    }
}

#Combine Compress Cache (CCC)

CCC (Combine, Compress, Cache) es el sistema de PrestaShop para combinar multiples archivos CSS/JS en uno solo y comprimirlos. Reduce las peticiones HTTP y el peso de las paginas.

Opcion CCCUbicacion en BOEfecto
Combinar CSSRendimiento > CCCUne todos los CSS en un solo archivo
Combinar JSRendimiento > CCCUne todos los JS en un solo archivo
Comprimir CSSRendimiento > CCCMinifica el CSS combinado
Comprimir JSRendimiento > CCCMinifica el JS combinado
Cache de SmartyRendimientoCachea los templates compilados
⚠️
Desactivar CCC durante el desarrollo

Con CCC activo, los cambios en CSS/JS pueden no reflejarse de inmediato. Desactivalo durante el desarrollo y reactivalo en produccion. En produccion, borra la cache desde BO > Rendimiento > Borrar cache.

#Assets condicionales por pagina

Cargar CSS/JS solo en paginas especificas
php
<?php

public function hookActionFrontControllerSetMedia(): void
{
    $controller = $this->context->controller;
    $pageName   = $controller->php_self ?? '';

    // Solo en ficha de producto
    if ($pageName === 'product') {
        $controller->registerStylesheet('mymodule-product', 'modules/mymodule/views/css/product.css');
        $controller->registerJavascript('mymodule-product', 'modules/mymodule/views/js/product.js', ['position'=>'bottom']);
    }

    // Solo en checkout
    if ($pageName === 'order') {
        $controller->registerJavascript('mymodule-checkout', 'modules/mymodule/views/js/checkout.js', ['position'=>'bottom']);
    }

    // Solo en paginas de listado (category, search, etc.)
    if (in_array($pageName, ['category', 'search', 'new-products', 'best-sales'])) {
        $controller->registerStylesheet('mymodule-listing', 'modules/mymodule/views/css/listing.css');
    }
}
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.