Drupal 7: определение шаблонов tpl.php и функций темизации. Хуки темизации.
Для облегчения жизни темизаторам, в Drupal существует система шаблонов. Расширяется она с помощью хука hook_theme().
Определенный в функции hook_theme хук темизации, можно будет переопределить в теме при помощи функции темизации либо шаблона, определим в модуле example_template:
function example_template_theme() {
return array(
'custom_template' => array( // название хука темизации
'variables' => array( // переменные которые будут доступны в шаблоне
'body' => NULL,
'title' => NULL,
),
),
);
}
Теперь для вызова данного хука темизации нужно воспользоваться конструкцией:
theme('custom_template', array('body' => 'Some body', 'title' => 'Some title'));
Первым параметром передается имя хука темизации который нужно отобразить, второй параметр - массив переменных, которые определены для хука темизации.
В модуле необходимо определить либо функцию темы либо шаблон, которые будут использоваться по умолчанию и браться из модуля. Для этого нужно создать функцию с именем theme_ИМЯ_ХУКА_ТЕМИЗАЦИИ()
Определяем функцию в модуле:
function theme_custom_template($variables) {
$output = '<div class="custom-template-wrapper">';
$output .= '<div class="body">';
$output .= $variables['body'];
$output .= '</div>';
$output .= '<div class="title">';
$output .= $variables['title'];
$output .= '</div>';
$output .= '</div>';
return $output;
}
Для того что бы использовать шаблон из модуля по умолчанию необходимо в определение хука темизации в hook_theme добавить параметр расположения шаблона:
function example_template_theme() {
return array(
'custom_template' => array(
'variables' => array( // переменные которые будут доступны в шаблоне
'body' => NULL,
'title' => NULL,
),
// имя шаблона, в данном случае custom_template.tpl.php в корне модуля
'template' => 'custom_template',
),
);
}
После определение хука темизации, его можно переопределить в любой теме:
function MYTHEME_custom_template($variables) {
$output = '<div class="mytheme-custom-template-wrapper">';
$output .= $variables['title'] . ' - ' . $variables['body'];
$output .= '</div>';
return $output;
}
Для использования шаблона, а не функции, нужно создать шаблон c именем хука example_template.tpl.php и положить в папку с темой либо вложенную в тему папку templates.
ВАЖНО! Одновременно не могут использоваться функция темизации и шаблон, больший приоритет имеет функция и поэтому будет использоваться именно она.
Полный код:
/**
* @file
* Example template
*/
/**
* Implemets hook_menu().
*/
function example_template_menu() {
$items['example_template'] = array(
'title' => 'Example template',
'page callback' => 'example_template_callback',
'access callback' => TRUE,
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
/**
* Implements hook_theme().
*/
function example_template_theme() {
return array(
'custom_template' => array( // название хука темизации
'variables' => array( // переменные которые будут доступны в шаблоне
'body' => NULL,
'title' => NULL,
),
// имя шаблона, в данном случае custom_template.tpl.php в корне модуля
'template' => 'custom_template',
),
);
}
/**
* Page callback.
*/
function example_template_callback() {
return theme('custom_template', array('body' => 'Some body', 'title' => 'Some title'));
}
/**
* Returns HTML for a custom template.
*
* @param $variables
* An associative array containing:
* - body: body text.
* - title: title text.
*
* @ingroup themeable
*/
function theme_custom_template($variables) {
$output = '<div class="custom-template-wrapper">';
$output .= '<div class="body">';
$output .= $variables['body'];
$output .= '</div>';
$output .= '<div class="title">';
$output .= $variables['title'];
$output .= '</div>';
$output .= '</div>';
return $output;
}
Комментарии
Нихрена ничего не понял. Хоть и очень старался. Очень сухо все. Автор что то там проборматал только себе и понятное.
В принципе все понравилось. Единственное не понятно: в функции example_template_callback(), custom_template - нужно указывать имя функции или название файла???
custom_template - это имя шаблона которые определено в хуке hook_theme.
Он может встречаться в названии функции которая отвечает за отображение контента либо в названии файла с помощью которого контент отображается. В данном случае функция и файл они должны рассматриватся как одинаковые интрументы.
Спс разобрался
Благодарю! Всё очень легко и просто обїяснили, без воды и глупых ассоциаций. Давно искал чтобы разобраться. Про приоритет функции над шаблоном вообще не знал! ))) Сохранил в закладки. Успехов вам и процветания!
Важное уточнение!
В имени хука не должно быть "-" (знака минус) если нужно разделить имена то подчёркивание,
иначе друпал не сможет подтянуть файл если его для переопределения бросить в папку с темой.
Почему в последнем куске кода вы в
example_template_theme
указываете'template' => 'custom_template',
, а затем пишите функциюtheme_custom_template
которая выплёвывает HTML.Где шаблон, который вы указали
'template' => 'custom_template'
?Существует 2 варианта определения шаблона:
- Функция которая возвращает разметку
- Шаблон *.tpl.php
Если вы внимательно прочитаете, то я написал что можно создать шаблон:
Да уж, у Друпала действительно достаточно мудрёная система темизации, а статья очень понравилась!
в админке не будет работать?можешь обяснить?
Добрый день!
Если это делать в модуле, то это будет работать для всех тем включая админскую, т.к. хуки модулей выхываются всегда. Если это делать в теме(собственная тема), то это будет работать на тех страницах где эта тема активна.
А что модуль в итоге делает то? Пустая - пустышка?
Модуль в итоге создает либо собственный темплейт либо функцию темизации. Это просто пример, и данный функционал вполне можно, даже нужно, использовать когда модуль предоставляет какую либо разметку.
Добрый всем день. Я прочитал это статью и статью по темитезации form. Подскажите как в своем шаблоне вывести форму в произвольном месте. Мне необходимо добавить выше разметки свой контейнер .
Зависит от типа шаблона в котором необходимо вывести форму, но ее можно получить при помощи drupal_get_form() функции в template.php и передать в шаблон.