Лучшие практики Twig - функции и шаблоны предварительной обработки
Чтобы сделать тематику Drupal 8 максимально производительной и обеспечить больше возможностей настройки в шаблонах Twig, следуйте следующим рекомендациям:
- Возврат массивов рендеринга из функций предварительной обработки
- Фильтры вызовов и служебные функции в шаблонах
Это руководство написано, чтобы помочь разработчикам Drupal, которые могут иметь опыт работы с Drupal 7 и пытаются удалить такие функции, как theme() или drupal_render(), которые больше не должны использоваться в Drupal 8+. Примеры «до» здесь, как правило, выполнены в стиле кода Drupal 7.
Возврат массивов рендеринга из функций предварительной обработки
Всегда возвращайте массивы рендеринга вместо вызова theme() или drupal_render() в функциях предварительной обработки.
Twig отображает все автоматически, поэтому нет необходимости вызывать drupal_render() или theme() внутри функции предварительной обработки. Вместо этого массивы рендеринга должны передаваться в шаблон, так как это позволяет гораздо больше настроек, чем уже отрисованная строка HTML.
Удаление theme() из функции предварительной обработки:
// Before - passing a string of rendered HTML to the template. $variables['table'] = theme('table', ['header' => $header, 'rows' => $rows]); // After - passing a render array to the template. $variables['table'] = [ '#theme' => 'table', '#header' => $header, '#rows' => $rows, ];
Удаление drupal_render() из функции предварительной обработки - это всего лишь вопрос удаления вызова:
// Before, unnecessary call to drupal_render(). $variables['teaser'] = drupal_render($node_teaser); // After, with drupal_render() removed. $variables['teaser'] = $node_teaser;
Общим является то, что drupal_render() вызывался при добавлении в таблицу данных.
// Before, unnecessary call to drupal_render(). $row[] = drupal_render($display['title']); // After, with drupal_render() removed. $row[]['data'] = $display['title'];
Фильтры call и служебные функции в шаблонах
Хотя массивы рендеринга обеспечивают адресуемую, изменяемую структуру для данных на всем пути к шаблону, не все переменные требуют массивов рендеринга. Чтобы предоставить необработанные данные шаблонам как можно дольше, разработчики тем должны вызывать фильтры, такие как t, и служебные функции, такие как url (), из шаблонов Twig. Вызов этих функций в шаблоне Twig, а не в функции предварительной обработки, может сократить вызовы функций, поскольку переменные, передаваемые в шаблон, могут вообще не печататься в шаблоне.
До:
В функции предварительной обработки:
$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')));
В шаблоне:
<p>{{ no_content_text }}</p>
После:
В шаблоне:
<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>
Показать / скрыть и удалить drupal_render_children и element_children
Если hide() был вызван в исходном шаблоне, а drupal_render_children использовался для визуализации «остальной части» данных, нам нужно разделить все это на отдельные переменные в ходе предварительной обработки.
До (файл PHPTemplate):
<?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>
Используйте фильтр Twig, который называется «without», чтобы скрыть определенные элементы. Вы можете сделать их как обычно, где это необходимо.
После: (шаблон Twig)
<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>
Альтернативный метод (больше не требуется):
Предварительно обработайте все в отдельные переменные и передайте их в шаблон. Возможно, вам придется сбросить вещи, которые вы отображаете, в переменные из всего элемента (в данном случае формы), прежде чем рендерить остальные. Напечатайте содержимое в точности так, как это предусмотрено в шаблоне.
До: (препроцесс)
function template_preprocess_node_edit_form(&$variables) { $form = $variables['form']; // @todo Update this once drupal.org/node/1920886 is resolved. $variables['advanced'] = $form['advanced']; $variables['actions'] = $form['actions']; unset($form['advanced'], $form['actions']); $variables['form'] = drupal_render_children($form); }
После: (шаблон Twig)
<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.