Najbolje prakse za Twig – funkcije i šabloni za prethodnu obradu
Da biste postigli maksimalnu performansu teme u Drupal 8 i omogućili više opcija za prilagođavanje u Twig šablonima, sledite sledeće preporuke:
Ovaj vodič je pisan da pomogne Drupal programerima koji imaju iskustvo sa Drupal 7 i pokušavaju da izbace funkcije poput theme() ili drupal_render() koje se više ne koriste u Drupal 8+ verzijama. Primeri „pre“ su uglavnom u Drupal 7 stilu kodiranja.
Vraćanje render nizova iz funkcija prethodne obrade
Uvek vraćajte render nizove umesto da pozivate theme() ili drupal_render() u funkcijama prethodne obrade.
Twig automatski renderuje sadržaj, pa nema potrebe pozivati drupal_render() ili theme() u funkciji prethodne obrade. Render nizovi treba da se proslede u šablon jer pružaju mnogo više fleksibilnosti nego već renderovani HTML string.
Uklanjanje poziva theme() iz funkcije prethodne obrade:
// Pre - prosleđivanje renderovanog HTML stringa u šablon.
$variables['table'] = theme('table', ['header' => $header, 'rows' => $rows]);
// Posle - prosleđivanje render niza u šablon.
$variables['table'] = [
'#theme' => 'table',
'#header' => $header,
'#rows' => $rows,
];
Uklanjanje poziva drupal_render() iz funkcije prethodne obrade znači samo uklanjanje poziva funkcije:
// Pre, nepotreban poziv drupal_render(). $variables['teaser'] = drupal_render($node_teaser); // Posle, sa uklonjenim drupal_render(). $variables['teaser'] = $node_teaser;
Tipično je drupal_render() bio pozivan prilikom dodavanja u niz podataka za tabelu.
// Pre, nepotreban poziv drupal_render(). $row[] = drupal_render($display['title']); // Posle, sa uklonjenim drupal_render(). $row[]['data'] = $display['title'];
Filtarski pozivi i pomoćne funkcije u šablonima
Iako render nizovi pružaju promenljivu, menjivu strukturu podataka na putu do šablona, nisu sve promenljive render nizovi. Da bi se omogućilo što duže prosleđivanje neobrađenih podataka u šablone, tvorci tema treba da pozivaju filtere kao što je t i pomoćne funkcije kao što je url() direktno u Twig šablonima. Pozivanje ovih funkcija u Twig šablonu, a ne u prethodnoj obradi, može smanjiti broj poziva funkcija jer promenljive koje se prosleđuju šablonu možda nikada neće biti ispisane.
Pre:
U funkciji prethodne obrade:
$variables['no_content_text'] = t('You have not created any content types yet. Go to the <a href="@create-content">content type creation page</a> to add a new content type.', array('@create-content' => url('admin/structure/types/add')));
U šablonu:
<p>{{ no_content_text }}</p>
Posle:
U šablonu:
<p>{{ 'You have not created any content types yet. Go to the <a href="@create-content">content type creation page</a> to add a new content type.'|t({'@create-content': url('admin/structure/types/add')}) }}</p>
Prikazivanje/sakrivanje i uklanjanje drupal_render_children i element_children
Ako je hide() pozvan u izvornom šablonu, a drupal_render_children se koristio za renderovanje „ostalog“ sadržaja, potrebno je da se to razdvoji na zasebne promenljive tokom prethodne obrade.
Pre (PHPTemplate fajl):
<?php hide($form['advanced']); hide($form['actions']); ?> <div class="layout-node-form clearfix"> <div class="layout-region layout-region-node-main"> <?php print drupal_render_children($form); ?> </div> <div class="layout-region layout-region-node-secondary"> <?php print render($form['advanced']); ?> </div> <div class="layout-region layout-region-node-footer"> <?php print render($form['actions']); ?> </div> </div>
Koristite Twig filter called „without“ da biste sakrili određene elemente. Možete ih normalno prikazivati gde god je potrebno.
Posle (Twig šablon):
<div class="layout-node-form clearfix">
<div class="layout-region layout-region-node-main">
{{ form|without('advanced', 'actions') }}
</div>
<div class="layout-region layout-region-node-secondary">
{{ form.advanced }}
</div>
<div class="layout-region layout-region-node-footer">
{{ form.actions }}
</div>
</div>
Alternativni pristup (više nije potreban):
Prethodno obradite sve u zasebne promenljive i prosledite ih u šablon. Možda ćete morati da premestite stvari koje prikazujete u promenljive iz čitavog elementa (u ovom slučaju forme), pre nego što renderujete ostatak. Ispisujte sadržaj tačno kako je definisano u šablonu.
Pre (prethodna obrada):
function template_preprocess_node_edit_form(&$variables) {
$form = $variables['form'];
// @todo Ažurirajte kada se reši drupal.org/node/1920886.
$variables['advanced'] = $form['advanced'];
$variables['actions'] = $form['actions'];
unset($form['advanced'], $form['actions']);
$variables['form'] = drupal_render_children($form);
}
Posle (Twig šablon):
<div class="layout-node-form clearfix">
<div class="layout-region layout-region-node-main">
{{ form }}
</div>
<div class="layout-region layout-region-node-secondary">
{{ advanced }}
</div>
<div class="layout-region layout-region-node-footer">
{{ actions }}
</div>
</div>