УрокДобавляем регион в ноду или комментарий
По умолчанию все созданные регионы доступны только в 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; ?>
- Spleshka
- 02.11.2011
- 27750
Комментарии
Супер, я это применю для вывода блока вьюхи «похожие материалы» спасиб
круто)
p.s чё такая капча длинная?)
Вид конечно страшный, зато непробиваемая :) Надо будет подкрутить.
если понадобится что-то присобачить ко вьюзу а не блоку, то советую этот модуль
EVA: Entity Views Attachment
Спасибо. Хорошее решение!
А таким же образом можно вывести содержимое региона и в block.tpl.php? И вообще этот способ раотает только для друпал7 или для друпал6 тоже подойдет?
Вывести содержимое региона в блок ?)) Можно конечно, но логический смысл отношений региона и блока теряется.
И этот метод не работает в Drupal 6, т.к. там нет фунции block_get_blocks_by_region()
Сделал все как написано по инструкции - у меня высечивается вот такая ошибка -
Notice: Undefined variable: mynew_region в функции include() (строка 66 в файле /home/u585466205/public_html/themes/mobi_drupal7/node.tpl.php).
вот мой сайт - http://master-tgn.16mb.com
После того как всё сделали, вы кэш очищали сайта?
Да, кэш почистил. и не раз.
Все сделал по Вашим пунктам, единственное, у меня регион называется - 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).
выложите тему в архиве.
куда и как вам ее выложить? полностью свою или дефолтную?
вот архив с темой
Вы пропустили первый шаг с добавлением региона в info.файл.
Вам надо открыть mobi_drupal7.info и добавить туда:
Да и в template.php я не нашёл имплементации preprocess_theme... Вы точно всё сделали пошагово? Проверьте ещё раз, вы либо ничего не сделали, либо прислали неверный шаблон.
И ещё.. пожалуйста, не используйте артистир для генерации тем. Я не часто ругаюсь, но то, что я там увидел, это пиздец.
Нет. Я ничего не пропустил. Просто скинул Вам дефолтную тему скаченную мной с другого ресурса. Я ее сам не делал. Все по Вашей инструкции я сделал. Та же ошибка. Возможно Вы хотите посмотреть на правильность вписания кода - вот вам прикрепляю архив с файлами, в которые вносились изменения.
У вас всё работает. Просто в node.tpl.php вместо такого:
Пропишите так:
А как только вы поместите любой блок в этот регион - он появится в ноде.
Прописал так -
if (isset($mynew_region)):
print render($mynew_region);
endif;
Но ничего не появляется после текста ноды перед комментариями.
@mir0shnik, да быть того не может :) Я всё же очень смотрю в сторону кэша. Если регион на сайте есть, то он просто не может не быть передан в node.tpl.php, ведь вы напрямую выдёргиваете этот регион и ложите его в переменную.
Кэш в Drupal почистил. Что блин еще сделать, чтоб он там зараза появился..нервов уже нет(((
вот мои блоки, он первый
Проверьте, работает ли у вас препроцесс. Например, допишите его так:
У вас на каждой странице должно выводиться сообщение test.
Fatal error: Cannot redeclare artx_view_drupal7::mobi_drupal7_preprocess_node() in /home/u585466205/public_html/themes/mobi_drupal7/template.php on line 209
Так надо не добавлять к предыдущей функции в темплейте, а заменить её. А то получается что одна и та же функция дублируется.
Все сделал как сказали. Ошибки уже не высвечиваются, но и блок также как и сообщение test нету.
Если сообщения test нету - значит, у вас не отрабатывает функция mobi_drupal7_preprocess_node(). И я теперь понял почему :) Переместите эту функцию в самый конец файла, чтобы после неё не было ни одного символа или закрывающей скобки. Просто сейчас она входит в класс artx_view_drupal7, поэтому и не видна Друпалом. После этого сбросьте кэш темы.
спасибо, очень помогло!
Подскажите пожалуйста что не так, после вставки кода в template.php выходит ошибка "ошибка сервера" как только убираю код все работает, но если нахожусь в админке то есть в overlay то все работает и ошибка не вылазит
PS решился вопрос частично, дело было в других хуках их убрал и все заработало
Для drupal 6 можно просто добавить в node.tpl.php
Все получилось с первого раза, регион появился в списке блоков, но вот на странице блок не отображается, тема Mayo. Кэш, разумеется, чистила.
добавила
сайт не загружается, пишет
Убрала в самый низ, как написано выше
, дубль убрала, кэш сбросила, - сайт загружается, но блока так и нет нет (
Буду рада, если поможете.
Здравствуйте! После вставки кода в 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
О, вот на это ругается (строка 111 template.php):
function bartik_preprocess_node(&$variables) {
if ($variables['view_mode'] == 'full' && node_is_page($variables['node'])) {
$variables['classes_array'][] = 'node-full';
}
}
Решение такое:
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, вставив эту строчку в существующую функцию. Может кому пригодится)
Сделал по вашей инструкции, все работает. Но проблема в том, что блок выводится даже если содержимое отсутствует. Блок создан через views, выводит похожие продукты под продуктом ubercart'а, сравнивая теги продуктов. Если теги в материале отсутствуют, то блок выводит заголовок "Похожие продукты:", а дальше пустота.. Как можно скрыть блок, если блок пустой? :)
Ошибка:
Правильно:
Спасибо, подправил.
Сделал всё как в статье, наконец-то почти получилось, появился регион Node Bottom...
Но! Если добавлять в него блоки, то они отображаются всё равно НИЖЕ комментариев!
Отчего так?
Подскажите, как быть если функция mytheme_preprocess_node уже определена, но с другой переменной?
Всё отлично работает. Благодарю. Но возник небольшой вопрос: как можно вывести этот регион в полной ноде, скажем, после 3 и (или) 7 абзаца? Заранее благодарю.
Спасибо.
Спасибо. Это работает
Подскажите, в шаблон ноды добавил код
if (isset($projectsidebar)):
print render($projectsidebar);
endif;
в template.php
Но ничего в ноде ничего не выводится
Нашел такое решение (контент в нем выводится, но нет ссылок на редактирование, как добавить - не знаю, а хотелось бы)
Как проверить что для комментариев используется именно файл comment.tpl.php ?
такое впечатление что не он. Я его переименовываю, а комментам хоть бы что..
нашел... файл тот, да сайт был не тот...
p.s. а подписаться на комменты надо все же сделать...
Комментировать