Drupal → Вывести регион в node.tpl.php

19.07.2013

Пример вывода региона before_comments перед комментариями:

1. Добавить в THEMENAME.info:

regions[before_comments] = Before comments

2. Добавить в template.php:

/**
 * Implements hook_page_alter().
 */
function THEMENAME_page_alter(&$page) {
  if (isset($page['before_comments'])) {
    $GLOBALS['region_before_comments'] = $page['before_comments'];
  }
}

3. В node.tpl.php, перед выводом $content['comments'] добавить:

<?php if ($view_mode == 'full') { ?>
  <?php echo render($GLOBALS['region_before_comments']); ?>
<?php } ?>

4. Сбросить кэш.

Добавлено 09.11.2015

Статья переписана. Версия с вызовом функции block_get_blocks_by_region(), которая здесь была и которая везде советуется содержит один большой недостаток — блоки в регионе before_comments будут инициализироваться дважды.

Написанное актуально для
Drupal 7
Похожие записи

Комментарии

Для всех блоков в этом регионе желательно проставить соответствующие условия видимости в админке, потому что такой регион всё равно будет обрабатываться не только на нодных страницах.

Красиво, спасибо. Полезная фича.
Может ещё напишите, как вставить блок внутрь тела ноды, например, после третьего абзаца.

Поддерживаю Errand. Очень хочется заметку о том, как вставить блок внутри статьи.

Гость
27.08.2013, 04:16

Блин блинский, засада... у меня в template уже есть функция ***_preprocess_node(&$variables){} но в ней как видите &$variables, туда добавлять &$vars - сбоит, мою удалять - нельзя..., как быть то?

Гость
27.08.2013, 04:23

Забыл сказать: пытаюсь добавлять не в node.tpl.php а в node--custom.tpl.php

xandeadx, благодарю за наводку. Ты - молодец!

Гость
21.10.2013, 15:12

Блин блинский, засада... у меня в template уже есть функция ***_preprocess_node(&$variables){} но в ней как видите &$variables, туда добавлять &$vars - сбоит, мою удалять - нельзя..., как быть то?

Мне помогла вставка в мою функцию строки $vars['region']['before_comments'] = block_get_blocks_by_region('before_comments');. Только при этом нужно, чтобы $vars['region']['before_comments'] совпадало с function THEMENAME_preprocess_node(&$vars). Соответственно, если в уже имеющейся функции стоит function THEMENAME_preprocess_node(&$variables), вставляемая строка изменится на $variables['region']['before_comments'] = block_get_blocks_by_region('before_comments');

Большое спасибо. Не первый раз выручаете.

Гость
10.07.2014, 15:18

почему такая фишка не работает с копиями блоков?

Гость
29.11.2014, 18:06

Спасибо, коротко и ясно сказано, как создать новый регион в друпал в нужном месте.

THEMENAME - надо было менять на имя своей темы?

У меня в уже есть функция _page_alter($page) - как в нее грузануть не знаю =( но помощи прошу растолковать.

нашел на других с вызовом функции block_get_blocks_by_region() и так у меня вроде работает, но хочется же сделать более правильно.

Спасибо за ценный совет. Столкнулся с тем, что при использовании block_get_blocks_by_region() и вывода региона в node.tpl.php через hook_preprocess_node перестаёт работать блок, созданый во вьюхе с изменяющимся содержимым через ajax.

function themename_preprocess_node(&$variables) {
if ($blocks = block_get_blocks_by_region('region_name')) {
      $variables['region_name'] = $blocks;
    }
}

Конкретно это better exposed filters с чекбоксами. В случае с вашим советом, через page_alter всё работает отлично, как в полноценном регионе. Пример с запчастями и аксессуарами тут, но я пока так и не понял с чем это связано.

Гость
10.12.2016, 20:30

А как вывести регион перед комментариями в друпал 8?

Гость
30.08.2017, 01:00

Низкий поклон Вам, спасибо большое, помог!

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