Перейти к основному содержанию

Message to readers

24 февраля 2022 года, Россия начала полномасштабную войну в Украине. Армия России подло вторглась в суверенное и независимое государство. Это кровавая война с десятками тысяч жертв. Российская армия разрушает Украинские города, убивает мирных жителей, насилует женщин и цинично прикрывается пропагандой.

Начав паразитировать на территории Украины как раковая опухоль еще с 2014 года в виде оккупированых территорий Луганской и Донецкой областей и аннексированного Крыма, Россия прикрываясь лживой пропагандой, сама является нацистским государством развязавшим преступную войну и тем самым обрекая себя на бедность и ненависть всего мира.

Украина выиграет эту войну и положит конец российской террористической деятельности (рашизму).

Слава Україні!

На видео представлена очень маленькая часть разрушений, которые российская армия наносит Украинским мирным городам и людям.

Drupal 7: определение шаблонов tpl.php и функций темизации. Хуки темизации.

Опубликовано 7.06.2013 Теги: drupal 7

Для облегчения жизни темизаторам, в 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;
}

Github

Комментарии

Аватар пользователя Drupaler
Drupaler
Опубликовано 4.08.2013

Нихрена ничего не понял. Хоть и очень старался. Очень сухо все. Автор что то там проборматал только себе и понятное.

  • ответить
Аватар пользователя Игорь
Игорь
Опубликовано 4.09.2013

В принципе все понравилось. Единственное не понятно: в функции example_template_callback(), custom_template - нужно указывать имя функции или название файла???

  • ответить
Аватар пользователя Alex
Alex
Опубликовано 9.09.2013

custom_template - это имя шаблона которые определено в хуке hook_theme.
Он может встречаться в названии функции которая отвечает за отображение контента либо в названии файла с помощью которого контент отображается. В данном случае функция и файл они должны рассматриватся как одинаковые интрументы.

  • ответить
Аватар пользователя Игорь
Игорь
Опубликовано 10.09.2013

Спс разобрался

  • ответить
Аватар пользователя Кирилл
Кирилл
Опубликовано 18.11.2013

Благодарю! Всё очень легко и просто обїяснили, без воды и глупых ассоциаций. Давно искал чтобы разобраться. Про приоритет функции над шаблоном вообще не знал! ))) Сохранил в закладки. Успехов вам и процветания!

  • ответить
Аватар пользователя Агент
Агент
Опубликовано 12.06.2014

Важное уточнение!
В имени хука не должно быть "-" (знака минус) если нужно разделить имена то подчёркивание,
иначе друпал не сможет подтянуть файл если его для переопределения бросить в папку с темой.

  • ответить
Аватар пользователя Максим
Максим
Опубликовано 13.10.2014

Почему в последнем куске кода вы в example_template_theme указываете 'template' => 'custom_template',, а затем пишите функцию theme_custom_template которая выплёвывает HTML.
Где шаблон, который вы указали 'template' => 'custom_template'?

  • ответить
Аватар пользователя Alex
Alex
Опубликовано 13.10.2014

Существует 2 варианта определения шаблона:
- Функция которая возвращает разметку
- Шаблон *.tpl.php

Если вы внимательно прочитаете, то я написал что можно создать шаблон:

Для использования шаблона, а не функции, нужно создать шаблон c именем хука example_template.tpl.php и положить в папку с темой либо вложенную в тему папку templates.

  • ответить
Аватар пользователя freeze
freeze
Опубликовано 14.03.2015

Да уж, у Друпала действительно достаточно мудрёная система темизации, а статья очень понравилась!

  • ответить
Аватар пользователя ilkin
ilkin
Опубликовано 16.04.2016

в админке не будет работать?можешь обяснить?

  • ответить
Аватар пользователя Alex
Alex
Опубликовано 20.04.2016

Добрый день!

Если это делать в модуле, то это будет работать для всех тем включая админскую, т.к. хуки модулей выхываются всегда. Если это делать в теме(собственная тема), то это будет работать на тех страницах где эта тема активна.

  • ответить
Аватар пользователя PVasili
PVasili
Опубликовано 17.09.2016

А что модуль в итоге делает то? Пустая - пустышка?

  • ответить
Аватар пользователя Alex
Alex
Опубликовано 19.09.2016

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

  • ответить
Аватар пользователя Alex0304
Alex0304
Опубликовано 13.12.2016

Добрый всем день. Я прочитал это статью и статью по темитезации form. Подскажите как в своем шаблоне вывести форму в произвольном месте. Мне необходимо добавить выше разметки свой контейнер .

  • ответить
Аватар пользователя Alex
Alex
Опубликовано 13.12.2016

Зависит от типа шаблона в котором необходимо вывести форму, но ее можно получить при помощи drupal_get_form() функции в template.php и передать в шаблон.

  • ответить
Содержание этого поля является приватным и не предназначено к показу. Если у вас есть Gravatar аккаунт, связанный с введенным адресом email, то он будет использован для отображения вашего аватара.

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • Для публикации фрагментов кода, используйте тег <code>...</code>.

Категории блога

  • Drupal 7 (35)
  • Drupal 8 (1)
  • PHP (6)
  • jQuery (3)
  • Linux (6)
  • Интернет (1)
  • JavaScript (1)
  • Дизайн (1)
  • События (19)
  • Разное (1)

Архив блога

  • декабрь 2017 (1)
  • август 2017 (1)
  • июль 2017 (1)
  • июнь 2017 (1)
  • май 2017 (1)
  • апрель 2017 (1)
  • март 2017 (2)
  • сентябрь 2016 (2)
  • июнь 2016 (1)
  • январь 2016 (1)
  • сентябрь 2015 (2)
  • май 2015 (1)
  • февраль 2015 (3)
  • ноябрь 2014 (1)
  • октябрь 2014 (1)
  • сентябрь 2014 (1)
  • июль 2014 (1)
  • июнь 2014 (1)
  • май 2014 (1)
  • январь 2014 (1)
  • декабрь 2013 (3)
  • ноябрь 2013 (2)
  • сентябрь 2013 (2)
  • август 2013 (2)
  • июнь 2013 (3)
  • май 2013 (4)
  • апрель 2013 (2)
  • март 2013 (3)
  • февраль 2013 (1)
  • декабрь 2012 (3)

Связь с автором

Alex Schedrov Twitter Icon Alex Schedrov Drupal Icon Alex Schedrov Github Alex Schedrov RSS Icon
© 2011—2022