Sự khác biệt giữa hook_pre process_page và hook_pre process_html là gì?


13

Tôi thấy rằng cả hai hook_preprocess_page()hook_preprocess_html()đều là triển khai hook_preprocess_HOOK(), nhưng tôi không hiểu khi nào nên sử dụng.

hook_preprocess_page được gọi đầu tiên, nhưng điều đó không thực sự giúp tôi hiểu ai đang gọi nó.

Nhìn vào debug_print_backtrace()đầu ra, nó sẽ được gọi bởi theme(), nhưng điều đó không thực sự khiến tôi phải trả lời.

Có phải nó được định nghĩa đơn giản bởi mảng được truyền vào drupal_render()?


Đó là trong thông điệp tường trình, nhưng tôi đã chỉnh sửa tên hàm để căn chỉnh chúng với các tài liệu API.
mpdon Arena

1
template_preprocess_page()khác với hook_preprocess_page()và có tài liệu cho hook_pre process_HOOK , theo cách tương tự như vậy đối với hook_ process_HOOK .
kiamlaluno

Câu trả lời:


17

hook_preprocess_pagelà hook tiền xử lý được gọi khi tệp mẫu page.tpl.php được sử dụng và hook_preprocess_htmllà hook tiền xử lý được gọi khi tệp mẫu html.tpl.php được sử dụng.

Cả hai móc tiền xử lý được gọi khi một trang được kết xuất theme('page'), vì phần tử trang được xác định từ system_element_info () định nghĩa html là trình bao bọc chủ đề.

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

system_theme () sau đó định nghĩa html như sau.

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

Khi thực hiện hook_preprocess_html(), bạn triển khai nó để thay đổi các biến được sử dụng trong tệp html.tpl.php, theo mặc định có nội dung sau.

<!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>

Như bạn có thể thấy, nó chỉ chứa các thẻ HTML bao bọc một nội dung trang, có sẵn trong $page. Cùng với đó, bạn có thể thay đổi nội dung của <head>thẻ, tiêu đề trang (tiêu đề trong <title>thẻ trong <head>thẻ), kiểu CSS và tệp JavaScript được thêm vào một trang, các lớp và thuộc tính cho <body>thẻ.
Với tệp mẫu page.tpl.php, bạn có thể thay đổi nhiều trang đang được hiển thị, bao gồm tên trang web, khẩu hiệu trang web, tiêu đề trang và nguồn cấp dữ liệu được liên kết với trang. Đối với hầu hết trong số họ, có một chức năng / móc Drupal cụ thể mà bạn nên sử dụng.

hook_preprocess_HOOKlà tên hook chung được sử dụng cho tất cả các hook tiền xử lý, theo cùng một cách hook_form_FORM_ID_alter()là tên hook được sử dụng cho một lớp hook thay đổi.


Cảm ơn sự hoàn chỉnh của câu trả lời. Tôi đang ủng hộ Drupal từ Rails vì vậy tôi tìm thấy một số khía cạnh dễ dàng hơn những khía cạnh khác.
trimbletodd

8

hook_preprocess_pagehook_preprocess_htmllà các móc lớp chủ đề mà bạn có thể sử dụng để thêm các biến có thể được sử dụng trong các mẫu ( page.tpl.php& html.tpl.php) của mình.

hook_preprocess_hooklà lớp chủ đề lớn móc mà trang và html sử dụng, và các tùy chỉnh bạn đã thực hiện hook_theme().

Ví dụ, đây là tuyên bố của 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
    ),
  );
}

và đây là các chức năng tiền xử lý của bạn:

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)
}

ngoài ra, hook_preprocess()cho phép bạn chụp nhiều hook theme và thêm các biến trong đó

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
  }
}

Cảm ơn bạn đã gợi ý với các tham số bổ sung. Thực sự đã giúp tôi rất nhiều, bởi vì những thứ như "huyền thoại_pre process_html" không bao giờ được gọi từ trong các mô-đun của tôi.
func0der
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.