A Twig sablonrendszer alapjai Drupal sminkfejlesztőknek

Üdvözöljük a Drupal világában, ahol a rugalmasság és a teljesítmény találkozik az elegáns megjelenéssel! Ha Ön Drupal sminkfejlesztő, vagy csak most ismerkedik a témával, bizonyára találkozott már a Twig kifejezéssel. A Drupal 8-tól kezdődően a Twig vált a rendszer hivatalos sablonmotorjává, leváltva a korábbi PHPTemplate rendszert. Ez a váltás nem véletlen: a Twig egy gyors, biztonságos és rendkívül rugalmas sablonrendszer, amely jelentősen megkönnyíti a tiszta és karbantartható kódbázisok létrehozását. Ebben a cikkben mélyrehatóan bemutatjuk a Twig alapjait, különös tekintettel arra, hogyan illeszkedik a Drupal ökoszisztémájába, és hogyan használhatja ki teljes potenciálját a lenyűgöző sminkek létrehozásához.

Miért pont Twig? A Drupal és a Twig Szimbiózisa

A Twig sablonrendszer bevezetése a Drupal 8-ban paradigmaváltást hozott. A korábbi PHPTemplate motor, bár funkcionális volt, gyakran lehetőséget adott arra, hogy a megjelenítési logikát összekeverjük az üzleti logikával. Ez nehezítette a kód karbantarthatóságát és tesztelhetőségét. A Twig ezzel szemben egy „logic-less” (vagy legalábbis minimális logikát engedélyező) sablonrendszer, amely arra ösztönzi a fejlesztőket, hogy a megjelenítést elkülönítsék a funkcionális logikától. Ezáltal a sablonfájlok tisztábbak, könnyebben olvashatóak és egyszerűbben módosíthatóak lesznek.

A Twig fő előnyei a Drupal környezetben:

  • Tisztaság és olvashatóság: A Twig szintaxisa egyszerű és intuitív, a sablonok könnyen áttekinthetők.
  • Biztonság: Alapértelmezés szerint minden kimenet automatikusan „escape-el” (HTML speciális karaktereket alakít át), ami megakadályozza az XSS (Cross-Site Scripting) támadások jelentős részét.
  • Gyorsaság: A Twig sablonok PHP kódra fordulnak le, és gyorsítótárazásra kerülnek, ami jelentősen javítja az oldalbetöltési időt.
  • Rugalmasság: Széles körű funkciókat, filtereket és vezérlési struktúrákat kínál, amelyekkel szinte bármilyen megjelenítési igény kielégíthető.
  • Fejlesztői élmény: A Twig debug funkciói, és a Drupalban elérhető fejlesztői eszközök, mint a Devel és a Kint, nagyban megkönnyítik a hibakeresést és a sablonfejlesztést.

A Twig Alapvető Szintaxisa

A Twig sablonok három fő elemből épülnek fel:

1. Változók megjelenítése (Output)

A változók értékének kiírására a kettős kapcsos zárójelet használjuk: {{ variable_name }}. Ez a szerkezet kiírja a variable_name nevű változó értékét a sablonba, és alapértelmezetten automatikusan HTML-karakterekké alakítja a speciális karaktereket (például < helyett &lt; lesz). Ez a beépített biztonsági mechanizmus kritikus fontosságú.

{{ page_title }}
{{ user.name }}
{{ node.title.value }}

2. Vezérlési struktúrák (Logic)

A programlogika, mint a feltételes utasítások (if/else) vagy a ciklusok (for), a kettős kapcsos zárójel és a százalékjel kombinációjával adható meg: {% ... %}.

{% if logged_in %}
    

Üdv újra, {{ user.name }}!

{% else %}

Kérjük, jelentkezzen be.

{% endif %} {% for item in items %}
  • {{ item.title }}
  • {% endfor %}

    3. Megjegyzések (Comments)

    A Twig sablonokba megjegyzéseket is elhelyezhetünk, amelyek nem jelennek meg a kimenetben. Ezeket a kettős kapcsos zárójel és a kettős kereszt (hashmark) közé írjuk: {# ... #}.

    {# Ez egy Twig megjegyzés, ami nem jelenik meg az oldalon. #}

    Gyakori Twig Funkciók és Filterek Drupalban

    A Twig filterek olyan függvények, amelyek módosítják egy változó kimenetét. A filtereket a | jellel kapcsoljuk a változóhoz. A Twig függvények pedig önállóan, egy adott feladat elvégzésére hívhatók meg.

    Néhány alapvető Twig Filter:

    • |raw: Kikapcsolja az automatikus HTML escape-elést. Óvatosan használd! Csak akkor, ha biztos vagy benne, hogy a változó tartalma biztonságos (pl. a Drupal már sanitizálta). Példa: {{ content|raw }}
    • |t: A Drupal fordítási API-ját használja a szöveg lefordítására. Példa: {{ 'Hello world'|t }}
    • |without(variable_name): Eltávolít egy bizonyos gyermeket egy renderelhető tömbből. Nagyon hasznos, ha egy renderelhető tömb egy részét már kiírtuk, és nem szeretnénk, hogy a {{ content }} később újra megjelenítse. Példa: {{ content|without('body', 'field_image') }}
    • |date(format): Formázza a dátumot. Példa: {{ node.created.value|date('Y-m-d H:i') }}
    • |length: Visszaadja egy sztring hosszát, vagy egy tömb elemeinek számát. Példa: {{ items|length }}
    • |clean_class: A Drupal saját filtere, amely egy sztringet érvényes CSS osztálynévvé alakít. Példa: {{ node.type.target_id|clean_class }}

    Néhány alapvető Twig Függvény:

    • url(path, options): Generál egy URL-t a Drupal útválasztási rendszerével. Példa: {{ url('node.add', {'node_type': 'article'}) }}
    • path(path, options): Generál egy belső útvonalat. Példa: {{ path('node.add', {'node_type': 'page'}) }}
    • link(text, url, attributes): Generál egy linket (<a> tag-et). Példa: {{ link('Go to Home', '') }}
    • file_url(uri): Generál egy URL-t egy fájlhoz a Drupal fájlrendszerében. Példa: {{ file_url(node.field_image.entity.uri.value) }}
    • attach_library('olyan_theme/olyan_library'): Egy Drupal library-t (CSS/JS) csatol az aktuális oldalhoz. Példa: {% attach_library('my_theme/my_custom_js') %}

    Vezérlési Struktúrák és Adatkezelés

    A Twig nem csak változók kiírására szolgál, hanem a megjelenítési logika kezelésére is. Nézzünk meg néhány alapvető vezérlési struktúrát:

    Feltételes utasítások (If/Elseif/Else)

    A {% if ... %} ... {% endif %} szerkezet lehetővé teszi, hogy bizonyos blokkok csak akkor jelenjenek meg, ha egy feltétel igaz.

    {% if is_front %}
        
    {% elseif node.type.target_id == 'article' %}
        

    Cikk címe: {{ node.title.value }}

    {% else %}

    Ez egy normál oldal.

    {% endif %}

    Ciklusok (For)

    A {% for ... in ... %} ... {% endfor %} szerkezet tömbök vagy objektumok bejárására szolgál.

    {% for item in items %}
        <div class="item">
            <h3>{{ item.title }}</h3>
            <p>{{ item.description }}</p>
        </div>
    {% else %} {# Ez a blokk akkor fut le, ha az "items" tömb üres #}
        <p>Nincsenek elemek.</p>
    {% endfor %}

    Sablonok Öröklése és Beillesztése (Inheritance & Includes)

    A Twig sablonrendszer egyik legerősebb funkciója a sablonok újrafelhasználhatósága az öröklés és beillesztés mechanizmusán keresztül.

    extends: Sablonok Öröklése

    Az {% extends 'base.html.twig' %} utasítás lehetővé teszi, hogy egy sablon örököljön egy másik (alap) sablon elrendezését. Az alap sablon definiálhat „blokkokat” ({% block block_name %} ... {% endblock %}), amelyeket az örökölt sablon felülírhat vagy kiegészíthet.

    {# base.html.twig #}
    <!DOCTYPE html>
    <html>
        <head>
            <title>{% block page_title %}Alap cím{% endblock %}</title>
        </head>
        <body>
            {% block content %}{% endblock %}
        </body>
    </html>
    
    {# page.html.twig #}
    {% extends 'base.html.twig' %}
    
    {% block page_title %}
        {{ parent() }} - {{ node.title.value }}
    {% endblock %}
    
    {% block content %}
        <h1>{{ node.title.value }}</h1>
        <div>{{ node.body.value|raw }}</div>
    {% endblock %}

    A parent() függvény segítségével hivatkozhatunk az alap sablonban definiált blokk tartalmára, így kiegészíthetjük azt, nem csak felülírhatjuk.

    include: Sablonok Beillesztése

    Az {% include 'template_part.html.twig' %} utasítás egy másik sablon fájl tartalmát illeszti be az aktuális helyre. Ez kiválóan alkalmas újrafelhasználható komponensek (pl. kártyák, gombok, menük részei) létrehozására. Lehetőség van változókat is átadni az included sablonnak.

    {# card.html.twig #}
    <div class="card">
        <h3>{{ title }}</h3>
        <p>{{ description }}</p>
    </div>
    
    {# main.html.twig #}
    {% include 'card.html.twig' with { 'title': 'Termék A', 'description': 'Ez egy termék.' } %}
    {% include 'card.html.twig' with { 'title': 'Termék B', 'description': 'Ez egy másik termék.' } %}

    Twig Sminkfejlesztés Drupalban: Gyakorlati Tippek

    Most, hogy megismertük a Twig alapjait, nézzük meg, hogyan tudjuk hatékonyan használni a Drupal sminkfejlesztés során.

    1. Debugolás: A Fejlesztő Barátja

    A Drupal 8/9/10 sminkfejlesztés egyik legfontosabb eszköze a Twig debug. Ennek bekapcsolásához szerkessze a sites/default/services.yml fájlt (ha még nincs ilyen, másolja át a default.services.yml fájlból), és állítsa be a következőket:

    parameters:
      twig.config:
        debug: true
        auto_reload: true
        cache: false

    Ezután ürítse a Drupal gyorsítótárát. Ha most betölt egy oldalt, a HTML kimenetben megjegyzéseket fog látni, amelyek jelzik, melyik Twig sablonfájl generálta az adott HTML részt, és mely alternatív fájlneveket (template suggestions) használhatja felülíráshoz. Ez felbecsülhetetlen értékű a megfelelő sablon azonosításához és felülírásához.

    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'node' -->
    <!-- FILE NAME SUGGESTIONS:
       x node--article--full.html.twig
       x node--article.html.twig
       x node--full.html.twig
       * node.html.twig
    -->
    <!-- BEGIN OUTPUT from 'themes/olyan_theme/templates/content/node.html.twig' -->
    ...
    <!-- END OUTPUT from 'themes/olyan_theme/templates/content/node.html.twig' -->
    

    2. Változók felfedezése (Kint & Devel)

    A Twig sablonokban elérhető változók tartalmának megértéséhez telepítse a Devel modult, amely magával hozza a Kint könyvtárat. Ezután a Twig sablonokban a {{ kint() }} függvénnyel kiírathatja az aktuálisan elérhető összes változót, vagy a {{ kint(variable_name) }} paranccsal egy specifikus változó tartalmát. Ez egy interaktív, kibontható fában mutatja meg az adatstruktúrát, ami elengedhetetlen a bonyolult Drupal renderelhető tömbök megértéséhez.

    {# Kiírja az összes elérhető változót #}
    {{ kint() }}
    
    {# Kiírja a "node" változó tartalmát #}
    {{ kint(node) }}

    3. Sablonok Felülírása (Overrides)

    A Drupalban a sablonok felülírása a sminkfejlesztés alapja. A Twig debug által javasolt fájlnevek (template suggestions) alapján egyszerűen másolja át a modul vagy a core által biztosított Twig fájlt a saját sminkje templates mappájába, majd nevezze át a kívánt, specifikusabb névre. Például, ha a node--article.html.twig fájlt szeretné módosítani egy „Article” tartalomtípushoz, akkor másolja a core/modules/node/templates/node.html.twig fájlt a sminkje templates mappájába, és nevezze át node--article.html.twig-re.

    Fontos, hogy minden sablon felülírása után üríteni kell a gyorsítótárat, hogy a Drupal felismerje az új fájlt.

    4. Preprocess Funkciók: Adatok előkészítése Twig számára

    Bár a Twig minimális logikát engedélyez, a bonyolultabb adatelőkészítést érdemes a preprocess függvényekben elvégezni. Ezek PHP függvények, amelyek a sminkünk .theme fájljában helyezkednek el, és lehetővé teszik, hogy extra változókat adjunk át a Twig sablonoknak, vagy módosítsuk a már meglévőket.

    Példa egy preprocess függvényre (olyan_theme.theme fájlban):

    /**
     * Implements hook_preprocess_node().
     */
    function olyan_theme_preprocess_node(&$variables) {
      // Ellenőrizzük, hogy a node objektum létezik-e.
      if (isset($variables['node']) && $variables['node'] instanceof DrupalnodeNodeInterface) {
        /** @var DrupalnodeNodeInterface $node */
        $node = $variables['node'];
    
        // Hozzáadunk egy egyéni változót a Twig számára.
        $variables['my_custom_variable'] = 'Ez egy egyéni változó a ' . $node->getTitle() . ' node-ból.';
    
        // Módosíthatjuk a meglévő változókat is.
        if ($node->bundle() == 'article') {
          $variables['article_class'] = 'is-article';
        }
      }
    }

    Ezek a változók ezután elérhetők lesznek a node.html.twig sablonban {{ my_custom_variable }} és {{ article_class }} néven.

    Best Practices és Biztonság

    A Twig használata során érdemes betartani néhány bevált gyakorlatot:

    • Tartsd külön a logikát és a megjelenítést: Amennyire csak lehet, a komplex számításokat és adatmanipulációt végezd el a preprocess függvényekben, és csak az előkészített adatokat add át a Twig sablonnak.
    • Használj értelmes változóneveket: A sablonok könnyebben olvashatóak és karbantarthatóak, ha a változók nevei beszédesek.
    • Használd ki az öröklést és a beillesztést: Ezek a mechanizmusok segítenek a kódduplikáció elkerülésében és a komponens alapú fejlesztésben.
    • Soha ne kapcsold ki az automatikus escapinget indokolatlanul: A |raw filtert csak akkor használd, ha 100%-ig biztos vagy benne, hogy a kiírandó tartalom biztonságos, és nincs szüksége további escapingre.
    • Rendszeresen ürítsd a gyorsítótárat: Különösen fejlesztés közben, ha sablonfájlokat módosítasz vagy újakat adsz hozzá.
    • Kommentáld a kódod: Még a sablonfájlokban is hasznos, ha megjegyzésekkel látjuk el a bonyolultabb részeket.

    Összefoglalás

    A Twig sablonrendszer egy erőteljes és elegáns eszköz a Drupal sminkfejlesztők kezében. Megértve alapvető szintaxisát, a Drupalba integrált funkcióit és a hozzá tartozó fejlesztői eszközöket, jelentősen felgyorsíthatja és hatékonyabbá teheti a munkafolyamatát. A Twig tisztaságra, biztonságra és modularitásra ösztönöz, ami hosszútávon stabilabb és könnyebben karbantartható weboldalakat eredményez. Ne féljen kísérletezni, használja a debug eszközöket, és hamarosan Ön is magabiztosan fogja kezelni a Twiget a Drupal projektekben.

    Reméljük, ez az átfogó útmutató segít Önnek elindulni a Twig és a Drupal sminkfejlesztés izgalmas világában!

    Leave a Reply

    Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük