Он позволяет модулю определять его тем, которые затем могут быть переопределены любым другим модулем / темой. Это также даст возможность любому модулю использовать хук, такой как mymodule_preprocess_theme_name
, для изменения переменных, передаваемых возможной функции темы или файлу шаблона.
Существует два основных способа инициализации функции темы:
theme('poll_results', array('raw_title' => 'title', 'results' => $results, etc...));
и
$build = array(
'#theme' => 'poll_results',
'#raw_title' => 'title',
'#results' => $results,
etc...
); // Note the '#' at the beginning of the argument name, this tells Drupal's `render` function that this is an argument, not a child element that needs to be rendered.
$content = render($build); // Exact equivalent of calling the previous example now that you have a render array.
Пожалуйста, имейте в виду, что вам следует избегать прямого вызова theme () (согласно документации в theme.inc), так как это:
- Обход кэширования.
- Обходит значения по умолчанию для типов, определенных в hook_element_info (), включая присоединенные активы
- Обходит этапы pre_render и post_render.
- Обход JavaScript сообщает информацию.
В Drupal 8 theme () является закрытой функцией _theme (). Для получения более подробной информации см. www.drupal.org / node / 2173655 .
Если вы сравните эти два элемента с элементом poll_results
в приведенном выше примере, вы, вероятно, сможете понять, что происходит ... поскольку PHP не является строго типизированным языком, Drupal предоставляет «именованные аргументы» через массив ключей, передаваемый в функцию theme
, или как хешированные ключи в массиве рендеринга.
Что касается 'render element', то это в основном говорит системе тем, что эта функция темы будет вызываться с использованием массива render, с одним именованным аргументом (в данном случае form
). Код будет выглядеть примерно так:
$build = array(
'#theme' => 'poll_choices',
'#form' => $form
);
Это передаст все, что в переменной $form
, функции темы как единственный аргумент.
Относительно клавиши template
:
'poll_vote' => array(
'template' => 'poll-vote',
'render element' => 'form',
)
определяет тему с именем poll_vote
, в которой используется файл шаблона (отсюда и ключ template
) с именем poll-poll.tpl.php (это условно). Путь к этому файлу шаблона будет найден с помощью пути к модулю, который его реализует (например, modules / poll / poll-voice.tpl.php), поэтому файлы шаблона можно размещать в подпапках основной папки модуля. .
Есть два способа фактически вернуть выходные данные для функции темы, реализуя имя физической функции (в данном случае это будет theme_poll_vote
) или используя файл шаблона. Если клавиша template
пуста, Drupal предположит, что вы реализовали физическую функцию, и попытается вызвать ее.
Файлы шаблонов предпочтительнее, если у вас есть достаточный объем HTML для вывода по теме, или вам просто не нравится писать HTML в строках внутри PHP (лично я этого не делаю). Однако в любом случае переменные, передаваемые при вызове темы (либо с использованием theme()
, либо с помощью массива рендеринга, как описано выше), сами передаются в файл шаблона или функцию темы. Итак:
function theme_poll_results(&$vars) {
$raw_title = $vars['raw_title'];
$results = $vars['results'];
// etc...
}
Если бы вы использовали файл шаблона вместо этого же метода, переменные были бы доступны как $raw_title
, $results
и т. Д., Так как Drupal запускает extract
на $vars
перед синтаксическим анализом файла шаблона.
Я уверен, что я многое пропустил здесь, но если у вас есть более конкретные вопросы, задавайте, и я постараюсь помочь.