Вставка блока в любой шаблон (drupal insert block into template)

Друпал 8

В шаблоне twig нельзя вызвать PHP код, поэтому нужно передавать уже готовый блок в шаблон. Если в шаблон ноды нужно передать переменную, то можно использовать themename_preprocess_node() функцию в теме, для page шаблона themename_preprocess_page(). Передаете переменную в twig шаблон и в нем уже эту переменную выводите.

Блоки созданные через админку

$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
  ->getViewBuilder('block')
  ->view($block);

Для функции themename_preprocess_node() (шаблона ноды) этот блок можно вывести следующим образом:

function themename_preprocess_node(&$variables) {
  $block = \Drupal\block\Entity\Block::load('your_block_id');
  $variables['block_output'] = \Drupal::entityTypeManager()
    ->getViewBuilder('block')
    ->view($block);
}

В шаблоне node.html.twig теперь можно вывести блок:

{{ block_output }}

Блоки созданные через плагины

Такие блоки можно вывести также как и блоки созданные через админку, только код для их вывода немного другой:

$block_manager = \Drupal::service('plugin.manager.block');
// Вы можете прописать свои настройки для блока здесь.
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
// Некоторые блоки могут быть с различными разрешения на просмотр.
$access_result = $block_plugin->access(\Drupal::currentUser());
// Возвращает пустой массив, если нет доступа к блоку.
if ($access_result->isForbidden()) {
  return [];
}
$render = $plugin_block->build();
// Здесь возможно потребуется добавить кэш теги или контексты.
// Также возможно добавить кэш тег и контекст в методах render(), ::getCacheTags, ::getCacheContexts.
return $render;

Тот же код без комментариев:

$block_manager = \Drupal::service('plugin.manager.block');
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
$access_result = $block_plugin->access(\Drupal::currentUser());
if ($access_result->isForbidden()) {
  return [];
}
$render = $plugin_block->build();
return $render;

Друпал 7

Для седьмого друпала функция таже, только параметры немного другие, вместо двух параметров block, view используем один block_view:

print render(module_invoke('block', 'block_view', '12'));

Для views вставка блока будет выглядеть так:

print render(module_invoke('views', 'block_view', 'feedbacks-block'));

А так в друпал 7 мы вставляем блок view, заметьте что теперь в дельте для первого блока отсутвует номер блока а пишем просто feedbacks-block.

Друпал 6

Для того чтобы вставить блок в нужное вам место используйте функцию module_invoke() :

$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];

Так, например, если нужно вставить блок, созданный через админку, то используйте следующий код:

$block = module_invoke('block', 'block', 'view', 12);
print $block['content'];

Где 12 это номер блока, его дельта.

Если вставляем блок views, то делаем это так:

$block = module_invoke('views', 'block', 'view', 'feedbacks-block_1');
print $block['content'];

Где feedbacks-block_1  название блока во view, feedbacks - имя view, а block_1 - имя дисплея в этом view.

Комментарии

Добавить комментарий

Войти, используя Loginza Google Account Yandex Mail.ru Vkontakte Facebook

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.