(phptemplate) Регионы

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

Аватар пользователя marazmus marazmus 20 января 2007 в 10:49

Регионы

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

По умолчанию в движке PHPTemplate уже определены 5 регионов - левый, правый, содержимое, верхняя часть и нижняя часть. Соответственно, имена переменных, содержащих эти регионы: $sidebar_left, $sidebar_right, $content, $header, $footer_message.

Чтобы вывести в браузер содержимое этих регионов, в файле page.tpl.php нужно напечатать их с помощью оператора print:
<?php print $header; ?>

(подставьте вместо $header имена других переменных регионов, соответственно).

Начиная с версии 4.7, Друпал поддерживает любое количество регионов. Новые регионы можно определять (добавлять) самому, и размещать в самых разных местах шаблона (даже внутри нод).

Определение своих регионов.

Друпал версии 5.х

Для определения своих регионов нужно использовать ловушку _regions(). Система ловушек проста в использовании, и предполагает, что вы сделаете следующие шаги:

1. К примеру, ваша тема называется bluebox и располагается в каталоге /themes/bluebox.
2. Если в составе вашей темы уже есть файл template.php, то редактируйте его; если нет, то создайте новый файл template.php внутри каталога вашей темы. Все фунции, переопределенные внутри этого файла, будут использованы системой шаблонов Друпала вместо исходных функций.
3. Создайте в файле template.php функцию с именем bluebox_regions(), и определите внутри нее имена нужных вам регионов.

Пример кода:
<?php
function bluebox_regions() {
return array(
'right' => t('right sidebar'),
'content' => t('content'),
'header' => t('header'),
'footer' => t('footer'),
'content_header' => t('header of main content'),
'inline_for_node' => t('inline region for nodes')
);
}
?>

Разберем данный пример.

Имя функции - bluebox_regions().

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

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

Также мы видим, что регион $left “пропал” - мы переопределили список регионов на свой. Зато добавились регионы $content_header и $inline_for_node.

Друпал версии 6.х

Для создания своих областей сайта в D6 необходимо прописать в файл {teme}.info темы такие строчки:

<?php
regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer
regions[header2] = Header2
regions[header3] = Header3
?>

left,right,content,header,footer уже есть по умолчанию .. header2, header3 - новые области

После этого определить их нахождение в page.tpl.php

<?php print $header2; ?>

Не забыть нажать в Управление сайтом->Производительность->Очистить кэш

Спасибо Rel - http://www.drupal.ru/node/12719

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

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

Чтобы использовать эту возможность, нам снова нужен файл 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 в коде

foreach (array('inline_for_node') as $region)

на имя своего региона.

Пример определения регионов для нод типа ‘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;
}
?>

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

Тут идет практически "голый" перевод документации с drupal.org - мои познания в этом вопросе крайне скромны.

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

Для этого нужно воспользоваться функцией drupal_set_content().

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

1) В коде вашего модуля задайте содержимое для переменной региона.

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

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

2) В функции _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;
}
?>

3) Теперь наши переменные регионов доступны в шаблоне page.tpl.php (как было определено на шаге 2), и мы можем напечатать их через <?php print $region1; ?>.

Важные примечания

В том числе и из комментов к статьям документации на drupal.org

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

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

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

Хорошим тоном будет проверять вывод ваших регионов в шаблоне с помощью оператора IF, см. пример:

  <?php if ($sidebar_left): ?>
    <div id="sidebar-left" class="sidebar">
      <?php print $sidebar_left ?>
    </div>
  <?php endif; ?>

Еще отсебятина: Пока мое понимание Друпала сильно поверхностно, так что рассуждаю по пути. В моем понимании регионы - сущность более низкого уровня, чем блоки, в плане работы над темами и содержимым. Управление блоками вынесено в панель управления системой, а управлять регионами приходится с помощью прямого редактирования файлов .tpl.php. Работа с блоками контролируется Друпалом, со всеми вытекающими - контроль доступа (отображения и управления) и т.п. Работа с регионами полностью контролируется тем, кто программирует тему. Блок - изначально унифицирован в плане отображения (но это можно поправить, т.к. у них есть ID Smile ); регион - изначально планируется уникальным, визуально. Здесь я не хочу сказать, плохо тут что-то или хорошо - просто нужно как-то разобраться, и держать в голове, когда создать лишний регион будет, к примеру, выгоднее или удобнее, чем тот же блок, или наоборот.

Комментарии

Аватар пользователя AndreyL AndreyL 27 октября 2008 в 1:41

благодаря этому примеру (№1 в этом посте), у меня, похоже, накрылись боковые панели и "шапка" сайта. Рад, что делал эту "операцию" на домашней копии сайта. Похоже, что в результате изменения скрипта template изменяется база SQL сайта, т.е. панели удаляются как таковые:)
Может я и не прав, но восстановить их не могу. Буду качать базу заново и тестировать еще раз.

Аватар пользователя Jean Jack Jean Jack 11 марта 2009 в 21:22

Важно замечание отсюда http://drupal.org/node/171224

.....
Содержание файла .info кэшируется Друпалом в базе данных. Поэтому простое изменение .info файла не будет заметно, пока не сделать одно из следующих действий:
- пока не нажать кнопку "Clear" здесь "Administer > Site configuration > Performance";
- либо пока на нажать кнопку очистить кэш в модуле Девел;
- либо пока просто не посетить страницу выбора темы "Administer > Site building > Themes".

.......

И еще там сказано, что при использовании собственных регионов стандартные затираются, поэтому стандартные области надо тоже вписывать в список в файле .info

Аватар пользователя hbond hbond 17 июня 2009 в 18:58

а объясните, пожалуйста, если я добавляю регион в "чужой" теме, то каким образом мне обезопаситься от того, что при обновлении темы ее разработчиком мои изменения потеряются?
Спасибо за ответ!

Аватар пользователя WiseMan WiseMan 22 июня 2009 в 8:47

"hbond" wrote:
каким образом мне обезопаситься от того, что при обновлении темы ее разработчиком мои изменения потеряются?

Обновлять аккуратно, перенося сделанные вами изменения.

Либо сделать свою копию темы и не бояться обновлений Wink

Аватар пользователя Zen Zen 30 июня 2009 в 20:05

У меня после добавления региона при заходе в меню блоков высвечивается:
Блок Переключатель языка был назначен неверной области left и поэтому был деактивирован.

Аватар пользователя moroz-6600i moroz-6600i 7 сентября 2009 в 23:14

Zen wrote:
У меня после добавления региона при заходе в меню блоков высвечивается:
Блок Переключатель языка был назначен неверной области left и поэтому был деактивирован.

У меня та же байда. Никто не знает выхода с положения?

Аватар пользователя chel chel 13 августа 2010 в 19:30

добавил в .info
регион:

regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer
regions[mymymy] = мой

и в файл темы page.tpl.php
<?php print $mymymy; ?>

1) в блоках он отображается admin/build/block (причем просто подсвечивается цветом)
2) создал в папке своей темы файлик block-mymymy.tpl.php
в файл вставлял любой текст
3) на всякий случай скопировал в папку с темой block.tpl.php
4) чистил кэшы, отключал тему

блок не появляется на сайте, куда копать дальше?

Аватар пользователя DenisVS DenisVS 13 октября 2011 в 9:16

Можно ли переименовать регионы? А то у меня какая-то несуразность:

Первая боковая панель
Second sidebar

Даже не помню, как такое получилось.