Темизация Drupal. Часть 2. Анатомия темы оформления Drupal

Как и в случае с модулем, разработка которого рассматривалась в предыдущей статье, тема оформления должна иметь уникальное имя, состоящее из строчных латинских букв, цифр и знаков подчеркивания, и это имя должно начинаться с буквы. Тема оформления — это несколько файлов, которые располагаются в папке sites/all/themes/имя_темы относительно корня Drupal.

PHPTemplate при сборке страницы берет информацию из пяти основных файлов: имя_темы.info, page.tpl.php, node.tpl.php, block.tpl.php, template.php. Если же включен модуль comment, для вывода комментариев используется шаблон comment.tpl.php.

Файл имя_темы.info содержит служебную информацию: название и описание темы оформления, список используемых в ней *.css- и *.js-файлов и список регионов (ссылку на подробное описание всех параметров, используемых в *.info-файле темы, можно найти во врезке в конце статьи). Данные, находящиеся в этом файле, кэшируются в базе данных, и чтобы внесенные в него изменения вступили в силу, нужно этот кэш сбросить. Самый простой способ сделать это — просто зайти на страницу со списком тем и нажать кнопку Save configuration; при этом сбросится только закэшированная информация из *.info-файла, но не весь кэш сайта.

Page.tpl.php — это основной шаблон, в нем размещается HTML-код всей страницы, которая позже будет выведена пользователю. В частях страницы, где будет выводиться содержимое регионов и основной текст, должны располагаться соответствующие переменные. Например, если в *.info-файле не указано иное, то в каждой теме оформления присутствует пять основных регионов (их описание я давал выше), которые представлены переменными $left, $right, $header, $footer, $content. В первых четырех переменных выводятся блоки, размещенные в соответствующих регионах, в переменной $content находится основное содержимое страницы, а это или шаблон node.tpl.php (если просматривается документ, — например, новость или запись в блоге) с выведенными в нем данными, или страница, созданная каким-либо модулем, — например, список, генерируемый модулем Views.

В файле page.tpl.php, кроме перечисленных выше, может находиться еще десяток переменных, выполняющих разные функции: $primary_links, $secondary_links, $search_box, $tabs, $messages, $breadcrumbs, $closure и т. д. Все они важны. При необходимости описание всех доступных в page.tpl.php переменных можно найти по ссылке, размещенной во врезке в конце статьи.

Часто бывает нужно создать разное оформление для страниц сайта. Движок PHPTemplate имеет необходимые для этой задачи возможности. Чтобы задать свой шаблон для определенной страницы, следует в папке с темой оформления создать копию файла page.tpl.php и присвоить ей имя, соответствующее одной из масок: page-front.tpl.php будет использоваться как шаблон для главной страницы сайта; а page-путь_к_внутренней_странице.tpl.php — как шаблон для указанной внутренней страницы; page-node.tpl.php — при просмотре материала; page-node-nid.tpl.php, где nid — id документа — при просмотре документа с указанным id; page-node-edit.tpl.php используется при редактировании документа. Кроме того, вы можете использовать шаблоны maintenance-page.tpl.php и maintenance-page-offline.tpl.php, которые будут выводиться в случае ошибок соединения с базой данных или в случае перевода сайта в offline-режим.

Node.tpl.php — шаблон, по умолчанию используемый для вывода содержимого документа. В шаблоне node.tpl.php размещается HTML-код, задающий форматирование документов, таких как Страницы (Page) и Новости (Story); в нем доступны переменные $title, $teaser, $content, содержащие заголовок, анонс и полный текст документа, а также ряд служебных переменных.

При просмотре страницы, скажем, с текстом новости выводится шаблон страницы page.tpl.php, в котором в регионе, отведенном для вывода основного содержимого (переменная $content), размещается содержимое шаблона node.tpl.php. Как и в случае с общим макетом страницы (page.tpl.php), для каждого типа документа может быть определен свой шаблон — так, часто для новостей используется один макет, для статических страниц другой, а для фотографий — третий. Чтобы определить свой шаблон для каждого типа контента, в папке с темой оформления нужно создать копию файла node.tpl.php и дать ей имя node-имя_типа_контента.tpl.php, т. е., например, файл node-blog.tpl.php будет использоваться для отображения записей в блоге, а node-book.tpl.php — для отображения страниц книги.

Block.tpl.php — определяет внешний вид блока; как и в случае с материалами, шаблон блока может быть задан для каждого модуля (блоки, создаваемые модулем user, будут использовать один шаблон, а блоки, создаваемые модулем block, — другой) или для каждого блока в отдельности. Маски имен файлов шаблонов для блоков имеют вид: шаблон block-module_name.tpl.php и используется для всех блоков, создаваемых модулем module_name; шаблон block-module_name-delta.tpl.php может использоваться в случае, если модуль создает несколько блоков и вы хотите каждому из них задать свой шаблон. Параметр delta — это id блока, который задается создающим его модулем. Шаблон block-region.tpl.php служит для отображения блока в определенном регионе.

Каждый модуль, написанный с применением слоя темизации Drupal, должен разделять функции, генерирующие данные, и функции темизации, оформляющие эти данные в виде HTML-кода. Функции темизации регистрируются модулями через специальный хук hook_theme() и имеют имена, начинающиеся с префикса theme_, например, theme_list(). Такие функции не реализуют никакой бизнес-логики, а только получают набор данных на входе и отдают сформированный HTML-код на выходе. Функции темизации могут быть переопределены в файле template.php, т. е. разработчик может заменить стандартное оформление данных, возвращаемых модулем, по своему желанию. Для этого нужно скопировать в него соответствующую функцию темизации, заменить в ней префикс theme_ на имя используемой темы и внести в нее необходимые изменения.

Из всех перечисленных выше файлов обязательный только *.info, в случае отсутствия в папке с темой файлов page.tpl.php, node.tpl.php, block.tpl.php или template.php будут использоваться стандартные шаблоны. Ссылку на список стандартных шаблонов можно найти в конце статьи.

На заметку: полезные модули

Signwriter. Часто бывает необходимо использовать в заголовке страницы или меню какой-либо экзотический шрифт, отсутствующий у большинства посетителей сайта. Модуль Signwriter генерирует картинки с текстом, написанным заданным шрифтом (шрифт предварительно должен был закачан на сервер). Через меню администратор может включить замену заголовков страниц и блоков созданными картинками, а через специальную функцию и вовсе можно заменить картинками любой текст.

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

Devel. Мощный инструмент в руках Drupal-разработчика. Разработчику тем оформления модуль Devel предоставляет информацию обо всех используемых для генерации страницы шаблонах и функциях темизации.

PNG Fix. Модуль, исправляющий проблему с непрозрачностью PNG-файлов в браузерах IE 5.5 и IE 6. Настраивается работа модуля через интерфейс администратора, изменение файлов темы оформления не требуется.

Кроме переменных, содержащих видимые пользователю данные, в шаблоне page.tpl.php должно размещаться несколько служебных переменных. Скажем, между тегами страницы располагаются переменные $head, $styles, $scripts. В этих переменных Drupal собирает HTML-код, добавляющий к странице мета-теги, файлы стилей и java-скрипты соответственно. Наличие этих трех переменных позволяет программистам в своих модулях, используя API-функции drupal_add_css(), drupal_add_js() и некоторые другие, добавлять к странице свои стили или другие файлы, не изменяя файлов темы оформления.

Листинг 1

name = Theme name
description = Theme description.
version = VERSION
core = 6.x
engine = phptemplate
stylesheets[all][] = style.css
stylesheets[print][] = print.css
scripts[] = effects.js
scripts[] = menu.js
regions[left] = Left sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer

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

Параметры _stylesheets _определяют список CSS-файлов, которые будут подключены ко всем страницам. В первой паре квадратных скобок через запятую может быть указан список параметров, присваиваемых атрибуту media HTML-тега link (подробную информацию о назначении этого атрибута можно найти по ссылке во врезке в конце статьи). Из перечисленных здесь имен файлов, а также из файлов стилей, которые подключены модулями через функцию drupal_add_css(), будет сформирован HTML-код, подключающий указанные стили и доступный в шаблоне page.tpl.php в переменной $styles. Кроме того, шаблонизатор попытается найти в папке с темой оформления файл style.css; если он есть, то он также будет подключен к странице.

Аналогичное назначение и у параметра scripts. Перечисленные в нем JavaScript, а также сценарии, добавленные модулями через функцию drupal_add_js(), будут подключены ко всем страницам сайта. Если в папке с темой оформления есть файл script.js, он также будет подключен к каждой странице.

Параметры regions определяют список доступных в шаблоне page.tpl.php регионов. Значение в скобках станет PHP-переменной, например $left или $footer (поэтому здесь недопустимо использовать пробелы, дефисы и другие запрещенные в именах PHP-переменных символы), а значение после знака «равно» — именем региона, доступным на странице управления блоками.

Файл page.tpl.php при использовании приведенного выше *.info-файла может иметь структуру подобную приведенной в листинге 2.

Листинг 2

<HTML>
  <head>
    <font class="comment_title"><?php print $head_title ?></font>
    <?php print $head ?>
    <?php print $styles ?>
    <?php print $scripts ?>
  </head>
  <body>
    <div class="header">
      <?php print $header ?>
    </div>    <div class="left-sidebar">
      <?php print $left ?>
    </div>    <div class="content">
      <?php print $content ?>
    </div>    <div class="footer">
      <?php print $footer ?>
    </div>  </body>
</HTML>

Это очень простой пример, призванный продемонстрировать общую логику разработки темы оформления для Drupal, поэтому здесь опущено много деталей. Лучший способ научиться темизировать Drupal — изучить существующую тему оформления, например тему Zen. Она содержит детальное описание всех используемых стилей и переменных.

Переменные $header, $left и $footer в нашем примере будут заполнены HTML-кодом блоков, которые администратор сайта разместит в соответсвующих регионах. В переменной $head_title будет находиться загловок страницы, «склеенный» Drupal из имени сайта и заголовка текущей страницы, а переменные $head, $styles и $scripts будут заменены соответственно метатегами, ссылками на файлы стилей и JavaScript.

Переменная $content в шаблоне page.tpl.php заменится на содержимое текущей страницы, например на тело документа (шаблон node.tpl.php) или содержимое, генерируемое каким-либо модулем. Если в текущей теме оформления нет файла node.tpl.php, то используется одноименный файл из ядра Drupal, находящийся в папке modules/node.

В шаблоне node.tplp.php доступно несколько переменных, самые важные из них: $title — заголовок документа, $node — объект, содержащий полную информацию о текущем документе, $submitted — HTML-код, содержащий информацию об авторе документа, $content — основное содержимое (тело) текущего документа. Не путайте переменную $content из шаблона node.tpl.php с одноименной переменной из шаблона page.tpl.php. В первой есть только «тело» текущего документа без дополнительной информации (автор, дата публикации и т. д.), а во второй — полный HTML-код, который будет показан пользователю в регионе content. Например, при просмотре ленты последних новостей переменная $content каждой новости будет содержать текст одной новости, а переменная $content в шаблоне page.tpl.php — HTML-код всех выводимых новостей (см. картинку «Описание схемы страницы»).

Самый простой пример шаблона node.tpl.php см. в листинге 3.

Листинг 3

<div class="node<?php if ($sticky) {
    print " sticky";
  } ?>
  <?php if (!$status) {
    print " node-unpublished"; 
  } ?>">
  <h2 class="title"><?php print $title?></h2>
  <span class="submitted"><?php print $submitted?></span>
  <div class="content"><?php print $content?></div></div>

Все переменные, которые выводятся в шаблоне page.tpl.php, могут быть переопределены в функции phptemplate_preprocess_page(), размещенные в файле template.php текущей темы оформления. Аналогично все переменные шаблона node.tpl.php могут быть переопределены в функции phptemplate_preprocess_node(). Кроме того, в этих функциях могут быть определены дополнительные переменные, которые станут доступны в соответствующих шаблонах. Пример практического использования данных функций можно найти в документации или в одной из существующих тем оформления.

Ссылки на другие части этой статьи:

Содержание всех статей: /blog/2010/my-drupal-articles