Добавление регионов

Темы могут содержать любое количество регионов в которых могут выводиться блоки. Если вы зайдёте на страницу Administer → Site building → Blocks, то вы увидите, что регионы это всего лишь контейнеры в которых можно размещать блоки. Используя PHP, можно добавить содержание, которое будет выводиться не только в том регионе в котором расположен блок с PHP-кодом, а в любом месте страницы (например HTML-теге <head>).

Стандартно, PHPTemplate определяет пять регионов: left, right, content, header и footer. Эти регионы выводятся в шаблоне page.tpl.php соответственно переменными $sidebar_left, $sidebar_right, $content, $header и $footer_message.

Добавление региона для страниц

Если вы захотите иметь свой набор регионов темы, вы можете сделать это используя хук _regions(). В этом случае, определённые вами регионы перекроют регионы определённые в PHPTemplate по умолчанию.

Если в папке вашей темы нет файла template.php, то создайте его и добавьте в него функцию ТЕМА_regions() (под словом ТЕМА имеется ввиду системное название темы), чтобы определить регионы. Каждый регион должен иметь название и описание. В примере ниже, к пяти стандартным регионам добавлен новый — inline 1.

<?php
function ТЕМА_regions() {
  return array(
   
'right' => t('right sidebar'),
   
'content' => t('content'),
   
'header' => t('header'),
   
'footer' => t('footer'),
   
'floater' => t('floater'),
   
'inline1' => t('inline 1')
  );
}
?>

При определении региона, в левой части пишется его системное название, — inline1. Это название станет названием переменной в файле page.tpl.php.

В правой части пишется описание, — inline 1. Это название будет показываться на странице Administer → Site building → Blocks. Для использования региона, в файле page.tpl.php достаточно использовать запись

<?php print $inline1;?>

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

Стандартно, все определяемые регионы обрабатываются файлом page.tpl.php, но использовав дополнительный шаг, можно определить регионы, которые можно будет использовать в других шаблонах — node.tpl.php, comment.tpl.php...

Для этого определите в файле template.php функцию _phptemplate_variables(). При вызове этой функции, она может получить аргументы функции $hook. В нашем случае это будет node), что позволит использовать новый регион в шаблоне node.tpl.php

<?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('inline1') as $region) {
     
$variables[$region] = theme('blocks', $region);
    }
  }
  return
$variables;
}
?>

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

Теперь, вы можете использовать переменную региона в шаблоне node.tpl.php.

<div class="node<?php if ($sticky) { print " sticky"; } ?><?php if (!$status) { print " node-unpublished"; } ?>">
  <?php if ($picture) {
    print
$picture;
  }
?>

  <?php if ($page == 0) { ?><h2 class="title"><a href="<?php print $node_url?>"><?php print $title?></a></h2><?php }; ?>
  <span class="submitted"><?php print $submitted?></span>
  <span class="taxonomy"><?php print $terms?></span>
  <div class="content"><div class="inline1"><?php print $inline1?></div><?php print $content?></div>
  <?php if ($links) { ?><div class="links">&raquo; <?php print $links?></div><?php }; ?>
</div>

Т.к. переменные документов обрабатываются и другими шаблонами, вы можете также настроить вывод и в них. В примере ниже, регионы определены для документов и комментариев.

<?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' && !$variables['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;
}
?>

Регионы без блоков

Если вы хотите вывести содержание в регионе, но не хотите выводить это содержание через блоки, используйте функцию drupal_set_content(). Это позволит обойти стандартную систему блоков.

Вы можете использовать названия регионов, которые не формируются функцией ТЕМА_regions(). В этом случае, регионы не будут доступны для блоков. Предположим, что добавляемые регионы называются region1 и region2. В коде модуля, используйте следующую запись.

<?php
$output
= 'whatever';
drupal_set_content('region1', $output);
?>

В файле template.php определите переменные и назначьте регионам содержание.

<?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; ?>