Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

Лучшие практики Twig - функции и шаблоны предварительной обработки

04/05/2020, by maria

Чтобы сделать тематику 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.