Вставка блока в любой шаблон (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.