xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Пример вывода региона 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
Похожие записи

Комментарии RSS

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

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

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

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

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

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

Блин блинский, засада... у меня в 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');

Благодарю за заметку.

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

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

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

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 всё работает отлично, как в полноценном регионе. Пример с запчастями и аксессуарами тут, но я пока так и не понял с чем это связано.

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании