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>
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.