मैं उन हुक के बीच डेटा कैसे पास कर सकता हूं जो बातचीत नहीं करते हैं?


10

मैं उन हुक के बीच डेटा कैसे पास कर सकता हूं जो उनके बीच या एक मेनू कॉलबैक और एक हुक के बीच बातचीत नहीं करते हैं?

मामले में दो हुक में एक पैरामीटर सामान्य होता है, और यह पैरामीटर संदर्भ द्वारा पारित किया जाता है, यह आसान है। हुक या मेनू कॉलबैक और हुक के होने पर मुझे क्या करना चाहिए, एक सामान्य पैरामीटर नहीं मिलता है?

जवाबों:


12

Drupal 7 या उच्चतर में, drupal_static () के साथ संकलित एक स्थिर चर का उपयोग करें ।
drupal_static()एक ऐसा कार्य है जो स्टेटिक वैरिएबल के लिए केंद्रीय भंडारण को संभालता है। staticकीवर्ड का उपयोग करते हुए घोषित किए गए वैरिएबल से भिन्न , drupal_static()प्रत्येक फ़ंक्शन से संकलित स्थिर वैरिएबल सुलभ हैं; यह संभव है क्योंकि drupal_static()संदर्भ द्वारा चर की सामग्री को लौटाता है, जिससे प्रत्येक फ़ंक्शन को इसे बदलने की अनुमति मिलती है।

मान लीजिए कि आपको मेनू हैंडलर, और हुक_ब्लॉक_व्यू () के कार्यान्वयन के बीच एक मान पारित करने की आवश्यकता है ; आप निम्नलिखित कोड का उपयोग कर सकते हैं।

function mymodule_menu() {
  return array('path/%' => array(
    'page callback' => 'mymodule_callback_function',
    'page arguments' => array(1),
  ));
}

function mymodule_callback_function($data) {
  $data_passer = &drupal_static('mymodule_block_data');

  $data_passer = $data;

  // Other logic specific to this page callback.
}

function mymodule_block_view($delta = '') {
  // $data_passer will now contain the value of $data, from above.
  $data_passer = &drupal_static('mymodule_block_data');

  // Change the block content basing on the content of $data_passer.
}

उस स्थिति में जब डेटा को अधिक बार एक्सेस करने की आवश्यकता होती है, आपको एक स्थिर स्थानीय चर का उपयोग करना चाहिए, जिसमें से लौटाया गया मान शामिल होगा drupal_static()। चूंकि स्थिर चर को केवल शाब्दिक मूल्य से आरंभ किया जा सकता है , और स्थैतिक चर को संदर्भों को नहीं सौंपा जा सकता है , केवल काम करने वाला कोड निम्नलिखित के समान है। (यह कोड user_access () से लिया गया है )

  // Use the advanced drupal_static() pattern, since this is called very often.
  static $drupal_static_fast;
  if (!isset($drupal_static_fast)) {
    $drupal_static_fast['perm'] = &drupal_static(__FUNCTION__);
  }
  $perm = &$drupal_static_fast['perm'];

से लौटाया गया मूल्य drupal_static()हर बार Drupal bootstraps पर रीसेट हो जाता है; यदि आपको अलग-अलग पृष्ठों के बीच एक मान की आवश्यकता होती है, तो आपको मूल्य को संग्रहीत करने के लिए डेटाबेस तालिका का उपयोग करने की आवश्यकता है, या variable_get () / variable_set () का उपयोग करें

Drupal 6 लागू नहीं होता है drupal_static(), लेकिन आप इसके कोड को अपने मॉड्यूल में परिभाषित फ़ंक्शन में कॉपी कर सकते हैं।

function &mymodule_static($name, $default_value = NULL, $reset = FALSE) {
  static $data = array(), $default = array();

  // First check if dealing with a previously defined static variable.
  if (isset($data[$name]) || array_key_exists($name, $data)) {
    // Non-NULL $name and both $data[$name] and $default[$name] statics exist.
    if ($reset) {
      // Reset pre-existing static variable to its default value.
      $data[$name] = $default[$name];
    }
    return $data[$name];
  }

  // Neither $data[$name] nor $default[$name] static variables exist.
  if (isset($name)) {
    if ($reset) {
      // Reset was called before a default is set and yet a variable must be
      // returned.
      return $data;
    }
    // First call with new non-NULL $name. Initialize a new static variable.
    $default[$name] = $data[$name] = $default_value;
    return $data[$name];
  }

  // Reset all: ($name == NULL). This needs to be done one at a time so that
  // references returned by earlier invocations of drupal_static() also get
  // reset.
  foreach ($default as $name => $value) {
    $data[$name] = $value;
  }

  // As the function returns a reference, the return should always be a
  // variable.
  return $data;
}

स्थैतिक चर drupal_static()(या आपके मॉड्यूल में परिभाषित बैक पोर्टेड फ़ंक्शन) का उपयोग करने से पहले , आपको इन बातों को ध्यान में रखना चाहिए:

  • कोड तभी काम करता है जब वह कोड जो स्टैटिक वैरिएबल सेट करता है, कोड से पहले उसका मूल्य प्राप्त करता है; यदि निष्पादन आदेश सोचा नहीं है, तो कोड काम नहीं करता है। जब Drupal प्रलेखन में निष्पादन के आदेश को स्पष्ट रूप से परिभाषित नहीं किया गया है, तो Drupal के भविष्य के संस्करणों में क्रम परिवर्तन का जोखिम है; निष्पादन क्रम की जाँच करें Drupal संस्करण में नहीं बदलता है जिसके लिए आप अपना कोड लागू कर रहे हैं।
  • Drupal विभिन्न हुक के बीच डेटा साझा करने के लिए एक तंत्र लागू कर सकता था। उदाहरण के लिए, hook_form_alter () के विभिन्न कार्यान्वयनों के मामले में , प्रत्येक कार्यान्वयन अन्य hook_form_alter()कार्यान्वयन के साथ डेटा साझा कर सकता है $form_state; उसी तरह, सत्यापन हैंडलर, और फॉर्म सबमिट हैंडलर, $form_stateसंदर्भ द्वारा पारित पैरामीटर का उपयोग करके डेटा साझा कर सकते हैं । अपना स्वयं का कोड लागू करने से पहले, यह सत्यापित करें कि विशिष्ट मामले के लिए Drupal द्वारा पहले से लागू किए गए एक अलग तंत्र का उपयोग करके डेटा साझा करना संभव है।

मूल पोस्टर के लिए यहां दिए गए उत्तर की वास्तव में सराहना करें। हालाँकि मेरी चिंता यह है कि मुझे बताया गया है कि ड्रुपल स्टैटिक वेरिएबल्स का उपयोग बहुत अच्छी तरह से नहीं होता है - साइटों के लिए बहुत सारे अनुरोधों को संभालने के कारण, इस तथ्य के कारण कि चर का पूरा सेट हर बार, प्रत्येक सत्र के लिए लोड किया जाता है (या ऐसा कुछ) यह।) मुझे यह एक सहकर्मी द्वारा बताया गया था, जो इससे संबंधित एक प्रदर्शन मुद्दे पर काम कर रहा था। तुम क्या सोचते हो? उन्होंने सलाह दी कि ड्रुपल कैश का उपयोग चर को पास करने का एक बेहतर तरीका होगा (यह मानते हुए कि गंतव्य कोड द्वारा डेटा प्राप्त होने के बाद उन्हें इसकी आवश्यकता नहीं है)
therobyouknow

"अनुरोध का एक बहुत से निपटने साइटों के लिए, तथ्य यह है कि चर के पूरे सेट हर बार भरी हुई है के कारण" @therobyouknow चर है कि तालिका , और नहीं किसी भी स्थिर चर है, जो एक पूरी तरह से अलग बात है। स्थैतिक चर खुद पर नगण्य प्रदर्शन प्रभाव डालते हैं। यहां तक ​​कि चर तालिका में, आपको मुद्दों का कारण बनने के लिए सिस्टम का दुरुपयोग करना होगा। Economist.com में एक घंटे में आसानी से कई 100k हिट हो सकते हैं, जिनमें से सभी चर तालिका को लोड करते हैं। चर एक मुद्दा नहीं हैं, लेकिन निश्चित रूप से, हम केवल प्रत्येक चर में जानकारी के छोटे टुकड़े संग्रहीत करते हैं।
14:47 पर सुस्ती जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.