Hook_preprocess_page और hook_preprocess_html में क्या अंतर है?


13

मुझे लगता है कि दोनों hook_preprocess_page()और के hook_preprocess_html()कार्यान्वयन हैं hook_preprocess_HOOK(), लेकिन मुझे समझ में नहीं आता कि कब कौन सा उपयोग करना है।

hook_preprocess_page पहले कहा जाता है, लेकिन यह वास्तव में मुझे यह समझने में मदद नहीं करता है कि कौन इसे बुला रहा है।

debug_print_backtrace()आउटपुट को देखते हुए , यह कहा जा रहा है theme(), लेकिन यह वास्तव में मुझे जवाब नहीं देता है।

क्या यह केवल उस सरणी द्वारा परिभाषित किया गया है जिसे पारित किया गया है drupal_render()?


यह लॉग संदेश में है, लेकिन मैंने एपीआई डॉक्स के साथ संरेखित करने के लिए फ़ंक्शन नाम संपादित किए।
mpdonadio

1
template_preprocess_page()से भिन्न है hook_preprocess_page(), और हुक_परप्रोसेसर_हुक के लिए प्रलेखन है , उसी तरह हुक_प्रोसेस_हुक के लिए है
kiamlaluno

जवाबों:


17

hook_preprocess_pagepreprocess हुक लागू जब है page.tpl.php टेम्पलेट फ़ाइल प्रयोग किया जाता है, और hook_preprocess_htmlpreprocess हुक लागू जब है 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>), सीएसएस शैलियों और जावास्क्रिप्ट फ़ाइलें एक पृष्ठ में जोड़ सकते हैं, कक्षाएं और <body>टैग के लिए विशेषताएँ ।
Page.tpl.php टेम्प्लेट फ़ाइल के साथ, आप पृष्ठ का अधिक नाम परिवर्तित कर सकते हैं, जिसमें साइट का नाम, साइट का नारा, पृष्ठ का शीर्षक और पृष्ठ से जुड़े फ़ीड शामिल हैं। उनमें से ज्यादातर के लिए, एक विशिष्ट Drupal फ़ंक्शन / हुक है जिसे आपको उपयोग करना चाहिए।

hook_preprocess_HOOKसभी प्रीप्रोसेस हुक के लिए उपयोग किया जाने वाला जेनेरिक हुक नाम है, उसी तरह hook_form_FORM_ID_alter()एक हुक नाम है जिसे किसी परिवर्तनशील हुक के वर्ग के लिए उपयोग किया जाता है।


उत्तर की पूर्णता के लिए धन्यवाद। मैं पटरियों से ड्रुपल में वापस आ रहा हूं, इसलिए मुझे कुछ पहलुओं को दूसरों की तुलना में आसान लग रहा है।
ट्रिम्बलटोड

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" जैसे सामान को कभी भी मेरे मॉड्यूल के भीतर से नहीं बुलाया जाता है।
फन्कॉर्डर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.