Вы здесь

Обновление тем версии 5.x до версии 6.x

У темы появился .info-файл

.info-файл для определения проекта появился в Друпале 5 для модуля (в нём содержались данные о названии, описание, версия, зависимости и так далее). В Друпале 6 такой же файл появился и в теме. Пример .info-файла темы:

name = Theme Name
description = One sentence description of theme.
core = 6.x
engine = phptemplate

Реестр тем

Функции темы теперь должны быть зарегистрированы. В Друпале 5 функции темы узнавались на лету, в Друпале 6 используется hook_theme() для регистрации всего темизируемого вывода. Почти во всех случаях PHPTemplate сам позаботится о регистрации и вам тут не нужно ничего делать вручную, здесь есть только одно исключение — формы реализованные не через стандартную реализацию темы зарегистрированы не будут.

Отметьте: при добавлении в тему новой функции или шаблона реестр должен быть очищен!

Темизация через файлы шаблонов

В Друпале 5, функции темизации могли быть переопределены с помощью themeEngine_hook() или themeName_hook(). Вся обработка находилась внутри файла template.php и он возвращал все данные. Или можно было использовать _phptemplate_callback() в отдельном файле шаблона.

В Друпале 6 _phptemplate_callback() больше не поддерживается, потому что он был встроен в главную функцию theme(). Но он вам не нужен: до тех пор пока хук зарегистрирован как функция темы (смотрите выше информацию о реестре тем), его можно переопределить стандартной темизацией или создав функцию с названием themeName_hook(), или создав файл hook.tpl.php. Например, hook menu_tree темизируем. Поэтому, чтобы его переопределить создайте в файле template.php функцию с названием themeName_menu_tree() или файл шаблона в папке темы с названием menu-tree.tpl.php. Отметьте: значок подчёркивания в названии файла заменяется дефисом. Очистите реестр тем и функция темы или файл шаблона займутся темизацией деревьев меню.

В Друпале 5 использование _phptemplate_callback() также позволяло хуку манипулировать переменными. Следующий подход больше не поддерживается:

<?php
function _phptemplate_variables($hook, $variables) {
  switch (
$hook) {
    case
'page':
     
// process variables for page hook.
   
break;
    case
'node':
    
// process variables for node hook.
   
break;
  }
  return
$variables;
}
?>

Управление шаблонами

Файлами шаблонов теперь проще управлять, упорядочив их по подпапкам. PHPTemplate найдёт все файлы в теме и зарегистрирует их местоположение. Ограничения на глубину больше нет.

Новые шаблоны

В Друпале 5 файл phptemplate.engine (в папке движка) определял 5 шаблонов:

С новым подходом появилось больше стандартных шаблонов и они были перемещены из папки движка в новые места. Чтобы переопределить эти шаблоны, нужно скопировать их в папку своей темы и очистить реестр тем.

Редко используемых стандартных функций ядра для перечисленных выше шаблонов тоже больше не существует. Например, больше нет theme_page. То, чем они занимались теперь делается в шаблонах. Не путайте удаление функций с тем, как теперь выполняется обработка того, чем раньше они занимались и как вызывались — theme('page') по-прежнему работает.

Именование шаблонов

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

Определение регионов

hook_regions исключён. Регионы теперь определяются в .info-файле:

  • regions[left] = Left sidebar
  • regions[right] = Right sidebar
  • regions[content] = Content
  • regions[header] = Header
  • regions[footer] = Footer

Регионы — изменены названия переменных

Изменены названия переменных для регионов боковых колонок и нижней колонки.

В Друпале 5 для регионов left, right и footer использовались переменные $sidebar_left, $sidebar_right и $footer_message в файле page.tpl.php. Это был старый хлам из 4.6.х и предыдущих версий.

Чтобы почистить это, эти 3 региона используют сейчас переменные $left, $right и $footer, что соответствует подходу с названиями как и для других регионов. Переменная $footer_message по-прежнему используется, но теперь она показывает сообщение из поля об информации о сайте.

Настраиваемые параметры темы

Авторы тем теперь могут их сделать более настраиваемыми для управляющих сайтами. На странице admin/build/themes/settings/themeName теперь размещены разные параметры темы, такие как «Изображение логотипа» или «Значок сайта». Чтобы добавить теме свои настраиваемые параметры, создайте в папке темы файл theme-settings.php и используйте функции themeName_settings() или themeEngineName_settings(). Для создания дополнительных форм виджетов функции должны использовать Form API.

Переменая $signature

В Друпале 6 подписи к комментариям сделаны динамическими. Это значит, что они показываются при просмотре комментария, но сам показываемый текст не является сам по себе частью комментария. Чтобы воспользоваться этой возможностью, используйте переменную $signature в шаблоне comment.tpl.php.

Друпал 5:

<div class="content">
  <?php print $content; ?>
</div>

Друпал 6:

<div class="content">
  <?php print $content ?>
  <?php if ($signature): ?>
    <div class="user-signature clear-block">
      <?php print $signature ?>
    </div>
  <?php endif; ?>
</div>

Отметьте: для предотвращения показа подписи дважды в старых комментариях, можно использовать такую запись:

<div class="content">
  <?php print $content ?>
  <?php if ($signature && $comment->cid > 1234): // Change "1234" to the last comment ID used before upgrading to Drupal 6 ?>
    <div class="user-signature clear-block">
      <?php print $signature ?>
    </div>
  <?php endif; ?>
</div>

Переменна $body_classes

В page.tpl.php можно было получить состояние разметки с помощью переменной $body_classes (ранее использовалась переменная $layout).

Друпал 5:

<?php print $layout; ?>

Такой код покажет left, right или оба (в зависимости от использования).

Друпал 6:

<?php print $body_classes; ?>

Такой код покажет что-то вроде: front logged-in node-type-page no-sidebars.

Переменная $language теперь объект

Переменная $language теперь не только просто строка содержания код языка текущей страницы, но и объект, который содержит свойства текущего языка. Это позволяет легко сделать тему совместимой, если, например, на сайте используется язык в котором принято письмо справа налево.

Объект $language имеет свойства:

  • $language->language с кодом языка
  • $language->dir с направлением письма (0 или LANGUAGE_LTR для письма слева направо и 1 или LANGUAGE_RTL для письма справа налево)

В page.tpl.php можно использовать подобный код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language ?>" lang="<?php print $language->language ?>" dir="<?php print $language->dir ?>">
  <head>
    ...
  </head>
  <body dir="<?php print $language->dir ?>">
    ...
  </body>
</html>

Тема может переопределить .css-файл определённый ядром и модулем

Тема может заменить .css-файл определённый модулем, если добавить файл с тем же названием используя drupal_add_css(). Это позволяет в случае необходимости переопределить стили полностью, а не отдельные селекторы стиля.

Например, если следующий код будет помещён в файл template.php темы Garland, themes/garland/system-menus.css полностью заменит modules/system/system-menus.css:

<?php
drupal_add_css
(path_to_theme() .'/system-menus.css', 'theme');
?>

Поддерживается переопределение направления письма в CSS

Для лучшей поддержки языков с письмом справа налево, любой .css-файл добавленный на страницу через drupal_add_css() может иметь свою пару. Например, это может быть файл style.css и его пара в той же папке с названием style-rtl.css. Этот файл может содержать переопределения для стилей использованных в style.css, которые должны применяться в случае использования языка с письмом справа налево. Ядро Друпала включает такие RTL CSS-файлы, они есть в модулях и темах. Правила переопределения отмечены комментарием /* LTR */ в оригинальном .css-файле, чтобы оповестить разработчиков о том, что для языка с обратным направлением письма могут потребоваться изменения оригинального файла. Эти .css-файлы загружаются только в том случае, если для показа страницы используется RTL-язык.

Пример из файла modules/system/defaults.css:

th {
  text-align: left; /* LTR */
  padding-right: 1em; /* LTR */
  border-bottom: 3px solid #ccc;
}

Тот же код в файле modules/system/defaults-rtl.css:

th {
  text-align: right;
  padding-right: inherit;
  padding-left: 1em;
}

В поле Submitted by дата и время темизируются

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

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

Пример из файла template.php в теме Garland:

function phptemplate_comment_submitted($comment) {
  return t('!datetime — !username',
    array(
      '!username' => theme('username', $comment),
      '!datetime' => format_date($comment->timestamp)
    ));
}

function phptemplate_node_submitted($node) {
  return t('!datetime — !username',
    array(
      '!username' => theme('username', $node),
      '!datetime' => format_date($node->created),
    ));
}

Библиотека jQuery обновлёна до версии 1.2.6

Библиотека jQuery включённая в стандартную сборку (ядро) Друпала обновлена до версии 1.2.6.

Default JavaScript file

Также как и в случае с файлом style.css, файл с названием script.js автоматически загружается на страницу, если он находится в папке темы (если группа scripts[] в .info-файле явно не определена, то есть используется значение по умолчанию — scripts[] = script.js).

JavaScript theming

There is now a theming mechanism for JavaScript code. Together with the automatically included script.js, this allows theme developers more freedom in the domain of scripted events on Drupal web pages. Often, JavaScript code produces markup that is inserted into the page. However, this HTML code has usually been hard-coded into the script, which did not allow alteration of the inserted code.

Modules provide default theme functions in the Drupal.theme.prototype namespace. Themes should place their override functions directly in the Drupal.theme namespace. Scripts call Drupal.theme('function_name', ...) which in turn decides whether to call the function provided by the theme (if present) or the default function.

JavaScript theme functions are entirely free in their return value. It can vary from simple strings, up to complex data types like an object containing in turn several jQuery objects which are wrapped around DOM elements. See the original (default) theme function to see what your custom theme function should return.

Изменён класс активного CSS-селектора

Атрибут класса для активного пункта меню был изменён с a.active на a.active-trail. Это затронет оформление активных ссылок в основном и дополнительном меню, таких как ul.primary-links li a.active и ul#secondary-nav li a.active, которые теперь будут иметь селекторы ul.primary-links li a.active-trail и ul#secondary-nav li a.active-trail.