Вы здесь

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

Переменные $primary_links и $secondary_links теперь возвращают структурированные ссылки

Drupal 4.7.x:

<?php
print '<ul>';
foreach (
$primary_links as $link) {
   print
'<li>'. $link .'</li>';
}
print
'</ul>';
?>

Drupal 5.x:

<?php
print theme('links', $primary_links);
?>

Функция theme_links() вернёт список ссылок. Дополнительно, в ключах ссылок теперь используются названия ModuleName-LinkName (например menu-1-3-4, node-read-more или comment-add-new). Дополнительную информацию можно найти на странице Converting 4.7.x modules to 5.x docs.

Для добавления CSS используется drupal_add_css()

Drupal 4.7.x:

theme('stylesheet_import', base_path() . path_to_theme() . '/extra_stylesheet.css')

или

theme_add_style($themes[$theme]->filename)

Drupal 5.x:

drupal_add_css($path = NULL, $type = 'module', $media = 'all')

Это изменение позволяет добавлять легче и однообразно добавлять CSS, а также лучше использовать каскадность стилей (сначала загружаются стили ядра, затем стили модулей и в последнюю очередь стили темы).

В PHPTemplate (page.tpl.php) в связи с этим изменением стала также доступна переменная $css, которая содержит массив всех CSS-файлов текущей страницы. Переменная $styles по-прежнему актуальна и занимается загрузкой CSS-файлов, но если вы захотите на уровне темы отменить загрузку определённых CSS-файлов (например drupal.css), сделать это стало намного легче.

<?php
 
// print $styles;
  // we don't need to print out $styles since we want to take out drupal.css
 
unset($css['core']['misc/drupal.css']);
  print
drupal_get_css($css);
?>

Отметьте: переменная $css получает своё значение до запуска page.tpl.php. Таким образом вызов drupal_add_css() из page.tpl.php не изменит значение переменной $css. Используйте вызов drupal_add_css() в template.php или модуле. Если вы всё таки хотите добавить CSS-файл из page.tpl.php, то вам нужно сбросить значение переменной $css или не использовать его вообще.

// page.tpl.php code:

<?php
drupal_add_css
(path_to_theme().'/override-defaults.css', 'core', 'all'); // consider 'theme' instead of 'core'

print drupal_get_css(); // don't add $css to the params

// equivalent, but longer code here:
$css = drupal_add_css();  // reset the value of $css (will now contain "override-defaults.css")
print drupal_get_css($css);  // add $css to the params
?>

Ссылки: Simplify adding CSS in Drupal (issue), How to properly add CSS files (Lullabot) (previous, 4.7.x and lower versions of Drupal).

Функция theme_get_styles() стала функцией drupal_get_css()

В связи с вышеупомянутым изменением, введена новая функция drupal_get_css(), которая вызывает drupal_add_css(). Это позволяет загружать CSS-файлы в определённом порядке — сначала стили ядра, затем стили модулей и в последнюю очередь стили темы. Это гарантирует правильное использование каскадности стилей и их лёгкого перекрытия модулями и темами.

Доступна новая переменная $feed_icons

В шаблоне page.tpl.php теперь доступна переменная $feed_icons, которая выводит значок RSS. Дополнительную информацию можно найти на странице Converting 4.7.x modules to 5.x (New drupal_add_feed() and drupal_get_feeds replaces theme_add_link()).

Новый класс очистки, полностью на основе CSS

Ранее, класс использовавшийся для очистки элементов страницы выглядел как:

<br class="clear" />

Однако, использование этого класса добавляет на страницу совершенно не нужные переводы строк, только из-за того, что нужно сделать очистку выравнивания элементов. Этот класс был отменён в пользу решения Clearing a float container without source markup. Новый очищающий класс полностью основан на CSS и не вносит в страницу дополнительную разметку.

Чтобы правильно использовать новый класс, его нужно применять сразу к контейнерному элементу.

Drupal 4.7.x:

<div>
Some text here.
<br class="clear" />
</div>

Drupal 5.x:

<div class="clear-block">
Some text here.
</div>

theme_links() теперь возвращает список ссылок

theme_links() теперь возвращает корректный список ссылок. Кроме того, к пунктам теперь добавляются удобные классы first и last.

Код

<?php
print theme('links', $primary_links);
?>

вернёт подобный список пунктов основных ссылок

<ul class="links">

<li class="first menu-1-1-52"><a href="/drupalCVS/?q=test" title="" class="menu-1-1-52">test</a></li>

<li class="menu-1-2-52"><a href="/drupalCVS/?q=test2" title="" class="menu-1-2-52">test2</a></li>

<li class="last menu-1-3-52"><a href="/drupalCVS/?q=test3" title="" class="menu-1-3-52">test3</a></li>

</ul>

Дополнительно, можно использовать параметры в theme_links() для добавления в классы идентификатора:

<?php
print theme('links', $primary_links, array('class' =>'links', 'id' => 'navlist'));
?>

такой код вернёт подобный список пунктов основных ссылок

<ul class="links" id="navlist">

<li class="first menu-1-1-52"><a href="/drupalCVS/?q=test" title="" class="menu-1-1-52">test</a></li>

<li class="menu-1-2-52"><a href="/drupalCVS/?q=test2" title="" class="menu-1-2-52">test2</a></li>

<li class="last menu-1-3-52"><a href="/drupalCVS/?q=test3" title="" class="menu-1-3-52">test3</a></li>

</ul>

Загрузка JavaScript — drupal_add_js()

В Drupal 4.7.x, файлы JavaScript добавлялись в заголовок страницы вызовом drupal_set_html_head().

В Drupal 5.x, файл JavaScript и параметры добавляются вызовом drupal_add_js($data = NULL, $type = 'module', $scope = 'header', $defer = FALSE, $cache = TRUE). Эту функцию можно использовать в теме сразу после drupal_get_css().

Также, в шаблоне page.tpl.php появилась новая переменная — $scripts, которая позволяет загружать файлы скриптов. Переменная позволяет использовать параметры и если вы хотите отменить загрузку определённых скриптов на уровне темы (например autocomplete.js), то можно использовать подобный код:

<?php
 
// we don't need to print out $scripts since we want to take out autocomplete.js
  // print $scripts;
 
  // this returns the array of JavaScript files for the header
 
$js = drupal_add_js(NULL, NULL, 'header');
  unset(
$js['module']['misc/autocomplete.js']);
  print
drupal_get_js('header', $js);
?>

Ссылка: Streamline JavaScript addition and add settings storage (issue).

_phptemplate_callback

Drupal 4.7.x:

<?php
function _phptemplate_callback($hook, $variables = array(), $file = NULL) {
?>

Drupal 5.0:

<?php
/**
* Execute a template engine call.
*
* Each call to the template engine has two parts. Namely preparing
* the variables, and then doing something with them.
*
* The first step is done by all template engines / themes, the second
* step is dependent on the engine used.
*
* @param $hook
*   The name of the theme function being executed.
* @param $variables
*   A sequential array of variables passed to the theme function.
* @param $suggestions
*   An array of suggested template files to use. If none of the files are found, the
*   default $hook.tpl.php will be used.
* @return
*  The HTML generated by the template system.
*/
function _phptemplate_callback($hook, $variables = array(), $suggestions = array()) {
?>

Идентификатор pager стал классом (id='pager' → class='pager')

Идентификатор pager теперь стал классом, т.к. он может использоваться на странице несколько раз и использование для него идентификатора нелогично. Таким образом, запись #pager нужно поменять на .pager.

Ссылка: theme_pager : id="pager" to class="pager" (issue).

Изменены параметры theme_form_element

Drupal 4.7.x:

<?php
theme_form_element
($title, $value, $description = NULL, $id = NULL, $required = FALSE, $error = FALSE)
?>

Drupal 5.x:

<?php
theme_form_element
($element, $value)
?>

Ссылка: http://api.drupal.org/api/function/theme_form_element/5.

module_exist() → module_exists()

В Drupal 4.7.x существовала функция module_exist(), которая позволяла проверить существование модуля. В Drupal 5.x она переименована в module_exists(), чтобы более соответствовать PHP функции function_exists.

Атрибуты ID теперь используют дефисы вместо подчёркиваний

Например в форме поиска, ID изменён с id="search_form" на id="search-form".