PrestaShop Smarty vs Twig: Was sich bei Templates ändert

386 Aufrufe

Der Template-Engine-Übergang in PrestaShop

PrestaShop durchläuft eine der bedeutendsten architektonischen Veränderungen seiner jüngeren Geschichte — die Migration von Smarty zu Twig als primärer Template-Engine. Dieser Übergang, der mit PrestaShop 1.7 begann und mit PrestaShop 9.0 (veröffentlicht Juni 2025) einen wichtigen Meilenstein erreichte, betrifft jeden Entwickler, Theme-Designer und Modulersteller, der mit der Plattform arbeitet.

Das Verständnis dieser Änderung ist essenziell, egal ob Sie einen bestehenden Shop pflegen, ein Upgrade planen oder neue Module und Themes entwickeln. Dieser Leitfaden behandelt, was sich geändert hat, was sich noch ändert und wie Sie Ihre PrestaShop-Projekte auf die Twig-Ära vorbereiten.

Was sind Smarty und Twig?

Smarty - Die Legacy-Engine

Smarty ist eine PHP-Template-Engine, die PrestaShop seit seinen Anfängen betreibt. Sie trennt PHP-Geschäftslogik von der HTML-Präsentation und ermöglicht es Designern, Template-Dateien (.tpl) ohne tiefe PHP-Kenntnisse zu erstellen.

Hauptmerkmale von Smarty -

  • Template-Dateien verwenden die Erweiterung .tpl
  • Variablen werden mit geschweiften Klammern und Dollarzeichen angesprochen - {$variable}
  • Modifikatoren verwenden Pipe-Syntax - {$variable|escape:'html'}
  • Blöcke verwenden gepaarte Tags - {block name='content'}{/block}
  • Template-Vererbung durch {extends file='parent.tpl'}

Twig - Die moderne Engine

Twig ist die Template-Engine von SensioLabs, dem Unternehmen hinter dem Symfony-Framework. Da PrestaShop schrittweise Symfony-Komponenten übernommen hat, ist der Wechsel zu Twig eine natürliche Angleichung.

Hauptmerkmale von Twig -

  • Template-Dateien verwenden die Erweiterung .html.twig
  • Variablen verwenden doppelte geschweifte Klammern - {{ variable }}
  • Filter verwenden Pipe-Syntax - {{ variable|escape('html') }}
  • Blöcke verwenden gepaarte Tags - {% block content %}{% endblock %}
  • Template-Vererbung durch {% extends 'parent.html.twig' %}

Syntaxvergleich - Seite an Seite

Variablen ausgeben

FunktionSmartyTwig
Einfache Variable{$product.name}{{ product.name }}
Array-Zugriff{$products[0].name}{{ products[0].name }}
Objektmethode{$product->getName()}{{ product.getName() }}
Standardwert{$var|default:'N/A'}{{ var|default('N/A') }}

Kontrollstrukturen

<!-- Smarty: if/else -->
{if $product.active}
  <span class="badge badge-success">Aktiv</span>
{elseif $product.pending}
  <span class="badge badge-warning">Ausstehend</span>
{else}
  <span class="badge badge-danger">Inaktiv</span>
{/if}

<!-- Twig: if/else -->
{% if product.active %}
  <span class="badge badge-success">Aktiv</span>
{% elseif product.pending %}
  <span class="badge badge-warning">Ausstehend</span>
{% else %}
  <span class="badge badge-danger">Inaktiv</span>
{% endif %}

Schleifen

<!-- Smarty: foreach-Schleife -->
{foreach $products as $product}
  <div class="product">
    <h3>{$product.name}</h3>
    <p>{$product.price|number_format:2:',':'.'}</p>
  </div>
{foreachelse}
  <p>Keine Produkte gefunden.</p>
{/foreach}

<!-- Twig: for-Schleife -->
{% for product in products %}
  <div class="product">
    <h3>{{ product.name }}</h3>
    <p>{{ product.price|number_format(2, ',', '.') }}</p>
  </div>
{% else %}
  <p>Keine Produkte gefunden.</p>
{% endfor %}

Template-Vererbung

<!-- Smarty: Kind-Template -->
{extends file='parent.tpl'}
{block name='content'}
  <h1>{$page_title}</h1>
  {$HOOK_PRODUCT_FOOTER}
{/block}

<!-- Twig: Kind-Template -->
{% extends 'parent.html.twig' %}
{% block content %}
  <h1>{{ page_title }}</h1>
  {{ renderhooksarray('displayProductFooter') }}
{% endblock %}

Was hat sich bereits geändert - Die Zeitleiste

PrestaShop 1.7 (2016)

Die Migration begann. Das Back Office übernahm Symfony-Controller für neue Seiten mit Twig-Templates. Legacy-Seiten verwendeten weiterhin Smarty. Das Front Office blieb vollständig Smarty-basiert.

PrestaShop 8.x (2022-2024)

Mehr Back-Office-Seiten wurden zu Symfony und Twig migriert. Wichtige Admin-Seiten wie Produkte, Bestellungen und Kunden erhielten Twig-basierte Neuschreibungen.

PrestaShop 9.0 (Juni 2025)

Ein wichtiger Meilenstein. Das Back Office ist jetzt vollständig zu Symfony-Controllern und Twig-Templates migriert. Smarty ist jedoch noch vorhanden, da -

  • Das Front Office (Themes) primär noch Smarty verwendet
  • Viele Drittanbieter-Module noch Smarty-Templates für ihre Frontend-Ausgabe nutzen
  • Modul-Admin-Seiten mit Legacy-AdminControllern noch auf Smarty basieren

Auswirkungen auf Shopbetreiber

Wenn Sie PrestaShop 1.7 oder 8.x betreiben

Nichts ändert sich sofort. Ihre aktuellen Themes und Module funktionieren weiterhin wie gewohnt. Planen Sie jedoch das eventuelle Upgrade auf PrestaShop 9.0 und darüber hinaus.

Wenn Sie auf PrestaShop 9.0 upgraden

Die größte Auswirkung betrifft Module, die Back-Office-Seiten modifizieren. Module, die Smarty-basierte Admin-Templates verwenden, benötigen möglicherweise Updates. Überprüfen Sie die Kompatibilität bei Ihren Modulentwicklern vor dem Upgrade.

Auf lange Sicht

Die Richtung ist klar - PrestaShop wird schließlich vollständig zu Twig wechseln, sowohl für Front als auch Back Office. Wenn Sie in ein neues individuelles Theme investieren, arbeiten Sie mit einem Entwickler, der sowohl Smarty als auch Twig versteht.

Auswirkungen auf Modulentwickler

Back-Office-Modul-Templates

Für PrestaShop 8.x Kompatibilität (Legacy-Ansatz) -

// Legacy AdminController mit Smarty
class AdminMyModuleController extends ModuleAdminController
{
    public function renderList()
    {
        $this->context->smarty->assign([
            'my_data' => $this->getMyData(),
        ]);
        return $this->display(__FILE__, 'views/templates/admin/list.tpl');
    }
}

Für PrestaShop 9.0+ (moderner Ansatz) -

// Symfony Controller mit Twig
class MyModuleAdminController extends FrameworkBundleAdminController
{
    public function listAction(): Response
    {
        return $this->render('@Modules/mymodule/views/templates/admin/list.html.twig', [
            'my_data' => $this->getMyData(),
        ]);
    }
}

Mehrere PrestaShop-Versionen unterstützen

// Erkennen, welche Template-Engine verwendet werden soll
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');
}

Vorteile von Twig gegenüber Smarty

Bessere Sicherheit

Twig maskiert Ausgaben standardmäßig automatisch und reduziert so das XSS-Risiko erheblich.

<!-- Twig: standardmäßig automatisch maskiert -->
{{ user_input }}  <!-- HTML-Entitäten automatisch maskiert -->
{{ trusted_html|raw }}  <!-- Explizit als sicher markiert -->

<!-- Smarty: manuelle Maskierung nötig -->
{$user_input|escape:'html'}  <!-- Muss ans Maskieren denken -->
{$user_input}  <!-- GEFÄHRLICH: keine Maskierung -->

Symfony-Integration

Da PrestaShop Symfony verwendet, integriert sich Twig nativ mit Symfonys Routing, Formular-Rendering, Übersetzungssystem und Sicherheitskomponenten.

Bessere Fehlermeldungen

Twig liefert klare, entwicklerfreundliche Fehlermeldungen mit exakten Zeilennummern.

Moderne Werkzeuge

Twig hat exzellente IDE-Unterstützung mit Syntax-Highlighting, Auto-Vervollständigung und Linting in PhpStorm, VS Code und anderen Editoren.

Häufige Migrationsmuster

Zeichenketten übersetzen

<!-- Smarty -->
{l s='In den Warenkorb' mod='mymodule'}

<!-- Twig -->
{{ 'In den Warenkorb'|trans({}, 'Modules.Mymodule.Shop') }}

Hook-Rendering

<!-- Smarty -->
{hook h='displayProductButtons'}

<!-- Twig -->
{{ renderhook('displayProductButtons') }}

Asset-URLs

<!-- Smarty -->
<link rel="stylesheet" href="{$module_dir}views/css/style.css">

<!-- Twig -->
<link rel="stylesheet" href="{{ asset('modules/mymodule/views/css/style.css') }}">

Back-Office-Template-Überschreibungen in PrestaShop 9

In PrestaShop 9.0 können Module Back-Office-Twig-Templates überschreiben, indem sie dieselbe Verzeichnisstruktur nachbilden -

# Modul-Override-Standort
modules/mymodule/views/PrestaShop/Admin/Product/CatalogPage/catalog.html.twig

Sie können das Original-Template mit dem @PrestaShopCore-Namespace erweitern -

{% extends '@PrestaShopCore/Admin/Product/CatalogPage/catalog.html.twig' %}

{% block product_catalog_tools %}
  {{ parent() }}
  <div class="my-custom-toolbar">
    <!-- Zusätzlicher Toolbar-Inhalt -->
  </div>
{% endblock %}

Praktische Ratschläge für Shopbetreiber

Keine Panik

Die Migration ist schrittweise. Smarty wird nicht über Nacht entfernt. Planen Sie Ihre Migration in komfortablem Tempo.

Modulkompatibilität vor dem Upgrade prüfen

Vor dem Upgrade auf PrestaShop 9.0 überprüfen Sie, ob jedes verwendete Modul kompatibel ist.

Professionelle Hilfe bei komplexen Shops erwägen

Bei umfangreichen Anpassungen engagieren Sie einen PrestaShop-Entwickler mit Erfahrung in Smarty und Twig.

Alles in einer Staging-Umgebung testen

Upgraden Sie niemals Ihren Produktions-Shop direkt. Richten Sie eine Staging-Umgebung ein und testen Sie dort gründlich.

War diese Antwort hilfreich?

Haben Sie noch Fragen?

Can't find what you're looking for? Send us your question and we'll get back to you quickly.

Lade ...
Nach oben