मेरे हुक द्रुपाल द्वारा नहीं लगाए गए हैं


9

मैं एक मॉड्यूल विकसित कर रहा हूं, लेकिन जो हुक मैं जोड़ रहा हूं, वे ड्रुपल से नहीं लगाए गए हैं। यह एक से अधिक हुक के साथ होता है।

मैंने हुक के लिए दस्तावेज़ीकरण पढ़ा, और मुझे ऐसा कुछ भी नहीं मिला जो यह बताता हो कि ऐसा क्यों होता है। मैंने सत्यापित किया कि मैं सही मापदंडों का उपयोग कर रहा हूं, और सही मूल्य वापस कर रहा हूं।

मैं क्या गलत कर रहा हूं? क्या मुझसे कुछ छूट रहा है?


इस सवाल को ड्रुपल द्वारा हुक न किए जाने के बारे में उन सवालों के लिए विहित प्रश्न के रूप में समझा जाता है।
kiamlaluno

जवाबों:


13

मॉड्यूल विकसित करते समय, आपको निम्नलिखित नोटों को ध्यान में रखना चाहिए।

  • मॉड्यूल से किए गए हुक का कार्यान्वयन एक फ़ंक्शन है जिसका नाम मॉड्यूल शॉर्ट नाम (जिसे मशीन का नाम भी कहा जाता है ) के साथ उपसर्ग किया जाता है ; हुक नाम से, हुक भाग को हटा दें , और इसे मॉड्यूल मशीन के नाम से बदल दें। उदाहरण के लिए, hook_menu()example.module से किया गया कार्यान्वयन है example_menu()। यदि मॉड्यूल example_menu.module है, और फ़ंक्शन है example_menu(), तो इसे hook_menu()example_menu.module के लिए कार्यान्वयन नहीं माना जाता है ।
    इसका यह भी अर्थ है, उदाहरण के लिए, कि hook_form_alter()example_form.module में कार्यान्वयन example_form_alter(), लेकिन नहीं है example_form_form_alter()। एक अन्य उदाहरण के रूप में, उदाहरण के आधार पर hook_form_FORM_ID_alter()लौटाए गए फॉर्म को बदलने के लिए किया गया कार्यान्वयन , लेकिन user_register_form()नहीं हैexample_form_user_register_alter()example_form_user_register_form_alter()। (फॉर्म आईडी user_register_form है ।)

  • सामान्य शब्दों में, मॉड्यूल मशीन नाम पर बड़े अक्षरों का उपयोग समस्या पैदा नहीं करता है: पीएचपी के बीच मतभेद पड़ता है नहीं myModule_get_value(), और mymodule_get_value(), और $value = myModule_get_value()या तो कहेंगे myModule_get_value(), या mymodule_get_value()
    हालांकि, एक ऐसा मामला है जहां मॉड्यूल मशीन के नाम में ऊपरी मामले के पात्रों का उपयोग करने से समस्याएं पैदा होती हैं: जब मॉड्यूल के लिए अपडेट हुक को परिभाषित करना। drupal_get_schema_versions(), फ़ंक्शन जो उपलब्ध अद्यतनों की सूची लौटाता है, उसमें निम्न कोड होता है।

    // Prepare regular expression to match all possible defined hook_update_N().
    $regexp = '/^(?P<module>.+)_update_(?P<version>\d+)$/';
    $functions = get_defined_functions();
    // Narrow this down to functions ending with an integer, since all
    // hook_update_N() functions end this way, and there are other
    // possible functions which match '_update_'. We use preg_grep() here
    // instead of foreaching through all defined functions, since the loop
    // through all PHP functions can take significant page execution time
    // and this function is called on every administrative page via
    // system_requirements().
    foreach (preg_grep('/_\d+$/', $functions['user']) as $function) {
      // If this function is a module update function, add it to the list of
      // module updates.
      if (preg_match($regexp, $function, $matches)) {
        $updates[$matches['module']][] = $matches['version'];
      }
    }
    

    से निष्पादित अंतिम पंक्ति drupal_get_schema_versions()निम्नलिखित है।

    return empty($updates[$module]) ? FALSE : $updates[$module];

    यदि मॉड्यूल का नाम myModule.module है, drupal_get_schema_versions('myModule')तो केवल उन कार्यों के साथ नाम वापस करेगा जो myModule_update से शुरू होता है, और एक संख्या के साथ समाप्त होता है; जैसे कार्यों mymodule_update_7120()को शामिल नहीं किया जाएगा, क्योंकि इससे प्राप्त नियमित अभिव्यक्ति drupal_get_schema_versions()केस संवेदी है। यह अभी भी Drupal 8 पर लागू होता है, क्योंकि नियमित अभिव्यक्ति अभी भी Drupal 7 में उपयोग की जाती है।

  • कुछ हुक विशिष्ट क्षणों में कहलाते हैं। उदाहरण के लिए, hook_menu()और hook_menu_alter()एक मॉड्यूल सक्षम / अक्षम होने के बाद ड्रुपल 7 से कॉल किया जाता है, या जब राउटर जानकारी के लिए कैश साफ़ हो जाता है; hook_init()कैश्ड पृष्ठों के लिए नहीं लगाया गया है।
    एक बार हुक लगाने के बाद, क्योंकि एक विशिष्ट घटना हुई, वे फिर से कॉल नहीं करेंगे जब तक कि एक समान घटना नहीं होती है। उन्हें लगातार दो पेज अनुरोध में नहीं कहा जाता है।

  • एक मॉड्यूल से लागू हुक की सूची को ड्रुपल कैश करता है। यदि आप नए हुक जोड़ने के लिए एक सक्षम मॉड्यूल के कोड को संपादित कर रहे हैं, तो आपको पहले मॉड्यूल को अक्षम करने और फिर से सक्षम करने की आवश्यकता है, या ड्रुपल नोटिस नहीं करेगा कि नए हुक हैं।

  • सुनिश्चित करें कि एक returnबयान एक refactoring के दौरान अपने हुक कार्यों में से एक में अपना रास्ता चुपके नहीं था। इसमें न केवल उस हुक को तोड़ने की क्षमता है जो वह दिखाई देता है, बल्कि एक श्रृंखला प्रतिक्रिया का कारण बनता है जो अन्य हुक को भी तोड़ता है, जिससे समस्या का पता लगाना मुश्किल हो जाता है।


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