Создание встроенного inline региона в Drupal 6.x

Главные вкладки

Аватар пользователя Oboggy Oboggy 9 августа 2008 в 17:35

Как создавать inline регионы для пятерки известно. Для Drupal 6.х это делается так - в файле template.php вашей темы добавьте следующую функцию:

<?php
function THEMENAME_preprocess_node(&$variables){
    if(!$vars['teaser']) {
       // Load region content assigned via blocks.
       foreach (array('instory') as $region) {
         $variables[$region] = theme('blocks', $region);
       }
    }
}
?>

Рассмотрим функцию подробней:
THEMENAME_preprocess_node - название функции, "THEMENAME" следует заменить на имя вашей темы
foreach (array('instory') as $region) {
$variables[$region] = theme('blocks', $region) - прицепить к массиву переменных ноды переменную instory
instory - имя вашего региона (можете задать другое имя)

Чтобы регион стал доступен, добавьте в файл THEMENAME.info вашей темы строку

regions[instory] = instory

Далее следует "напечатать" этот регион в файле node.tpl.php в нужном вам месте.
Например, чтобы регион отображался над блоком материала:

    <?php print $instory ?> //вывод нашего региона
    <?php print $content ?> //вывод основного материала ноды

Чтобы регион отображался под блоком материала:

    <?php print $content ?> //вывод основного материала ноды
    <?php print $instory ?> //вывод нашего региона

Дополнительно:

Рекомендуемая конструкция для вывода региона:

<?php if ($instory): ?>  // проверяем есть ли блоки в регионе instory
      <?php print $instory ?> // печатаем регион instory
<?php endif; ?>  // цикл завершен

Если вы хотите, чтобы регион не отображался в режиме тизера, используйте следующую конструкцию в template.php (вместо приведенной выше):

<?php
function phptemplate_preprocess_node(&<strong>$vars</strong>) {
if (!$vars['teaser']){
         foreach (array('instory') as $region) {
         $vars[$region] = theme('blocks', $region);
    }
 }
}
?>

Комментарии

Аватар пользователя Antoniy Antoniy 9 августа 2009 в 12:05

Я сделал: получилось.

Но, если в theme.info изначально не прописаны регионы, то при прописывании там "regions[instory] = instory", те регионы, что тема выводила ранее, аннулируются, будет ошибка на странице администрирования блоков (типа, регион такой-то определен не верно) (напрмер, с Garland так), ибо регионы там изначально стандартные и выводятся за счет phptemplate.

Что бы этого избежать, надо в theme.info вместе с новым регионом "regions[instory] = instory" прописать те, которые выводились, т. е. так:

regions[header] = Header
regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[instory] = instory
regions[footer] = Footer

И в том порядке, в котором они должны быть.

Аватар пользователя Izem Izem 4 сентября 2009 в 3:56

function phptemplate_preprocess_node(&<strong>$vars</strong>) {

Oboggy, в этой строке ошибка — <strong></strong> в PHP-коде откуда-то появились. Исправьте, пожалуйста.

PS: Спасибо огромное за статью - информация очень пригодилась!

Аватар пользователя TV-Child TV-Child 13 февраля 2012 в 13:53

Вроде бы все делал как написано. В Блоках появился новый регион. Перенес из подвала нужные блоки и они просто ИСЧЕЗЛИ. То есть регион сам не отображается (и в Блоках желтой метки с надписью региона тоже нет). Название instory сохранял, THEMENAME менял на свое. В THEMENAME.info добавлял строчку regions[instory] = instory. В tamplate.php пробовал выводить и через print и echo. Даже не знаю в чем может быть еще проблема =(? Может я не туда вставил php код в tamplate.php?

Аватар пользователя Antoniy Antoniy 28 февраля 2012 в 1:21

Надо еще прописывать, помимо themename.info, в page.tpl.php, а в tamplate.php необязательно, если только нет каких-то особых требований к выводу контента в новом регионе и т. п.