УрокДобавляем регион в ноду или комментарий

По умолчанию все созданные регионы доступны только в page.tpl.php, но иногда хочется добавить пару блоков, скажем, после ноды, но перед комментарием. Для этого делаем несколько несложных движений:

Добавляем регион в тему

В .info файл темы помимо прочих регионов добавляем регион для ноды:

regions[node_bottom] = Node bottom

Теперь открываем template.php и в препроцессе ноды добавляем переменную, которая будет содержать в себе весь регион node_bottom:

/**
 * Override or insert variables into the node template.
 */
function ИМЯТЕМЫ_preprocess_node(&$vars) {
  // Получаем регион и ложим его в массив переменных для ноды
  $vars['node_bottom'] = block_get_blocks_by_region('node_bottom');
}

Теперь открываем node.tpl.php и в любое место в шаблоне добавляем вывод этой переменной:

<?php if ($node_bottom): ?>
  <div class = "node-bottom">
    <?php print render($node_bottom); ?>
  </div>
<?php endif; ?>

Всё - регион добавлен и будет работать в ноде точно так же, как и для страницы.

Теперь давайте задачку чуть интереснее - добавим регион, который будет показываться только под первым комментарием в статье (например, чтобы засунуть туда рекламу).

Сначала всё по старой схеме - в .info файле создаём регион:

regions[comment_first] = First comment

Далее в template.php:

/**
 * Override or insert variables into the comment template.
 */
function ИМЯТЕМЫ_preprocess_comment(&$vars) {
  if ($vars['id'] == 1) {
    $vars['comment_region'] = block_get_blocks_by_region('comment_first');
  }
}

Теперь в необходимое вам место comment.tpl.php добавляйте вывод региона - и вы получите необходимый результат: реклама (или что вы туда добавите) будет показана только в первом комментарии:

<?php if ($comment_region): ?>
  <div class = "comment-region">
    <?php print render($comment_region); ?>
  </div>
<?php endif; ?>

Комментарии

Аватар пользователя Гость
Гость написал:

Супер, я это применю для вывода блока вьюхи «похожие материалы» спасиб

02.11.2011 01:44
Аватар пользователя xandeadx
xandeadx написал:

круто)

p.s чё такая капча длинная?)

02.11.2011 02:41
Аватар пользователя Spleshka
Spleshka написал:

Вид конечно страшный, зато непробиваемая :) Надо будет подкрутить.

02.11.2011 02:47
Аватар пользователя Bla5phemer
Bla5phemer написал:

если понадобится что-то присобачить ко вьюзу а не блоку, то советую этот модуль
EVA: Entity Views Attachment

02.11.2011 12:23
Аватар пользователя hiway
hiway написал:

Спасибо. Хорошее решение!

02.11.2011 17:56
Аватар пользователя Аноним
Аноним написал:

А таким же образом можно вывести содержимое региона и в block.tpl.php? И вообще этот способ раотает только для друпал7 или для друпал6 тоже подойдет?

02.11.2011 22:05
Аватар пользователя Spleshka
Spleshka написал:

Вывести содержимое региона в блок ?)) Можно конечно, но логический смысл отношений региона и блока теряется.

И этот метод не работает в Drupal 6, т.к. там нет фунции block_get_blocks_by_region()

02.11.2011 22:31
Аватар пользователя @mir0shnik
@mir0shnik написал:

Сделал все как написано по инструкции - у меня высечивается вот такая ошибка -

Notice: Undefined variable: mynew_region в функции include() (строка 66 в файле /home/u585466205/public_html/themes/mobi_drupal7/node.tpl.php).

вот мой сайт - http://master-tgn.16mb.com

08.02.2012 17:38
Аватар пользователя Spleshka
Spleshka написал:

После того как всё сделали, вы кэш очищали сайта?

08.02.2012 17:44
Аватар пользователя @mir0shnik
@mir0shnik написал:

Да, кэш почистил. и не раз.

Все сделал по Вашим пунктам, единственное, у меня регион называется - mynew_region

Сейчас вот снова проверил и ошибки -

Notice: Undefined variable: mynew_region в функции include() (строка 66 в файле /home/u585466205/public_html/themes/mobi_drupal7/node.tpl.php).
Notice: Undefined variable: mynew_region в функции include() (строка 66 в файле /home/u585466205/public_html/themes/mobi_drupal7/node.tpl.php).
Notice: Undefined variable: mynew_region в функции include() (строка 66 в файле /home/u585466205/public_html/themes/mobi_drupal7/node.tpl.php).

08.02.2012 17:56
Аватар пользователя Spleshka
Spleshka написал:

выложите тему в архиве.

08.02.2012 18:17
Аватар пользователя @mir0shnik
@mir0shnik написал:

куда и как вам ее выложить? полностью свою или дефолтную?

08.02.2012 20:42
Аватар пользователя @mir0shnik
@mir0shnik написал:
08.02.2012 22:15
Аватар пользователя Spleshka
Spleshka написал:

Вы пропустили первый шаг с добавлением региона в info.файл.

Вам надо открыть mobi_drupal7.info и добавить туда:

regions[mynew_region] = My new region

Да и в template.php я не нашёл имплементации preprocess_theme... Вы точно всё сделали пошагово? Проверьте ещё раз, вы либо ничего не сделали, либо прислали неверный шаблон.

И ещё.. пожалуйста, не используйте артистир для генерации тем. Я не часто ругаюсь, но то, что я там увидел, это пиздец.

09.02.2012 01:24
Аватар пользователя @mir0shnik
@mir0shnik написал:

Нет. Я ничего не пропустил. Просто скинул Вам дефолтную тему скаченную мной с другого ресурса. Я ее сам не делал. Все по Вашей инструкции я сделал. Та же ошибка. Возможно Вы хотите посмотреть на правильность вписания кода - вот вам прикрепляю архив с файлами, в которые вносились изменения.

09.02.2012 11:40
Аватар пользователя Spleshka
Spleshka написал:

У вас всё работает. Просто в node.tpl.php вместо такого:

<?php if ($mynew_region): ?>
  <div class = "mynew_region">
    <?php print render($mynew_region); ?>
  </div>
<?php endif; ?>

Пропишите так:

<?php if (isset($mynew_region)): ?>
  <div class = "mynew_region">
    <?php print render($mynew_region); ?>
  </div>
<?php endif; ?>

А как только вы поместите любой блок в этот регион - он появится в ноде.

09.02.2012 14:12
Аватар пользователя @mir0shnik
@mir0shnik написал:

Прописал так -

if (isset($mynew_region)):

print render($mynew_region);

endif;

Но ничего не появляется после текста ноды перед комментариями.

09.02.2012 16:29
Аватар пользователя Spleshka
Spleshka написал:

@mir0shnik, да быть того не может :) Я всё же очень смотрю в сторону кэша. Если регион на сайте есть, то он просто не может не быть передан в node.tpl.php, ведь вы напрямую выдёргиваете этот регион и ложите его в переменную.

09.02.2012 16:33
Аватар пользователя @mir0shnik
@mir0shnik написал:

Кэш в Drupal почистил. Что блин еще сделать, чтоб он там зараза появился..нервов уже нет(((

09.02.2012 16:35
Аватар пользователя @mir0shnik
@mir0shnik написал:

вот мои блоки, он первый

09.02.2012 16:38
Аватар пользователя Spleshka
Spleshka написал:

Проверьте, работает ли у вас препроцесс. Например, допишите его так:

function mobi_drupal7_preprocess_node(&$vars) {
  drupal_set_message('test');
  $vars['mynew_region'] = block_get_blocks_by_region('mynew_region');
}

У вас на каждой странице должно выводиться сообщение test.

09.02.2012 18:19
Аватар пользователя @mir0shnik
@mir0shnik написал:

Fatal error: Cannot redeclare artx_view_drupal7::mobi_drupal7_preprocess_node() in /home/u585466205/public_html/themes/mobi_drupal7/template.php on line 209

10.02.2012 13:16
Аватар пользователя Spleshka
Spleshka написал:

Так надо не добавлять к предыдущей функции в темплейте, а заменить её. А то получается что одна и та же функция дублируется.

10.02.2012 13:34
Аватар пользователя @mir0shnik
@mir0shnik написал:

Все сделал как сказали. Ошибки уже не высвечиваются, но и блок также как и сообщение test нету.

10.02.2012 17:24
Аватар пользователя Spleshka
Spleshka написал:

Если сообщения test нету - значит, у вас не отрабатывает функция mobi_drupal7_preprocess_node(). И я теперь понял почему :) Переместите эту функцию в самый конец файла, чтобы после неё не было ни одного символа или закрывающей скобки. Просто сейчас она входит в класс artx_view_drupal7, поэтому и не видна Друпалом. После этого сбросьте кэш темы.

11.02.2012 15:03
Аватар пользователя Ситора
Ситора написал:

спасибо, очень помогло!

03.05.2012 13:42
Аватар пользователя Inglar
Inglar написал:

Подскажите пожалуйста что не так, после вставки кода в template.php выходит ошибка "ошибка сервера" как только убираю код все работает, но если нахожусь в админке то есть в overlay то все работает и ошибка не вылазит

PS решился вопрос частично, дело было в других хуках их убрал и все заработало

03.05.2012 21:25
Аватар пользователя Panek
Panek написал:

Для drupal 6 можно просто добавить в node.tpl.php

  <?php if ($page): ?>
    <div class="clear-block"><?php print theme('blocks', 'node_bottom');  ?></div>
  <?php endif; ?>
22.12.2012 18:38
Аватар пользователя Ольга
Ольга написал:

Все получилось с первого раза, регион появился в списке блоков, но вот на странице блок не отображается, тема Mayo. Кэш, разумеется, чистила.

29.12.2012 13:40
Аватар пользователя Гость
Гость написал:

добавила

function mayo_preprocess_node(&$vars) {
  $vars['node_bottom'] = block_get_blocks_by_region('node_bottom');
}

сайт не загружается, пишет

Fatal error: Cannot redeclare mayo_preprocess_node() (previously declared in /var/www/.../sites/all/themes/mayo/template.php:6) in /var/www/.../sites/all/themes/mayo/template.php on line 293
29.12.2012 14:08
Аватар пользователя Ольга
Ольга написал:

Убрала в самый низ, как написано выше

function mayo_preprocess_node(&$vars) {
  $vars['node_bottom'] = block_get_blocks_by_region('node_bottom');
}

, дубль убрала, кэш сбросила, - сайт загружается, но блока так и нет нет (
Буду рада, если поможете.

29.12.2012 14:22
Аватар пользователя Алексей Петрович
Алексей Петрович написал:

Здравствуйте! После вставки кода в template.php белый экран, проверял на темах bartik и garland. Не подскажите, в чем может быть дело?

Включил вывод ошибок:

Fatal error: Cannot redeclare bartik_preprocess_node() (previously declared in /var/www/themes/bartik/template.php:111) in /var/www/themes/bartik/template.php on line 164 Call Stack: 0.0031 639728 1. {main}() /var/www/index.php:0 0.0052 704112 2. drupal_bootstrap() /var/www/index.php:20 0.0382 1690664 3. _drupal_bootstrap_full() /var/www/includes/bootstrap.inc:2212 0.1989 22593936 4. drupal_theme_initialize() /var/www/includes/common.inc:5148 0.1990 22603504 5. _drupal_theme_initialize() /var/www/includes/theme.inc:100 0.2004 22630800 6. call_user_func() /var/www/includes/theme.inc:216 0.2005 22630856 7. phptemplate_init() /var/www/includes/theme.inc:0

23.05.2013 14:00
Аватар пользователя Гость
Гость написал:

О, вот на это ругается (строка 111 template.php):

function bartik_preprocess_node(&$variables) {
if ($variables['view_mode'] == 'full' && node_is_page($variables['node'])) {
$variables['classes_array'][] = 'node-full';
}
}

23.05.2013 14:03
Аватар пользователя Гость
Гость написал:

Решение такое:

function bartik_preprocess_node(&$variables) {
$variables['node_bottom'] = block_get_blocks_by_region('node_bottom');
if ($variables['view_mode'] == 'full' && node_is_page($variables['node'])) {
$variables['classes_array'][] = 'node-full';
}
}

Лишнего не удалил, только заменил в коде из статьи $vars на $variables, вставив эту строчку в существующую функцию. Может кому пригодится)

23.05.2013 14:50
Аватар пользователя Гость
Гость написал:

Сделал по вашей инструкции, все работает. Но проблема в том, что блок выводится даже если содержимое отсутствует. Блок создан через views, выводит похожие продукты под продуктом ubercart'а, сравнивая теги продуктов. Если теги в материале отсутствуют, то блок выводит заголовок "Похожие продукты:", а дальше пустота.. Как можно скрыть блок, если блок пустой? :)

28.07.2013 13:47
Аватар пользователя Владимир18
Владимир18 написал:

Ошибка:

<?php if ($comment_region): ?>
  <div class = "comment-region">
    <?php print $comment_region; ?>
  </div>
<?php endif; ?>

Правильно:

<?php if ($comment_region): ?>
  <div class = "comment-region">
    <?php print render($comment_region); ?>
  </div>
<?php endif; ?>
07.09.2013 23:00
Аватар пользователя Spleshka
Spleshka написал:

Спасибо, подправил.

09.09.2013 11:26
Аватар пользователя я
я написал:

Сделал всё как в статье, наконец-то почти получилось, появился регион Node Bottom...
Но! Если добавлять в него блоки, то они отображаются всё равно НИЖЕ комментариев!
Отчего так?

27.04.2014 22:26
Аватар пользователя Катюша
Катюша написал:

Подскажите, как быть если функция mytheme_preprocess_node уже определена, но с другой переменной?

29.05.2014 19:58
Аватар пользователя Ksanka
Ksanka написал:

Всё отлично работает. Благодарю. Но возник небольшой вопрос: как можно вывести этот регион в полной ноде, скажем, после 3 и (или) 7 абзаца? Заранее благодарю.

10.08.2014 20:19
Аватар пользователя Lilo
Lilo написал:

Спасибо.

03.01.2015 13:25
Аватар пользователя рауф
рауф написал:

Спасибо. Это работает

13.01.2015 01:02
Аватар пользователя Den
Den написал:

Подскажите, в шаблон ноды добавил код
if (isset($projectsidebar)):

print render($projectsidebar);

endif;

в template.php

function vsezashita_preprocess_node(&$vars) {
drupal_set_message('test');
  // Получаем регион и ложим его в массив переменных для ноды
  $vars['projectsidebar'] = block_get_blocks_by_region('projectsidebar');
}

Но ничего в ноде ничего не выводится

24.01.2015 18:42
Аватар пользователя Den
Den написал:

Нашел такое решение (контент в нем выводится, но нет ссылок на редактирование, как добавить - не знаю, а хотелось бы)

	$block = module_invoke('block', 'block_view', '4');
	if ($block['content']) {
    $output = "<div class='projectsidebar-block'>\n";
    $output .= "<div id='projectsidebar-block-title'><h2>".$block['subject']."</h2></div>\n";
    $output .= "<div class='projectsidebar-block-content'>".$block['content']."</div>\n";
	$output .= "<div class='projectsidebar-block-module'>".$block['module']."</div>\n";
    $output .= "</div>\n";
    print $output;
  }
24.01.2015 18:59
Аватар пользователя Sipth
Sipth написал:

Как проверить что для комментариев используется именно файл comment.tpl.php ?
такое впечатление что не он. Я его переименовываю, а комментам хоть бы что..

17.11.2015 01:01
Аватар пользователя Sipth
Sipth написал:

нашел... файл тот, да сайт был не тот...

p.s. а подписаться на комменты надо все же сделать...

17.11.2015 23:42

Комментировать