Яка різниця між ho_preprocess_page та ho__proprocess_html?


13

Я бачу, що це hook_preprocess_page()і hook_preprocess_html()реалізація hook_preprocess_HOOK(), але я не розумію, коли використовувати.

hook_preprocess_page називається спочатку, але це не дуже допомагає мені зрозуміти, хто це викликає.

Дивлячись на debug_print_backtrace()висновок, йому дзвонять theme(), але це насправді не дає мені відповіді.

Це просто визначений масив, який передається в drupal_render()?


Це в повідомленні журналу, але я редагував назви функцій, щоб вирівняти їх з документами API.
mpdonadio

1
template_preprocess_page()відрізняється від hook_preprocess_page(), і там є документація для гачка_препроцесс_HOOK , точно так само, як і для гачки_процес_HOOK .
kiamlaluno

Відповіді:


17

hook_preprocess_page- це гачок попередньої обробки, який викликається при використанні файлу шаблону page.tpl.php , і hook_preprocess_htmlце гачок передпроцесового виклику, коли використовується файл шаблону html.tpl.php .

Обидва гачки попередньої обробки викликаються під час відображення сторінки theme('page'), оскільки елемент сторінки, визначений у system_element_info (), визначає html як обгортку теми.

  $types['page'] = array(
    '#show_messages' => TRUE,
    '#theme' => 'page',
    '#theme_wrappers' => array('html'),
  );

system_theme () визначає html наступним чином.

'html' => array(
  'render element' => 'page',
  'template' => 'html',
),

Що стосується того, коли потрібно реалізувати hook_preprocess_html(), ви реалізуєте це для зміни змінних, що використовуються у файлі html.tpl.php, який за замовчуванням містить наступний вміст.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
  "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language; ?>" version="XHTML+RDFa 1.0" dir="<?php print $language->dir; ?>"<?php print $rdf_namespaces; ?>>

<head profile="<?php print $grddl_profile; ?>">
  <?php print $head; ?>
  <title><?php print $head_title; ?></title>
  <?php print $styles; ?>
  <?php print $scripts; ?>
</head>
<body class="<?php print $classes; ?>" <?php print $attributes;?>>
  <div id="skip-link">
    <a href="#main-content" class="element-invisible element-focusable"><?php print t('Skip to main content'); ?></a>
  </div>
  <?php print $page_top; ?>
  <?php print $page; ?>
  <?php print $page_bottom; ?>
</body>
</html>

Як бачите, він містить лише теги HTML, які містять вміст сторінки, доступний у $page. За допомогою цього ви можете змінити вміст <head>тегу, заголовок сторінки (той, що йде в <title>тег у <head>тезі), стилі CSS та файли JavaScript, додані до сторінки, класи та атрибути для <body>тегу.
За допомогою файлу шаблону page.tpl.php ви можете змінити більше сторінки, що надається, включаючи назву сайту, гасло сайту, назву сторінки та канали, пов’язані зі сторінкою. Для більшості з них існує певна функція / гачок Drupal, яку ви повинні використовувати.

hook_preprocess_HOOK- це загальне ім'я гака, яке використовується для всіх гачків попередньої обробки, так само hook_form_FORM_ID_alter(), як назва гака, що використовується для класу гачок для зміни.


Дякую за повноту відповіді. Я повертаюся до Drupal з Rails, тому я знаходжу деякі аспекти простіше, ніж інші.
trimbletodd

8

hook_preprocess_pageі hook_preprocess_htmlє гачками шару теми, які можна використовувати для додавання змінних, які можна використовувати у ваших шаблонах ( page.tpl.php& html.tpl.php).

hook_preprocess_hook- це великий гак тематичного шару, який використовується на цій сторінці та html, і в користувацьких, які ви також створили hook_theme().

Наприклад, ось декларація hook_theme():

function mymodule_theme($existing, $type, $theme, $path) {
  return array(
    'custom_theme_function' => array(
      'variables' => NULL
      'template' => 'custom-theme-template', // available as custom-theme-template.tpl.php
    ),
  );
}

і ось ваші функції попередньої обробки:

mytheme_preprocess_page(&$vars) {
    $vars['variable'] = 'string'; // $variable will be available in page.tpl.php
}

mytheme_preprocess_html(&$vars) {
    $vars['variable'] = 'string'; // $variable will be available in html.tpl.php
}

mytheme_preprocess_custom_theme_function(&$vars) {
    $vars['variable'] = 'string';  // $variable will be available in the template you specified in mymodule_theme() (custom-theme-template.tpl.php)
}

додатково hook_preprocess()дозволяє захоплювати декілька гачків тем, а також додавати в нього змінні

mymodule_preprocess(&$vars, $hook) {
  if ($hook == 'custom_theme_function') {
    $vars['variable'] = 'string'; // $variable will be available in them template you specified in mymodule_theme() (custom-theme-template.tpl.php)
  }
  if ($hook == 'page') {
    $vars['variable'] = 'string'; // $variable will be available in page.tpl.php
  }
  if ($hook == 'html') {
    $vars['variable'] = 'string'; // $variable will be available in html.tpl.php
  }
}

Дякую за підказку з додатковим параметром. Дійсно мені дуже допомогли, тому що такі речі, як "mytheme_preprocess_html", ніколи не дзвонять з моїх модулів.
func0der
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.