6.4. Twig je novi šablonski (template) engine za Drupal.
Ako otvorite fajl šablona page.html.twig teme Stable:
/core/themes/stable/templates/layout/page.html.twig
Videćete da se razlikuje od šablona page.tpl.php iz Drupala 7, prvo po ekstenziji, a drugo po obilju kovrdžavih zagrada {}. Sve je to zato što Drupal koristi Twig šablonski engine.
<main role="main">
<a id="main-content" tabindex="-1"></a>{# link je u html.html.twig #}
<div class="layout-content">
{{ page.content }}
</div>{# /.layout-content #}
{% if page.sidebar_first %}
<aside class="layout-sidebar-first" role="complementary">
{{ page.sidebar_first }}
</aside>
{% endif %}
{% if page.sidebar_second %}
<aside class="layout-sidebar-second" role="complementary">
{{ page.sidebar_second }}
</aside>
{% endif %}
</main>
U twig šablonu se ne može koristiti PHP, tako da treba koristiti samo Twig alate, a oni su dovoljni za stilizovanje sajta.
Hajde da shvatimo kako se radi sa Twig-om.
Varijable u Twig-u
Ako u PHP koristimo znak dolara $ za varijable, onda u Twig-u koristimo kovrdžave zagrade:
{{variable}}
Tako pišemo varijable sa dve otvarajuće zagrade, razmak, ime varijable, razmak, dve zatvarajuće zagrade. Da bismo ispisali varijablu, ne treba nam print funkcija ispred twig varijable, u twig šablonima se uopšte ne koristi PHP; da ispišemo varijablu samo je potrebno da je napišemo u dvostrukim kovrdžavim zagradama.
Takođe je zgodno raditi sa objektima i nizovima varijabli, ako je ranije trebalo znati da je $node objekat, a $form niz, sada je sve jednostavnije, svojstva varijabli pristupamo preko tačke:
{{node.id}}
Jednostavno možemo praviti i svoje varijable:
{% set foo="bar" %}
Zdravo, evo moje varijable: {{ foo }}
Obratite pažnju na sintaksu, kad postavljamo varijablu koristimo procenat %, a kad ispisujemo varijablu koristimo dvostruke zagrade.
Možemo navesti ne samo stringove, već i nizove:
{%
set foo_array = [
'foo',
'bar',
]
%}
Twig filteri
Iako Twig nije potpuni programski jezik, ima set alata za rad sa podacima. Verovatno najvažniji takav alat su filteri. Filteri se navode pomoću znaka pipe |
{{ variable|filter }}
Filteri omogućavaju promenu prikaza varijabli, na primer:
{{node.title | length}} - ispisuje dužinu stringa
{{node.title | upper}} - prikazuje string velikim slovima
{{node.title | lower}} - ispisuje string malim slovima
Za kompletan spisak Twig filtera, pogledajte zvaničnu Twig dokumentaciju na http://twig.sensiolabs.org/doc/filters/index.html
Drupal Twig filteri
Drupal takođe dodaje svoje filtere Twig-u, kao što su filteri za prelome linija. Ako smo ranije koristili funkciju t() koja je implementirana u PHP-u, a sada ne možemo koristiti PHP u Twig-u, potrebni su nam alati koji zamenjuju funkciju t().
Primeri filtera su:
- t
- passthrough
- placeholder
- drupal_escape
- safe_json
- without
- clean_class
- clean_id
Prelomi linija u Twig-u
Twig koristi tagove za prevod stringova. Da biste preveli liniju, koristite tag {% trans %}. Obratite pažnju kako su napisane kontrolne strukture. Koriste procenat % da bi se razlikovale od varijabli.
{% trans %} Zdravo svet {% endtrans %}
Možemo proslediti i varijable unutar prevedenih stringova:
{% trans %} Zdravo {{ name }} {% endtrans %}
Takođe možemo promeniti varijable filterima pre prikaza u prevodu:
{% set name = name|capitalize %}
{% trans %}
Zdravo {{ name }}!
{% endtrans %}
Komentari u Twig-u
{# Ovde ide komentar #}
Uslovni if iskaz
Iako Twig nema većinu PHP funkcionalnosti, ima set konstrukcija za rad sa nizovima i varijablama. Na primer, možemo proveriti da li varijabla postoji pre nego što je prikažemo.
{% if site_slogan %}
<div class="site-slogan">{{ site_slogan }}</div>
{% endif %}
Twig petlja
Vrlo često u šablonima treba iterirati kroz niz i ispisivati elemente jedan po jedan. Za to u Twig-u koristimo for petlju (slično foreach u PHP-u):
{% for item in items %}
{{ item.content }}
{% endfor %}
Takođe možemo koristiti for petlju kao običnu for petlju u PHP-u, ali u drugačijem obliku:
{% for i in range(0, 3) %}
{{ i }},
{% endfor %}
Varijabla | Opis |
items.index | Trenutni broj stavke počevši od 1 |
items.index0 | Trenutni broj stavke počevši od 0 |
items.revindex | Broj trenutnog elementa od kraja, počevši od 1 |
items.revindex0 | Broj trenutnog elementa od kraja, počevši od 0 |
items.first | TRUE ako je ovo prvi element |
items.last | TRUE ako je ovo poslednji element |
items.length | Dužina niza stavki |
items.parent | Parent kontekst |
for else konstrukcija
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% else %}
<li><em>nije pronađen nijedan korisnik</em></li>
{% endfor %}
</ul>