Регионы
Регионы - это заданные заранее “зоны”, в которых можно разместить любую информацию, включая блоки Друпала, меню, 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, см. пример:
<div id="sidebar-left" class="sidebar">
<?php print $sidebar_left ?>
</div>
<?php endif; ?>
Еще отсебятина: Пока мое понимание Друпала сильно поверхностно, так что рассуждаю по пути. В моем понимании регионы - сущность более низкого уровня, чем блоки, в плане работы над темами и содержимым. Управление блоками вынесено в панель управления системой, а управлять регионами приходится с помощью прямого редактирования файлов .tpl.php. Работа с блоками контролируется Друпалом, со всеми вытекающими - контроль доступа (отображения и управления) и т.п. Работа с регионами полностью контролируется тем, кто программирует тему. Блок - изначально унифицирован в плане отображения (но это можно поправить, т.к. у них есть ID ); регион - изначально планируется уникальным, визуально. Здесь я не хочу сказать, плохо тут что-то или хорошо - просто нужно как-то разобраться, и держать в голове, когда создать лишний регион будет, к примеру, выгоднее или удобнее, чем тот же блок, или наоборот.
Комментарии
В FAQ.
---------------------------
С уважением, Борис Вольфсон
Уже копится много инфы. Хотим handbooks на drupal.ru
Они типа есть, но можно ли туда писать?
Сам хотел об этом же спросить.
а вместо
!$vars['teaser']
можно использовать
$vars['image']
???
а для drupal 4.7
???
А что делать для 6.x ?
Для 6 версии читайте http://www.drupal.ru/node/12719
Решение было сохранено на сайте DrupalCookBook.ru:
Добавить регионы в тему оформления.
Авторы, предложившие решения, также указаны в сохранённой статье.
благодаря этому примеру (№1 в этом посте), у меня, похоже, накрылись боковые панели и "шапка" сайта. Рад, что делал эту "операцию" на домашней копии сайта. Похоже, что в результате изменения скрипта template изменяется база SQL сайта, т.е. панели удаляются как таковые:)
Может я и не прав, но восстановить их не могу. Буду качать базу заново и тестировать еще раз.
Важно замечание отсюда http://drupal.org/node/171224
.....
Содержание файла .info кэшируется Друпалом в базе данных. Поэтому простое изменение .info файла не будет заметно, пока не сделать одно из следующих действий:
- пока не нажать кнопку "Clear" здесь "Administer > Site configuration > Performance";
- либо пока на нажать кнопку очистить кэш в модуле Девел;
- либо пока просто не посетить страницу выбора темы "Administer > Site building > Themes".
.......
И еще там сказано, что при использовании собственных регионов стандартные затираются, поэтому стандартные области надо тоже вписывать в список в файле .info
а объясните, пожалуйста, если я добавляю регион в "чужой" теме, то каким образом мне обезопаситься от того, что при обновлении темы ее разработчиком мои изменения потеряются?
Спасибо за ответ!
Обновлять аккуратно, перенося сделанные вами изменения.
Либо сделать свою копию темы и не бояться обновлений
У меня после добавления региона при заходе в меню блоков высвечивается:
Блок Переключатель языка был назначен неверной области left и поэтому был деактивирован.
У меня та же байда. Никто не знает выхода с положения?
Да, как раз то что нужно. Спасибо.
добавил в .info
регион:
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) чистил кэшы, отключал тему
блок не появляется на сайте, куда копать дальше?
Можно ли переименовать регионы? А то у меня какая-то несуразность:
Первая боковая панель
Second sidebar
Даже не помню, как такое получилось.