मैं Drupal.behaviors के आदेश को कैसे नियंत्रित कर सकता हूं?


9

मैं चाहता हूं कि मॉड्यूल X से जावास्क्रिप्ट कोड केवल उसी के बाद ही चलना चाहिए जब मॉड्यूल Y ने चलाया हो। ऐसा करने का सबसे अच्छा तरीका क्या है?

जवाबों:


5

Drupal 7 द्वारा प्रयुक्त जावास्क्रिप्ट कोड निम्नलिखित है:

Drupal.attachBehaviors = function (context, settings) {
  context = context || document;
  settings = settings || Drupal.settings;
  // Execute all of them.
  $.each(Drupal.behaviors, function () {
    if ($.isFunction(this.attach)) {
      this.attach(context, settings);
    }
  });
};

Drupal 6 समान कोड का उपयोग करता है:

Drupal.attachBehaviors = function(context) {
  context = context || document;
  if (Drupal.jsEnabled) {
    // Execute all of them.
    jQuery.each(Drupal.behaviors, function() {
      this(context);
    });
  }
};

यदि जावास्क्रिप्ट गारंटी देता है कि ऑब्जेक्ट / सरणी गुण हमेशा उसी क्रम में ट्रेस किए जाते हैं जिस क्रम में उन्हें जोड़ा जाता है, तो मानों को jQuery.each()फ़ंक्शन से पास किया जाएगा जिसका उपयोग इसके दूसरे पैरामीटर के रूप में किया जाता है उसी क्रम में वे पहले पैरामीटर के रूप में पारित सरणी में डाले जाते हैं।
इसका अर्थ यह होगा कि पहले डाला गया व्यवहार Drupal.behaviorsपहले निष्पादित किया जाता है।
इस मामले में, आपके मॉड्यूल द्वारा परिभाषित व्यवहार को निष्पादित करने की अनुमति देने के लिए पहले आप इसके लिए हल्के वजन का उपयोग कर सकते हैं। यदि आप चाहते हैं कि उन्हें अन्य लोगों से पहले निष्पादित किया जाए, तो मॉड्यूल वजन को -50 पर सेट किया जाना चाहिए; अन्य मूल्य भी काम कर सकते हैं। यदि आप Drupal 7, drupal_add_js () का उपयोग कर रहे हैंजावास्क्रिप्ट कोड के लिए एक वजन संबद्ध करने की अनुमति देता है; एक हल्के वजन वाला जावास्क्रिप्ट कोड सबसे पहले HTML आउटपुट में दिखाई देता है। द्रुपाल 6, विचार के साथ यह संभव नहीं है।

जावास्क्रिप्ट इस बात की गारंटी नहीं देता है कि संपत्तियों को उसी क्रम में रखा गया है जिस क्रम में उन्हें जोड़ा गया है। इसका मतलब है कि विभिन्न जावास्क्रिप्ट कार्यान्वयन एक अलग आदेश का उपयोग करके समान गुण प्रस्तुत करेंगे; इसका मतलब यह भी है कि एक ही क्रम एक ही ब्राउज़र के विभिन्न संस्करणों में बदल सकता है।


मुझे एक बार एक पृष्ठ मिला जिसमें कुछ मॉड्यूल द्वारा उपयोग किए गए वजन को सूचीबद्ध किया गया था। मुझे उस पृष्ठ का URL याद नहीं है, और यदि पृष्ठ में केवल विशेष मॉड्यूल शामिल हैं, या यह संपूर्ण था। अगर मुझे वह पृष्ठ मिल जाए, तो मैं यहाँ लिंक की रिपोर्ट करूँगा।
कायामलुनो

1
आप हमेशा सिस्टम टेबल में देख सकते हैं - कोशिश करेंselect name, weight from system where type = 'module' order by weight ASC, name
कैम 8001

दुर्भाग्य से मुझे अपने मॉड्यूल के PHP (mymodule) को अन्य मॉड्यूल के (vertical_tabs) PHP से पहले चलाने की आवश्यकता है, लेकिन vertical_tab के js के बाद चलने के लिए mymodule का JS । क्या भार व्यवहार के लिए शुद्ध रूप से जावास्क्रिप्ट आधारित तरीका है?
कैम 31००१

@ cam8001: मुझे पता है कि, लेकिन इसका मतलब है कि आपको सभी मॉड्यूल स्थापित करने चाहिए, एक मॉड्यूल द्वारा उपयोग किए जाने वाले हल्के वजन को जानने के लिए। पृष्ठ मैंने पाया कि मॉड्यूल वज़न सूचीबद्ध है, और यह तब उपयोगी हो सकता है जब आपको यह जानना होगा कि प्रत्येक मॉड्यूल से पहले निष्पादित करने के लिए आपको अपने मॉड्यूल को कौन सा भार देना चाहिए। मुझे पता है, आप बस एक बेहद हल्के वजन का उपयोग कर सकते हैं, लेकिन आप एक ऐसे वजन का उपयोग करेंगे जो जरूरत से ज्यादा हल्का हो।
kiamlaluno

@ cam8001: उस स्थिति में, आप जो करने की कोशिश कर रहे हैं उसे पूरा करने का कोई तरीका नहीं है, सिवाय इसमें शामिल वस्तुओं के क्रम को बदलने के Drupal.behaviors; जैसा कि मैंने बताया $.each(Drupal.behaviors)कि वस्तुओं को उसी क्रम में सूचीबद्ध किया गया है, जो उनके पहचानकर्ता पर आधारित नहीं है।
किमलालुनो

5

व्यवहार भार मॉड्यूल का उपयोग करें ।
(कृपया इसे किसी उत्पादन साइट पर उपयोग करने से पहले कुछ परीक्षण दें)

मॉड्यूल व्यवहार को भार संलग्न करने की अनुमति देता है, और फिर यह drupal.attachBehaviorsएक कस्टम कार्यान्वयन के साथ अपहरण / बदल देता है , जो भार का सम्मान करता है।


इसके बजाय मॉड्यूल वजन क्यों नहीं, जैसा कि अन्य उत्तर में सुझाया गया है?

  • मॉड्यूल वजन काफी भारी उपकरण है। यह मॉड्यूल के सभी हुक कार्यान्वयन (php) और व्यवहार (js) पर लागू होता है, जबकि हम केवल एक ही व्यवहार में रुचि रखते हैं।
  • js ऑब्जेक्ट में प्रॉपर्टी के ऑर्डर की गारंटी गारंटीकृत नहीं है (हालाँकि इसे लगभग सभी ब्राउज़रों में as-you-could-expect लागू किया गया है)।

देखें
कि जब किसी वस्तु को लूपिंग के माध्यम से देखा जाता है, तो उसे किसी जावास्क्रिप्ट ऑब्जेक्ट में फ़ील्ड का क्रम कहा जाता है? और
तत्व क्रम - के लिए (… में…) जावास्क्रिप्ट में लूप


@kiam, अगर मैं drupal.org पर इसे "व्यवहार भार" ("bewgt") मॉड्यूल बनाता हूं, तो क्या आप सह-अनुरक्षक के रूप में शामिल होंगे? यह शायद काफी छोटा मॉड्यूल होने जा रहा है, लेकिन शायद इससे बेहतर है कि इसे किसी और चीज़ के साथ भेज दिया जाए। मेरे पास D6 के लिए स्थानीय रूप से एक नमूना कार्यान्वयन है, काम करने के लिए लगता है।
दान

बस हो गया .. आपको अभी भी आमंत्रित किया गया है :)
donquixote

drupal.org/node/1302126 - मुझे उम्मीद है कि यह D8 में कोर में होगा :)
donquixote

यह एक दिलचस्प मॉड्यूल होगा, लेकिन मुझे पहले अपने कुछ मॉड्यूल के कोड को अपडेट करना होगा, जिसके लिए मैंने उम्र से कोड की एक पंक्ति नहीं लिखी थी। उसके बाद, मैं एक नए मॉड्यूल के सह-विकास के लिए स्वतंत्र हो सकता हूं।
kiamlaluno

सिर्फ कहने के लिए, लोग उपयोग के मामलों के लिए पूछ रहे हैं। drupal.org/node/1302126#comment-5911632
प्रातः काल

0

द्रुपाल 6 के लिए -

एक सरल समाधान, अगर यह पोर्टेबल होने की आवश्यकता नहीं है, तो जेएस को आप थीम टेम्पलेट.फैप फ़ाइल में अंतिम रूप से चलाना चाहते हैं। थीम drupal_add_js कॉल हमेशा मॉड्यूल के बाद कहा जाता है।

अगर यह ड्रुपल 6 में "सबसे साफ" समाधान पोर्टेबल होने की आवश्यकता है, तो एक नया मॉड्यूल जोड़ना है जिसका php के साथ आपके मॉड्यूल से अलग वजन है। आप एक ही फ़ोल्डर में दो मॉड्यूल भी रख सकते हैं, पहले मॉड्यूल को पहले पर निर्भर करते हैं, और इंस्टॉल / बैक हुक में वजन समायोजित करते हैं। जिनमें से कोई भी आवश्यक नहीं है, बस स्थापना को आसान बनाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.