Введение
По умолчанию, система шаблонов дает возможность работать с шаблонами page (общий шаблон сайта), node (шаблон документа), comment (шаблон комментария), block (шаблон блока) и box (шаблон общего контейнера). Эти шаблоны находятся в файлах page.tpl.php, node.tpl.php, comment.tpl.php, block.tpl.php и box.tpl.php, соответственно.
Суть в том, что система шаблонов уже сформировала для этих шаблонов все необходимые переменные, и нам остается только разместить с помощью операторов php значения этих переменных в нужных нам местах (внутри тегов html).
Пример: Кусок кода из page.tpl.php
Но часто требуется определить свою структуру отображения с помощью html не только для вышеприведенных структур, но и для более мелких блоков информации. К примеру, мы хотим переопределить отображение “хлебных крошек” (breadcrumbs) на что-то более подходящее нам по дизайну html-кода. Или переопределить вывод массива $links на более подходящий нам по структуре html-тегов. В итоге, нужно получить файл .tpl.php, в котором мы можем определить нужные нам html-теги, и заполнить их информацией из переменных php (аналогично page.tpl.php, node.tpl.php и т.д.). То есть, нам нужно отделить html-код от логики работы приложения (для тех структур данных, которым не предусмотрен “свой” файл .tpl.php).
Перекрытие функции
Для этого нам потребуется файл template.php. Если его нет в каталоге темы, нужно его создать.
Теперь определимся с функцией, что формирует тот “кусок” html-кода, который мы хотим переопределить на свой. Возьмем, к примеру, функцию theme_breadcrumb(). Вот ее код (находится в файле /includes/theme.inc):
if (!empty($breadcrumb)) {
return '<div class="breadcrumb">'. implode(' » ', $breadcrumb) .'</div>';
}
}
Можно, конечно, поправить код вывода прямо здесь, в файле theme.inc - но это будет, во-первых, вмешательством в код “ядра” Друпала - что повлечет за собой проблемы при последующих обновлениях (придется следить за каждым файлом ядра, в который вы внесли свои изменения). Во-вторых, это противоречит нашей задаче - получить конкретный файл .tpl.php в пределах нашей темы, который можно будет менять, как нам будет необходимо.
Здесь нам поможет система “ловушек” Друпала, суть которой в том, что она использует определенным образом имена функций в логике своей работы. Поясним сразу на примере. Если наша тема называется, к примеру, bluebox, то вышеприведенную функцию theme_breadcrumb() достаточно “перекрыть по имени” - назвать ее bluebox_breadcrumb().
Система шаблонов построена таким образом, что взаимодействует с системой ловушек, и перед окончательным формированием шаблона ищет функции, которые могут быть перекрыты создателем этой темы. “Сигналом” того, что данная функция перекрыта, и нужно использовать ее (функцию темы), а не функцию ядра (из theme.inc), служит как раз имя этой функции. Последняя часть имени должна соответствовать какому-либо из имен функций ядра, которые можно переопределять. Первая часть имени при перекрытии должна заменять слово theme и должна быть равна названию темы (к примеру, bluebox). В итоге, назвав нашу функцию bluebox_breadcrumb(), мы добьемся того, что система шаблонов будет использовать именно ее при построении html-кода окончательного вывода страницы.
Перекрытую функцию нужно внести в файл template.php. К примеру, наша функция bluebox_breadcrumb() будет выглядеть так:
Переменная $breadcrumb - это массив, в котором содержатся все ссылки, формирующие список “хлебных крошек”. Этот массив формируется ядром Друпала, и как именно происходит это формирование - тема для более глубокого исследования. Сейчас же просто используем этот массив для оформления его html-тегами.
В вышеприведенном коде мы поместили “хлебные крошки” в контейнер div, и заменили знак разделения ссылок на свой - “/”. В принципе, можно ограничиться и этим решением, но мы пойдем дальше. Ведь в итоге нам нужно получить файл .tpl.php, который будет не программой php, которая выдает html-код, а именно html-шаблоном, в котором будут “вкрапления” php. Все, что нужно будет нам в этом файле - переменная (набор переменных), содержимое которых мы используем для работы шаблона.
Шаблон .tpl.php
Первый шаг - изменение кода нашей перекрытой функции. Вместо генерации всего нужного html-кода с помощью php, мы просто “отдадим” информацию нашему html-шаблону - обеспечив четкое отделение php-кода от тегов html.
Суть метода - использование функции _phptemplate_callback(). Первый аргумент этой функции - строка, которая задает имя шаблона .tpl.php. Этому шаблону будет доступна вся информация, которая содержится в массиве переменных, заданных во втором аргументе. Вот как будет выглядеть вызов функции в нашем случае:
Второй шаг - создание и заполнение файла .tpl.php. Его имя должно быть равно содержимому первого аргумента функции _phptemplate_callback(). В нашем случае, это будет файл breadcrumb.tpl.php. А код его будет таким:
Как видим, код просто перенесен из функции в шаблон. Но сейчас нам гораздо удобнее работать с html-кодом (так как нам нужен именно он). Раньше, в функции, нам приходилось следить за синтаксисом php, обходиться без подсветки html-кода - так как вывод html формировался в строках типа
$bla_bla = ‘
Эта заметка писалась довольно рано, поэтому в ней м.б. многовато бреда. Но надеюсь а) почистим; б) это не запутает читателя.
Комментарии
а бред почистили? Можно воспринимать это как есть?
Это вполне можно воспринимать как руководство к действию. Код рабочий
Бред там может быть не в коде, а в моей отсебятине (по сравнению с наработками и знаниями более опытных друпаллеров).
Поможет вам материал - вот и хорошо
вообще хотелось бы почаще ваших исследований по phptemplate - статьи про блоки и пути для меня были открытием, причём приятным...
Да я бы и сам рад, но в последнее время организационные вопросы доминируют над технологиями
Хорошо бы, если кто еще подключился, из сугубых практиков - один пример из жизни лучше тыщи высосанных из пальца придумок.
Эх... А мой пример все уже забыли?
Я лично не забыл, Semen, не обижайтесь, пожалуйста
Просто немного торможу, из-за незапланированной резвости жизни в оффлайне
К тому же была надежда на спецов, которых пока не видать
эх... жаль, что в Друпале до сих пор многое надо делать ручками... был бы модуль редактор, который создавал бы всё это сам... то есть кусок оттуда, он сам создает кусок .tpl.php и так далее...
а то ищи в коде эти строки... для нужного тебе изменения... где вообще названия всего, что можно переопределить в template.php есть вообще такой материал?
Переопределить можно все функции, название которых начинается с theme_.
Можно, в принципе и другие переопределить, но это сложнее.
да? а другие где можно переопределять, интересно? или это пока не проработано?
Там были где-то примеры на drupal.org
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
Переводы некоторых модулей.
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.
Там какие-то хитрые действия в темах... Точно не помню, надо поискать пример. Сейчас новая книжка выходит, как раз по программированию для Друпала, может там что будет...
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
Переводы некоторых модулей.
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.
ну, меня больше беспокоит то, что не везде используются классы и идентификаторы...
например на странице node/add никак не создать таблицу с границами вокруг документа, так как там контент начинается просто с текста...
Что за книжка?
http://www.amazon.com/Pro-Drupal-Development-John-VanDyk/dp/1590597559/r...
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
Переводы некоторых модулей.
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.
Список всех темовых функций ядра и установленных (и включенных) модулей, можно получить следующим кодом:
<?php
$functions = get_defined_functions();
$theme_functions = array();
foreach ($functions['user'] as $function)
if (strpos($function, 'theme_') === 0)
$theme_functions[] = $function;
print_r($theme_functions);
?>
> например на странице node/add никак не создать таблицу с границами вокруг документа, так как там контент начинается просто с текста...
перегрузи theme_node_form и будет тебе счастье
Спасибо! Оказалось очень полезно.. и кстати
подскажите - а поля в CCK - может уже они готовые есть и им можно шаблон настраивать в виде имя_поля.tpl.php ?
и еще - как эти поля прописывать в виде переменных типа $имя_поля node.tpl.php ?
http://www.google.ru/search?hl=ru&q=theming%20cck%20fields&lr=&aq=f
спасибо, еле нашел
не все так просто:
-----------------------------
Итак, находим в папке modules/cck/theme/ файл template.php. Как видите, он содержит единственную функцию phptemplate_field:
function phptemplate_field(&$node, &$field, &$items, $teaser, $page) {
$variables = array(
'node' => $node,
'field' => $field,
'field_type' => $field['type'],
'field_name' => $field['field_name'],
'label' => $field['widget']['label'],
'items' => $items,
'teaser' => $teaser,
'page' => $page,
);
}
Аккуратно копируем весь код функции и вставляем в конец файла template.php текущей темы оформления. Сохраняем файл. Добавленная функция переопределяет стандартную процедуру вывода полей CCK и «сообщает» модулю CCK, что забота о выводе полей теперь ложится на пользователя.
В соответствии с описанием, в папке текущей темы также нужно создать файл field-field_myurl.tpl.php (помните, что поле в моём примере выше называется field_myurl?). Этот файл - просто шаблон, в котором можно определить, как именно поле CCK будет отображаться в браузере, то есть, HTML-обвязку выводимых данных поля. Поскольку нам ничего не нужно выводить (мы хотим скрыть поле), то создаём пустой файл, а лучше - вообще ничего не создаём (ничего страшного не произойдёт). Для интереса можете посмотреть как может выглядеть шаблон вывода поля, открыв файл modules/cck/theme/field-field_body.tpl.php.
-----------------------------
http://www.drupal.ru/node/4980
не получается перекрыть функцию .... создал все по описанию .... функция не вызывается ни в какую
Drupal 6.2
не знаю - может в 6-м уже и это испортили
хорошая статья...
только в 6-м друпале, судя по всему, функции _phptemplate_callback нет.
где бы найти такое же описание только для 6-го?
Ничего никто не портил в 6 версии, если не перекрывается функция в шаблоне, то значит друпал ещё не переопределил функции для темы.
Для переопределения функций нужно (актуально для версии 6.20):
На сколько понял, по умолчанию принято, что крон уже настроен, а чаще всего его никто из новичков не трогает. На практике влияние крона еще не проверял.