Создание нового региона в теме для Drupal`a

 В движке PHPTemplate определены только 5 регионов - левый, правый, содержимое, верхняя часть и нижняя часть. Нужно в шаблоне темы создать новый нестандартный регион (region) для размещения блоков.

Решение

Регионы - это заданные заранее “зоны”, в которых можно разместить любую информацию, включая блоки Друпала, меню, PHP-код или просто html.

При переопределении стандартных блоков своими в функции ИмяТемы_regions() обязательно оставляйте два стандартных региона - $content и $footer_message. Регион $content нужен Друпалу для вывода основного содержимого сайта, а регион $footer_message используется в панели управления для задания содержания нижней части сайта.

Поправка: регион $content также не обязателен, т.к. эта переменная просто добавляет свое содержимое к основному содержимому страницы (ноды).

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

Варианты решений

Добавить регионы в файле темы

Drupal 6

  • В файле 'имя_темы.info':
    regions[left] = Left sidebar
    regions[right] = Right sidebar
    regions[content] = Content
    regions[header] = Header
    regions[footer] = Footer
    regions[footer] = Footer
    regions[new_region] = New Region

    Обратите внимание
    Все стандартные регионы (например из темы garland) должны быть прописаны вместе с новым.

  • В шаблоне страницы page.tpl.php вызываем переменные, обьявленные в 'имя_темы.info':
    <?php if ($new_region): ?>
    <?php print $new_region ?>
    <?php endif; ?>
  • Нужно очистить кэш на странице Управление сайтом->Производительность->Очистить кэш (http://example.com/clearjscache) или выключить и снова включить тему

Drupal 5

Функция theme_regions позволяет задать массив идентификаторов регионов, которые используются в теме оформления и их названия.

  • В папке темы создать файл template.php, если его нет.
  • В файле template.php объявить функцию, если её нет:
    function имя_темы_regions() {
        return array(       
            'right' => t('right sidebar'),
            'content' => t('content'),
            'header' => t('header'),
            'footer' => t('footer'),
            'new_region' => t('new region') // <-- объявлен новый регион
        );
    }

    Обратите внимание
    В названии функции нужно указать название темы.

  • В файле темы оформления page.tpl.php добавить:
    <?php if ($new_region): ?>

    <?php print $new_region ?>

    <?php endif; ?>

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

Обычно регионы содержат данные блоков, назначенные им с помощью панели управления Друпала. Но иногда бывает нужно определить регион, в который не нужно (согласно какой-то логике работы сайта) вносить данные блоков - т.е. регион не будет доступен системе блоков Друпала. Для этого нужно воспользоваться функцией drupal_set_content().

Примерный алгоритм:

  • В коде вашего модуля задайте содержимое для переменной региона.
    <?php
      $output = 'whatever';
      drupal_set_content('region1', $output);
    ?>

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

  • В функции _phptemplate_variables() задайте область шаблона, в которой будет доступен регион (здесь это ‘page’, т.е. общий шаблон страницы), и “прицепите” переменные ваших регионов к общему массиву переменных регионов через функцию drupal_get_content().
    <?php
    function _phptemplate_variables($hook, $variables) {
      // Load region content assigned via drupal_set_content().
      if ($hook == 'page') {
        foreach (array('region1', 'region2') as $region) {
          $variables[$region] = drupal_get_content($region);
        }
      }
      return $variables;
    }
    ?>
  • Теперь наши переменные регионов доступны в шаблоне page.tpl.php (как было определено на предыдущем шаге), и мы можем напечатать их:
    <?php print $region1; ?>

"Встроенные" (inline) регионы

Механизм шаблонов позволяет так же располагать регионы не только в пределах основного шаблона (page.tpl.php), но и в пределах более мелких шаблонов - типа node, page, comment, blog и т.п.

Drupal6

  • В файле template.php вашей темы добавьте следующую функцию:
    <?php
    // instory - имя вашего региона (можете задать другое имя)
    // "THEMENAME" следует заменить на имя вашей темы.
    function THEMENAME_preprocess_node(&$variables){ 
        if(!$variables['teaser']) {
           // Load region content assigned via blocks.
           // Прицепить к массиву переменных ноды переменную instory
           foreach (array('instory') as $region) {
             $variables[$region] = theme('blocks', $region);
           }
        }
    }
    ?>
  • Чтобы регион стал доступен, добавьте в файл THEMENAME.info вашей темы строку
    regions[instory] = instory
  • Далее следует "напечатать" этот регион в файле node.tpl.php в нужном вам месте
    <?php if ($instory): ?>  // проверяем есть ли блоки в регионе instory
          <?php print $instory ?> // печатаем регион instory
    <?php endif; ?>

Drupal 5

  • Открыть файл template.php для вашей темы.
  • Найти функцию _phptemplate_variables() или создать её, если ее нет. Именно в этой функции нужно определять, какой регион для какого типа нод будет доступен (передан в шаблон для этого типа ноды). Функция вызывается автоматически.

Пример и принцип работы

 

<?php
function _phptemplate_variables($hook, $variables) {
  // Load the node region only if we're not in a teaser view.
  if ($hook == 'node' && !$vars['teaser']) {
    // Load region content assigned via blocks.
    foreach (array('inline_for_node') as $region) {
      $variables[$region] = theme('blocks', $region);
    }
  }
  return $variables;
}
?>

 

Переменная $hook при вызове содержит тип ноды, для которой идет обработка шаблона. В нашем случае этот тип ‘node’. Проверяем переменную, и идем дальше, если она содержит строку ‘node’.

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

Далее (в двух следующих строках) мы “прицепляем” к массиву переменных ноды еще одну переменную, которая содержит наш регион. Теперь наш регион будет доступен в виде переменной $inline_for_node в файле node.tpl.php, где мы сможем вызвать его содержимое с помощью

<?php print $inline_for_node; ?>

 

Настройка
Для своих имен регионов просто замените строку inline_for_node на имена своих регионов через запятую.

Пример определения регионов для нод типа ‘node’ и ‘comment’:

<?php
function _phptemplate_variables($hook, $variables) {
  // Load region content assigned via blocks.
  // Load the node region only if we're not in a teaser view.
  if ($hook == 'node' && !$vars['teaser']) {
    foreach (array('node1', 'node2') as $region) {
      $variables[$region] = theme('blocks', $region);
    }
  }
  else if ($hook == 'commment') {
    foreach (array('comment1', 'comment2') as $region) {
      $variables[$region] = theme('blocks', $region);
    }
  }
  return $variables;
}
?>

Автора автора