Hook_preprocess_page ve hook_preprocess_html arasındaki fark nedir?


13

Ben her ikisini de görüyorum hook_preprocess_page()ve hook_preprocess_html()uygulamaları hook_preprocess_HOOK(), ama hangisini ne zaman kullanacağımı anlamıyorum.

hook_preprocess_page önce denir, ama bu onu kimin aradığını anlamama yardımcı olmaz.

Çıktıya bakıldığında, debug_print_backtrace()çağrılıyor theme(), ama bu beni gerçekten cevaba ulaştırmıyor.

Basitçe aktarılan dizi tarafından mı tanımlanıyor drupal_render()?


Günlük iletisinde, ancak bunları API belgelerine hizalamak için işlev adlarını düzenledim.
mpdonadio

1
template_preprocess_page()farklıdır hook_preprocess_page()ve dokümantasyon için orada hook_preprocess_HOOK için orada aynı şekilde, hook_process_HOOK .
kiamlaluno

Yanıtlar:


17

hook_preprocess_pagepreprocess kanca zaman çağrılan olduğunu page.tpl.php şablon dosyası kullanılır ve hook_preprocess_htmlne zaman önişleyebilir kanca çağrılan olan html.tpl.php şablon dosyası kullanılır.

Bir sayfa işlendiğinde her iki önişleme kancası çağrılır theme('page'), çünkü system_element_info () öğesinden tanımlanan sayfa öğesi html'yi tema sarmalayıcısı olarak tanımlar.

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

system_theme () daha sonra html'yi aşağıdaki gibi tanımlar.

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

Ne zaman uygulanacağına gelince hook_preprocess_html(), varsayılan olarak aşağıdaki içeriğe sahip olan html.tpl.php dosyasında kullanılan değişkenleri değiştirmek için uygularsınız.

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

Gördüğünüz gibi, yalnızca içinde mevcut olan bir sayfa içeriğini saran HTML etiketlerini içerir $page. Bununla, <head>etiketin içeriğini , sayfa başlığını ( <title>etiketteki etikete giren <head>metin), CSS stillerini ve bir sayfaya eklenen JavaScript dosyalarını, sınıfların ve <body>etiketin niteliklerini değiştirebilirsiniz .
Page.tpl.php şablon dosyasıyla, site adı, site sloganı, sayfa başlığı ve sayfa ile ilişkili yayınlar da dahil olmak üzere, oluşturulan sayfanın daha fazlasını değiştirebilirsiniz. Çoğu için, kullanmanız gereken belirli bir Drupal işlevi / kancası vardır.

hook_preprocess_HOOKtüm önişleme kancaları için kullanılan genel kanca adıdır, aynı şekilde hook_form_FORM_ID_alter()bir değişiklik kancaları sınıfı için kullanılan kanca adıdır.


Cevabın bütünlüğü için teşekkürler. Rails'ten Drupal'a geri dönüyorum, bu yüzden bazı yönleri diğerlerinden daha kolay buluyorum.
trimbletodd

8

hook_preprocess_pageve hook_preprocess_htmlşablonlarınızda ( page.tpl.php& html.tpl.php) kullanılabilecek değişkenler eklemek için kullanabileceğiniz tema katmanı kancalarıdır .

hook_preprocess_hookbu sayfanın ve html'nin kullandığı büyük tema katmanı kancası ve yaptığınız özel olanlar hook_theme().

Örneğin, işte beyanı 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
    ),
  );
}

işte önişleme işlevleriniz:

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

ek olarak hook_preprocess()birden fazla tema kancası yakalamanıza ve içine de değişkenler eklemenize izin verir

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

Ek parametre ile ilgili ipucu için teşekkür ederiz. "Mytheme_preprocess_html" gibi şeyler asla modüllerimden çağrılmadığı için bana çok yardımcı oldu.
func0der
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.