PrestaShop Smarty vs Twig: Co się zmienia w szablonach

389 wyświetleń

Przejście silnika szablonów w PrestaShop

PrestaShop przechodzi jedną z najważniejszych zmian architektonicznych w swojej historii — migrację z Smarty na Twig jako główny silnik szablonów. Ta zmiana, rozpoczęta w PrestaShop 1.7 i osiągająca ważny kamień milowy w PrestaShop 9.0 (wydanym w czerwcu 2025), dotyczy każdego programisty, projektanta motywów i twórcy modułów pracującego z platformą.

Zrozumienie tej zmiany jest kluczowe, niezależnie od tego, czy utrzymujesz istniejący sklep, planujesz aktualizację, czy rozwijasz nowe moduły i motywy. Ten przewodnik omawia, co się zmieniło, co się jeszcze zmienia i jak przygotować swoje projekty PrestaShop na erę Twig.

Czym są Smarty i Twig?

Smarty - Silnik klasyczny

Smarty to silnik szablonów PHP, który napędza PrestaShop od jego początków. Oddziela logikę biznesową PHP od prezentacji HTML.

Główne cechy Smarty -

  • Pliki szablonów używają rozszerzenia .tpl
  • Zmienne są dostępne za pomocą nawiasów klamrowych i znaku dolara - {$variable}
  • Modyfikatory używają składni pipe - {$variable|escape:'html'}
  • Bloki używają sparowanych tagów - {block name='content'}{/block}
  • Dziedziczenie szablonów przez {extends file='parent.tpl'}

Twig - Nowoczesny silnik

Twig to silnik szablonów zbudowany przez SensioLabs, firmę stojącą za frameworkiem Symfony. Ponieważ PrestaShop stopniowo adoptuje komponenty Symfony, przejście na Twig jest naturalną ewolucją.

Główne cechy Twig -

  • Pliki szablonów używają rozszerzenia .html.twig
  • Zmienne używają podwójnych nawiasów klamrowych - {{ variable }}
  • Filtry używają składni pipe - {{ variable|escape('html') }}
  • Bloki używają sparowanych tagów - {% block content %}{% endblock %}
  • Dziedziczenie szablonów przez {% extends 'parent.html.twig' %}

Porównanie składni - obok siebie

Wyświetlanie zmiennych

FunkcjaSmartyTwig
Prosta zmienna{$product.name}{{ product.name }}
Dostęp do tablicy{$products[0].name}{{ products[0].name }}
Metoda obiektu{$product->getName()}{{ product.getName() }}
Wartość domyślna{$var|default:'N/A'}{{ var|default('N/A') }}

Struktury kontrolne

<!-- Smarty: if/else -->
{if $product.active}
  <span class="badge badge-success">Aktywny</span>
{elseif $product.pending}
  <span class="badge badge-warning">Oczekujący</span>
{else}
  <span class="badge badge-danger">Nieaktywny</span>
{/if}

<!-- Twig: if/else -->
{% if product.active %}
  <span class="badge badge-success">Aktywny</span>
{% elseif product.pending %}
  <span class="badge badge-warning">Oczekujący</span>
{% else %}
  <span class="badge badge-danger">Nieaktywny</span>
{% endif %}

Pętle

<!-- Smarty: pętla foreach -->
{foreach $products as $product}
  <div class="product">
    <h3>{$product.name}</h3>
    <p>{$product.price|number_format:2:',':'.'}</p>
  </div>
{foreachelse}
  <p>Nie znaleziono produktów.</p>
{/foreach}

<!-- Twig: pętla for -->
{% for product in products %}
  <div class="product">
    <h3>{{ product.name }}</h3>
    <p>{{ product.price|number_format(2, ',', '.') }}</p>
  </div>
{% else %}
  <p>Nie znaleziono produktów.</p>
{% endfor %}

Co się już zmieniło - oś czasu

PrestaShop 1.7 (2016)

Rozpoczęcie migracji. Back office zaczął adoptować kontrolery Symfony z szablonami Twig. Front office pozostał w pełni oparty na Smarty.

PrestaShop 8.x (2022-2024)

Więcej stron back office zostało zmigrowanych do Symfony i Twig. Kluczowe strony administracyjne jak Produkty, Zamówienia i Klienci otrzymały przepisane szablony Twig.

PrestaShop 9.0 (czerwiec 2025)

Ważny kamień milowy. Back office jest teraz w pełni zmigrowany do kontrolerów Symfony i szablonów Twig. Jednak Smarty wciąż jest obecny, ponieważ -

  • Front office (motywy) nadal głównie używa Smarty
  • Wiele modułów firm trzecich nadal używa szablonów Smarty
  • Strony administracyjne modułów używające starych AdminControllerów wciąż opierają się na Smarty

Wpływ na właścicieli sklepów

Jeśli używasz PrestaShop 1.7 lub 8.x

Nic się nie zmienia natychmiast. Twoje obecne motywy i moduły będą nadal działać. Planuj jednak ewentualną aktualizację do PrestaShop 9.0.

Jeśli aktualizujesz do PrestaShop 9.0

Największy wpływ dotyczy modułów modyfikujących strony back office. Sprawdź kompatybilność u deweloperów modułów przed aktualizacją.

Wpływ na deweloperów modułów

Szablony administracyjne modułów

Dla kompatybilności z PrestaShop 8.x (podejście klasyczne) -

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

Dla PrestaShop 9.0+ (nowoczesne podejście) -

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

Wsparcie wielu wersji 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');
}

Zalety Twig nad Smarty

Lepsza bezpieczeństwo

Twig automatycznie escapuje wyjście domyślnie, znacznie zmniejszając ryzyko XSS.

<!-- Twig: automatycznie escapowany domyślnie -->
{{ user_input }}  <!-- Encje HTML escapowane automatycznie -->
{{ trusted_html|raw }}  <!-- Jawnie oznaczony jako bezpieczny -->

<!-- Smarty: ręczne escapowanie wymagane -->
{$user_input|escape:'html'}  <!-- Musisz pamiętać o escapowaniu -->
{$user_input}  <!-- NIEBEZPIECZNE: brak escapowania -->

Integracja z Symfony

Twig integruje się natywnie z routingiem Symfony, renderowaniem formularzy, systemem tłumaczeń i komponentami bezpieczeństwa.

Lepsze komunikaty błędów

Twig dostarcza czytelne komunikaty błędów z dokładnymi numerami linii.

Nowoczesne narzędzia

Twig ma doskonałe wsparcie IDE z podświetlaniem składni, automatycznym uzupełnianiem i lintingiem w PhpStorm, VS Code i innych edytorach.

Typowe wzorce migracji

Tłumaczenie ciągów znaków

<!-- Smarty -->
{l s='Dodaj do koszyka' mod='mymodule'}

<!-- Twig -->
{{ 'Dodaj do koszyka'|trans({}, 'Modules.Mymodule.Shop') }}

Renderowanie hooków

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

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

Nadpisywanie szablonów back office w PrestaShop 9

# Lokalizacja nadpisania modułu
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">
    <!-- Dodatkowa zawartość paska narzędzi -->
  </div>
{% endblock %}

Praktyczne porady dla właścicieli sklepów

Nie panikuj

Migracja jest stopniowa. Smarty nie zostanie usunięty z dnia na dzień.

Sprawdź kompatybilność modułów przed aktualizacją

Przed aktualizacją do PrestaShop 9.0 zweryfikuj, że każdy moduł jest kompatybilny.

Rozważ profesjonalną pomoc przy złożonych sklepach

Przy rozbudowanych customizacjach zatrudnij doświadczonego developera PrestaShop.

Testuj wszystko w środowisku stagingowym

Nigdy nie aktualizuj swojego sklepu produkcyjnego bezpośrednio.

Czy ta odpowiedź była pomocna?

Masz jeszcze pytania?

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

Loading...
Back to top