PrestaShop Smarty vs Twig: Qué cambia en las plantillas
La transición del motor de plantillas en PrestaShop
PrestaShop está pasando por uno de los cambios arquitectónicos más significativos de su historia reciente — la migración de Smarty a Twig como su motor de plantillas principal. Esta transición, que comenzó con PrestaShop 1.7 y alcanzó un hito importante con PrestaShop 9.0 (lanzado en junio de 2025), afecta a cada desarrollador, diseñador de temas y creador de módulos que trabaja con la plataforma.
Entender este cambio es esencial ya sea que mantengas una tienda existente, planees una actualización o desarrolles nuevos módulos y temas. Esta guía cubre qué ha cambiado, qué está cambiando todavía y cómo preparar tus proyectos PrestaShop para la era Twig.
Qué son Smarty y Twig
Smarty - El motor legacy
Smarty es un motor de plantillas PHP que ha impulsado PrestaShop desde sus inicios. Separa la lógica de negocio PHP de la presentación HTML.
Características principales de Smarty -
- Los archivos de plantilla usan la extensión
.tpl - Las variables se acceden con llaves y signo de dólar -
{$variable} - Los modificadores usan sintaxis pipe -
{$variable|escape:'html'} - Los bloques usan etiquetas emparejadas -
{block name='content'}{/block} - Herencia de plantillas mediante
{extends file='parent.tpl'}
Twig - El motor moderno
Twig es el motor de plantillas construido por SensioLabs, la misma empresa detrás del framework Symfony. Dado que PrestaShop ha adoptado progresivamente componentes de Symfony, moverse a Twig es una alineación natural.
Características principales de Twig -
- Los archivos de plantilla usan la extensión
.html.twig - Las variables usan dobles llaves -
{{ variable }} - Los filtros usan sintaxis pipe -
{{ variable|escape('html') }} - Los bloques usan etiquetas emparejadas -
{% block content %}{% endblock %} - Herencia de plantillas mediante
{% extends 'parent.html.twig' %}
Comparación de sintaxis - Lado a lado
Mostrar variables
| Función | Smarty | Twig |
|---|---|---|
| Variable simple | {$product.name} | {{ product.name }} |
| Acceso a array | {$products[0].name} | {{ products[0].name }} |
| Método de objeto | {$product->getName()} | {{ product.getName() }} |
| Valor por defecto | {$var|default:'N/A'} | {{ var|default('N/A') }} |
Estructuras de control
<!-- Smarty: if/else -->
{if $product.active}
<span class="badge badge-success">Activo</span>
{elseif $product.pending}
<span class="badge badge-warning">Pendiente</span>
{else}
<span class="badge badge-danger">Inactivo</span>
{/if}
<!-- Twig: if/else -->
{% if product.active %}
<span class="badge badge-success">Activo</span>
{% elseif product.pending %}
<span class="badge badge-warning">Pendiente</span>
{% else %}
<span class="badge badge-danger">Inactivo</span>
{% endif %}Bucles
<!-- Smarty: bucle foreach -->
{foreach $products as $product}
<div class="product">
<h3>{$product.name}</h3>
<p>{$product.price|number_format:2:',':'.'}</p>
</div>
{foreachelse}
<p>No se encontraron productos.</p>
{/foreach}
<!-- Twig: bucle for -->
{% for product in products %}
<div class="product">
<h3>{{ product.name }}</h3>
<p>{{ product.price|number_format(2, ',', '.') }}</p>
</div>
{% else %}
<p>No se encontraron productos.</p>
{% endfor %}Qué ha cambiado ya - La cronología
PrestaShop 1.7 (2016)
Comenzó la migración. El back office empezó a adoptar controladores Symfony con plantillas Twig. El front office permaneció completamente basado en Smarty.
PrestaShop 8.x (2022-2024)
Más páginas del back office fueron migradas a Symfony y Twig.
PrestaShop 9.0 (junio 2025)
Hito importante. El back office está ahora completamente migrado a controladores Symfony y plantillas Twig. Sin embargo, Smarty sigue presente porque -
- El front office (temas) aún usa principalmente Smarty
- Muchos módulos de terceros aún usan plantillas Smarty
- Las páginas admin de módulos con AdminControllers legacy aún dependen de Smarty
Impacto en los propietarios de tiendas
Si usas PrestaShop 1.7 o 8.x
Nada cambia inmediatamente. Tus temas y módulos actuales seguirán funcionando. Planifica la eventual actualización a PrestaShop 9.0.
Si estás actualizando a PrestaShop 9.0
El impacto más significativo es en los módulos que modifican páginas del back office. Verifica la compatibilidad con los desarrolladores de módulos antes de actualizar.
Impacto en los desarrolladores de módulos
Para compatibilidad con PrestaShop 8.x (enfoque legacy) -
class AdminMyModuleController extends ModuleAdminController
{
public function renderList()
{
$this->context->smarty->assign([
'my_data' => $this->getMyData(),
]);
return $this->display(__FILE__, 'views/templates/admin/list.tpl');
}
}Para PrestaShop 9.0+ (enfoque moderno) -
class MyModuleAdminController extends FrameworkBundleAdminController
{
public function listAction(): Response
{
return $this->render('@Modules/mymodule/views/templates/admin/list.html.twig', [
'my_data' => $this->getMyData(),
]);
}
}Soportar múltiples versiones de PrestaShop
if (version_compare(_PS_VERSION_, '9.0.0', '>=')) {
return $this->render('@Modules/mymodule/admin/config.html.twig', $params);
} else {
$this->context->smarty->assign($params);
return $this->display($this->file, 'views/templates/admin/config.tpl');
}Ventajas de Twig sobre Smarty
Mejor seguridad
Twig escapa automáticamente la salida por defecto, reduciendo significativamente los riesgos de XSS.
<!-- Twig: escapado automáticamente por defecto -->
{{ user_input }} <!-- Entidades HTML escapadas automáticamente -->
{{ trusted_html|raw }} <!-- Explícitamente marcado como seguro -->
<!-- Smarty: escapado manual necesario -->
{$user_input|escape:'html'} <!-- Debes recordar escapar -->
{$user_input} <!-- PELIGROSO: sin escapado -->Integración con Symfony
Twig se integra nativamente con el enrutamiento, renderizado de formularios, sistema de traducción y componentes de seguridad de Symfony.
Mejores mensajes de error
Twig proporciona mensajes de error claros con números de línea exactos.
Patrones de migración comunes
Traducir cadenas
<!-- Smarty -->
{l s='Añadir al carrito' mod='mymodule'}
<!-- Twig -->
{{ 'Añadir al carrito'|trans({}, 'Modules.Mymodule.Shop') }}Renderizado de hooks
<!-- Smarty -->
{hook h='displayProductButtons'}
<!-- Twig -->
{{ renderhook('displayProductButtons') }}Sobrescrituras de plantillas del back office en PrestaShop 9
modules/mymodule/views/PrestaShop/Admin/Product/CatalogPage/catalog.html.twig{% extends '@PrestaShopCore/Admin/Product/CatalogPage/catalog.html.twig' %}
{% block product_catalog_tools %}
{{ parent() }}
<div class="my-custom-toolbar">
<!-- Contenido adicional de la barra de herramientas -->
</div>
{% endblock %}Consejos prácticos para propietarios de tiendas
No entres en pánico
La migración es gradual. Smarty no será eliminado de la noche a la mañana.
Verifica la compatibilidad de módulos antes de actualizar
Antes de actualizar a PrestaShop 9.0, verifica que cada módulo sea compatible.
Considera ayuda profesional para tiendas complejas
Con personalizaciones extensas, contrata un desarrollador PrestaShop experimentado en Smarty y Twig.
Prueba todo en un entorno de staging
Nunca actualices tu tienda en producción directamente.
¿Le resultó útil esta respuesta?
¿Aún tiene preguntas?
Can't find what you're looking for? Send us your question and we'll get back to you quickly.