🎬 Media class — gestion de assets en front

Actualizado: 2024-12-01

La gestion de assets (CSS y JS) en PrestaShop 1.7+ usa registerStylesheet() y registerJavascript() en los controllers, reemplazando los antiguos addCSS/addJS. Media::addJsDef permite pasar variables PHP a JavaScript.

#registerStylesheet y registerJavascript

Registrar assets desde un modulo
php
<?php

// ── Hook recomendado para registrar assets ──
public function hookActionFrontControllerSetMedia(): void
{
    // ── CSS ──
    $this->context->controller->registerStylesheet(
        'mymodule-style',                                    // ID unico
        'modules/' . $this->name . '/views/css/front.css',   // Path relativo
        [
            'media'    => 'all',        // all, screen, print
            'priority' => 150,          // Orden de carga (default 50)
            'server'   => 'local',      // local o remote
        ]
    );

    // CSS remoto (CDN)
    $this->context->controller->registerStylesheet(
        'mymodule-font-awesome',
        'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css',
        ['server' => 'remote', 'priority' => 10]
    );

    // ── JavaScript ──
    $this->context->controller->registerJavascript(
        'mymodule-front',
        'modules/' . $this->name . '/views/js/front.js',
        [
            'position'  => 'bottom',    // head o bottom
            'priority'  => 150,
            'attribute' => 'defer',     // defer, async, o vacio
        ]
    );

    // ── Quitar un asset registrado por otro modulo/tema ──
    $this->context->controller->unregisterJavascript('some-other-script-id');
    $this->context->controller->unregisterStylesheet('some-other-style-id');
}

#Media::addJsDef

Pasar variables PHP a JavaScript
php
<?php

// ── Desde un hook o controller ──
public function hookActionFrontControllerSetMedia(): void
{
    // Pasar variables al scope global de JS
    Media::addJsDef([
        'myModuleAjaxUrl' => $this->context->link->getModuleLink(
            $this->name, 'ajax', [], true
        ),
        'myModuleToken'   => Tools::getToken(false),
        'myModuleConfig'  => [
            'animationSpeed' => 300,
            'autoplay'       => true,
            'lang'           => $this->context->language->iso_code,
        ],
    ]);
}

// ── En el JavaScript del front ──
// Las variables estan disponibles globalmente:
// myModuleAjaxUrl → "https://tutienda.com/module/mymodule/ajax"
// myModuleToken   → "a1b2c3d4"
// myModuleConfig  → {animationSpeed: 300, autoplay: true, lang: "es"}

// Ejemplo de uso en JS:
fetch(myModuleAjaxUrl, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({
        token: myModuleToken,
        action: 'getProducts'
    })
}).then(r => r.json()).then(data => {
    console.log(data);
});

// ── IMPORTANTE: las variables se renderizan como ──
// <script>var myModuleAjaxUrl = "..."; var myModuleConfig = {...};</script>
// Por lo que nombres demasiado genericos pueden colisionar

#Condicional por pagina

Cargar assets solo en paginas especificas
php
<?php

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

    // Solo en pagina de producto
    if ($page === 'product') {
        $controller->registerJavascript(
            'mymodule-product',
            'modules/' . $this->name . '/views/js/product.js',
            ['position' => 'bottom']
        );
    }

    // Solo en checkout (order)
    if ($page === 'order' || $page === 'cart') {
        $controller->registerStylesheet(
            'mymodule-checkout',
            'modules/' . $this->name . '/views/css/checkout.css'
        );
    }

    // Solo en categoria
    if ($page === 'category') {
        $controller->registerJavascript(
            'mymodule-category-filter',
            'modules/' . $this->name . '/views/js/filter.js',
            ['position' => 'bottom', 'attribute' => 'defer']
        );
    }

    // En TODAS las paginas excepto checkout
    if ($page !== 'order') {
        $controller->registerJavascript(
            'mymodule-global',
            'modules/' . $this->name . '/views/js/global.js',
            ['position' => 'bottom']
        );
    }
}

#Inline CSS y JS critico

Assets inline para rendimiento
php
<?php

// ── CSS inline critico ──
$this->context->controller->registerStylesheet(
    'mymodule-critical',
    'modules/' . $this->name . '/views/css/critical.css',
    [
        'inline'   => true,    // Incluye el CSS directamente en el HTML
        'priority' => 1,       // Muy alta prioridad
    ]
);

// ── JS inline ──
$this->context->controller->registerJavascript(
    'mymodule-config-inline',
    'modules/' . $this->name . '/views/js/config.js',
    [
        'inline'   => true,
        'position' => 'head',
        'priority' => 1,
    ]
);

// ── Alternativa: inyectar HTML directo en <head> ──
public function hookDisplayHeader(): string
{
    $cssVars = ':root { --mymodule-primary: '
        . Configuration::get('MYMODULE_COLOR') . '; }';

    return '<style>' . $cssVars . '</style>';
}
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.