📤 Asignacion de variables Smarty en modulos

Actualizado: 2024-12-01

Smarty es el motor de plantillas del Front Office de PrestaShop. Los modulos asignan variables PHP a los templates con $this->context->smarty->assign() y luego renderizan con $this->display() o $this->fetch().

#assign() y assignArray()

Asignar variables individuales y en bloque
php
<?php

// ── VARIABLE INDIVIDUAL ──
$this->context->smarty->assign('product_name', $product->name[$idLang]);
$this->context->smarty->assign('price', Tools::displayPrice($product->price));
$this->context->smarty->assign('is_logged', $this->context->customer->isLogged());

// ── MULTIPLE EN ARRAY (recomendado — una sola llamada) ──
$this->context->smarty->assign([
    'product'       => $product,
    'product_name'  => $product->name[$idLang],
    'category'      => $category,
    'items'         => $this->getModuleItems(),
    'module_dir'    => $this->_path,
    'module_name'   => $this->name,
    'ajax_url'      => $this->context->link->getModuleLink($this->name, 'ajax'),
    'token'         => Tools::getToken(false),
]);

// ── assignArray (equivalente a assign con array) ──
$this->context->smarty->assignArray([
    'var1' => 'valor1',
    'var2' => 'valor2',
]);

#Variables disponibles globalmente

Variable SmartyDescripcionEjemplo de uso
{$cart}Carrito actual{$cart.products|count} productos
{$customer}Cliente logueado{$customer.firstname}
{$currency}Moneda activa{$currency.sign}
{$language}Idioma activo{$language.iso_code}
{$shop}Datos de la tienda{$shop.name}
{$urls}URLs del sitio{$urls.base_url}
{$page}Datos de la pagina actual{$page.meta.title}
{$link}Objeto Link{$link->getProductLink(42)}
{$static_token}Token de sesionPara formularios
{$breadcrumb}Miga de pan{foreach $breadcrumb.links as $b}

#Renderizar templates desde el modulo

fetch() vs display() — renderizar templates Smarty
php
<?php

// ── DESDE UN FRONTCONTROLLER ──

// $this->display() muestra el template directamente (output buffer)
// La ruta se define en $this->template
$this->template = 'module:mymodule/views/templates/front/mypage.tpl';
// (initContent() la usa automaticamente)

// ── DESDE UN HOOK DE DISPLAY ──

// $this->fetch() devuelve el HTML como string (para return en hooks)
$html = $this->fetch('module:mymodule/views/templates/front/block.tpl');
return $html;

// Alternativa con ruta absoluta
$html = $this->context->smarty->fetch(
    _PS_MODULE_DIR_ . 'mymodule/views/templates/front/block.tpl'
);

// ── PATHS VALIDOS ──
// module:mymodule/views/templates/front/page.tpl  (recomendado)
// module:mymodule/views/templates/hook/nav.tpl
// Absoluto: _PS_MODULE_DIR_ . 'mymodule/views/templates/front/page.tpl'

#Escape de HTML — seguridad

Escape correcto en templates Smarty — evitar XSS
smarty
{* CORRECTO: escapar variables de usuario *}
<h1>{$product_name|escape:'html'}</h1>
<p>{$description|escape:'html'}</p>

{* INCORRECTO: sin escape (vulnerable a XSS) *}
{* <h1>{$user_input}</h1> *}

{* HTML seguro — solo cuando el contenido viene del BO y ya esta saneado *}
<div class="description">{$html_description nofilter}</div>

{* URLs — usar escape:'htmlall' para atributos href *}
<a href="{$url|escape:'htmlall'}">{$title|escape:'html'}</a>

{* Para JavaScript — escape JSON *}
<script>
  var data = {$items|json_encode|escape:'javascript'};
</script>

{* Forma mas segura de pasar datos a JS *}
<script>
  var MyModule = {literal}{{/literal}
    ajaxUrl: '{$ajax_url|escape:"javascript"}',
    token: '{$token|escape:"javascript"}'
  {literal}}{/literal};
</script>

#Variables en hooks (display hooks)

Asignar y renderizar en hooks de display
php
<?php

/**
 * Hook de display: asignar variables y devolver HTML del template.
 * $params contiene datos contextuales del hook.
 */
public function hookDisplayProductAdditionalInfo(array $params): string
{
    $product   = $params['product'];  // objeto o array segun el hook
    $productId = (int) ($product['id'] ?? $product->id ?? 0);

    // Comprobar si hay datos que mostrar
    $data = $this->getProductData($productId);
    if (empty($data)) {
        return ''; // No mostrar nada si no hay datos
    }

    $this->context->smarty->assign([
        'mymodule_data'   => $data,
        'mymodule_url'    => $this->context->link->getModuleLink($this->name, 'detail', ['id' => $productId]),
        'mymodule_token'  => Tools::getToken(false),
    ]);

    return $this->fetch('module:' . $this->name . '/views/templates/hook/product-info.tpl');
}
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.