पृष्ठ प्रीप्रोसेस फ़ंक्शन के लिए HTML प्रीप्रोसेस फ़ंक्शन से चर पास करें?


10

मेरे कस्टम थीम के कार्यों hook_preprocess_page()और hook_preprocess_html()कार्यों में, मुझे अक्सर उसी जानकारी को पहचानने की आवश्यकता होती है। अनिवार्य रूप से एक ही चलाने के बजाय यदि कथन एक ही जानकारी की पहचान करता है, तो यह दोनों में एक बार करने के लिए बहुत अधिक समझ में आएगा और फिर उस जानकारी को अन्य प्रीप्रोसेस फ़ंक्शन में पास करेगा। मैं यह कैसे कर सकता हूँ? मैंने निम्नलिखित की कोशिश की, लेकिन यह काम नहीं किया:

function myTheme_preprocess_page(&$vars){
    $vars['myValue'] = 7;
}

function myTheme_preprocess_html(&$vars){
    //$vars['myValue'] should equal 7...
}

मैंने इसे दूसरे तरीके से भी आज़माया (मान को प्रीप्रोसेस HTML फ़ंक्शन में सेट करना और फिर इसे पेज प्रीप्रोसेस फ़ंक्शन में पुनर्प्राप्त करना) लेकिन यह भी काम नहीं किया। जो एक संबंधित प्रश्न लाता है: किस क्रम में ये प्रीप्रोसेस फ़ंक्शंस, एर, प्रोसेस्ड हैं? यह मुझे लगता है कि पेज प्रीप्रोसेस फ़ंक्शन html एक से पहले आता है, क्या यह सही है?

जवाबों:


14

इसे पूरा करने के लिए आपको globalया तो एक या staticचर की आवश्यकता होगी ... व्यक्तिगत रूप से मैं staticड्रुपल के स्थिर पैटर्न का उपयोग करके एक सामान्य सहायक फ़ंक्शन के साथ जाने और लागू करने की सिफारिश करूंगा :

function _myTheme_var($var_name, $new_val = NULL) {
  $vars = &drupal_static(__FUNCTION__, array());

  // If a new value has been passed
  if ($new_val) {
    $vars[$var_name] = $new_val;
  }

  return isset($vars[$var_name]) ? $vars[$var_name] : NULL;
}

function myTheme_preprocess_page(&$vars){
  $vars['some_var'] = _myTheme_var('my_var', 7); // Set the value and retrieve it
}

function myTheme_preprocess_html(&$vars){
  $vars['some_var'] = _myTheme_var('my_var'); // Get the value
}

$varsप्रत्येक preprocess समारोह के लिए सरणियों स्मृति में पूरी तरह से अलग वस्तुओं रहे हैं ताकि आप उस सरणी का उपयोग करने के चीजों के आसपास पारित करने में सक्षम नहीं होगा। मैंने देखा है कि इस तरह का पैटर्न ड्रुपल कोर में बहुत उपयोग किया जाता है इसलिए मुझे लगता है कि यह जाने का सबसे अच्छा तरीका होगा।

संपादित करें

ओह और हाँ, hook_preprocess_page()पहले कहा जाता है hook_preprocess_html()... जहाँ तक मुझे पता है Drupal "अंदर-बाहर" तरीके से काम करता है, तो hook_preprocess_html()शायद यह आखिरी होगा जो एक पेज बिल्ड में चलता है।


3

मैंने इसे 'नोड' और 'पेज' के समान मामले के साथ पूरा किया:

function mymodule_preprocess_node(&$vars) {
  _mymodule_preprocess_vars($vars,'node');
}

function mymodule_preprocess_page(&$vars) {
  _mymodule_preprocess_vars($vars,'page');
}

function _mymodule_preprocess_vars(&$vars, $where) {

  // all vars common to both node and page set here

  switch($where) {

    case 'node':

      // node only vars set here;

      break;

    case 'page':

      // page only vars set here;

      break;
  }
}

इसलिए मुझे लगता है कि यह 'पेज' और 'html' के बजाय इसी तरह काम करेगा।


हाँ, यह काम करेगा। लेकिन यह बहुत कुशल नहीं है क्योंकि उन $ var के लिए जिन्हें किसी प्रकार की प्रसंस्करण की आवश्यकता होती है, वह प्रसंस्करण कई बार होता।
मैक्स

सच है, अगर यह प्रीप्रोसेस फ़ंक्शंस के बीच आम तौर पर कुछ हैवीवेट है, जैसे कुछ जटिल एसक्यूएल परिणाम के लिए एक चर सेट करना, हाँ, आप शायद इसे कई बार नहीं करना चाहते हैं, लेकिन यह आसानी static से पहले जवाब की तरह कुछ प्रसंस्करण के साथ हल हो जाता है । और प्रकाश वजन सेटिंग्स वास्तव में तेजी से हो सकता है क्योंकि आपके पास प्रत्येक फ़ंक्शन के लिए फ़ंक्शन कॉल ओवरहेड नहीं है, मुख्य फ़ंक्शन को कॉल करने में बस पहली बार। और स्पष्ट रूप से प्रमुख अंश (नोड और पेज) केवल एक बार सेट हो जाते हैं।
जिमजम्मा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.