(phptemplate) Регионы
Прислано: marazmus
сб, 20/01/2007 - 07: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 :) ); регион - изначально планируется уникальным, визуально. Здесь я не хочу сказать, плохо тут что-то или хорошо - просто нужно как-то разобраться, и держать в голове, когда создать лишний регион будет, к примеру, выгоднее или удобнее, чем тот же блок, или наоборот.
- marazmus's blog
- Для комментирования войдите или зарегистрируйтесь
В FAQ.
---------------------------
С уважением, Борис Вольфсон
- Для комментирования войдите или зарегистрируйтесь
Уже копится много инфы. Хотим handbooks на drupal.ru :)
Они типа есть, но можно ли туда писать?
- Для комментирования войдите или зарегистрируйтесь
Сам хотел об этом же спросить.
- Для комментирования войдите или зарегистрируйтесь
а вместо
!$vars['teaser']
можно использовать
$vars['image']
???
а для drupal 4.7
???
- Для комментирования войдите или зарегистрируйтесь
А что делать для 6.x ? =)
- Для комментирования войдите или зарегистрируйтесь
А что делать для 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 и поэтому был деактивирован.
- Для комментирования войдите или зарегистрируйтесь
Да, как раз то что нужно. Спасибо.
- Для комментирования войдите или зарегистрируйтесь
У меня после добавления региона при заходе в меню блоков высвечивается:
Блок Переключатель языка был назначен неверной области left и поэтому был деактивирован.
У меня та же байда. Никто не знает выхода с положения?
- Для комментирования войдите или зарегистрируйтесь
добавил в .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) чистил кэшы, отключал тему
блок не появляется на сайте, куда копать дальше?
- Для комментирования войдите или зарегистрируйтесь
Можно ли переименовать регионы? А то у меня какая-то несуразность:
Первая боковая панель
Second sidebar
Даже не помню, как такое получилось.
- Для комментирования войдите или зарегистрируйтесь












Комментарии