सभी हुक_अपडेट_ () चलाने के लिए हुक_ इंस्टॉलेशन () कैसे प्राप्त करें?


18

मैं अपने मॉड्यूल के लिए सभी अपडेट चलाने के लिए हुक_ इंस्टॉलेशन () कैसे प्राप्त कर सकता हूं? मुझे इसमें mymod.install फाइल है।

मैंने कोशिश की है

function mymod_install() {
  mymod_update_6001();
}

लेकिन यह कुछ भी करने के लिए प्रतीत नहीं होता है। यदि मेरे पास mymod_update_6002 () है, तो मैं अभी भी 6001 (), सिर्फ 6002 () पर कॉल करूंगा या दोनों को 6001 (), 6002 () में कॉल करूंगा।

मैंने सोचा था कि जब आप डिफ़ॉल्ट रूप से एक मॉड्यूल स्थापित करते हैं तो सभी अपडेट चलाना सामान्य ज्ञान होगा।

जवाबों:


19

अद्यतनों को चलाने के लिए आपको अपना स्थापित हुक नहीं मिलना चाहिए। जब पहली बार एक मॉड्यूल स्थापित किया जाता है तो कोई भी अपडेट आवश्यक नहीं होना चाहिए।

अद्यतनों का उपयोग तब किया जाता है जब मॉड्यूल पहले से स्थापित है (डेटाबेस या चर बनाया गया है)। उस स्थिति में, आप मॉड्यूल को फिर से स्थापित नहीं करना चाहते हैं क्योंकि यह सभी डेटा मिटा देगा, इसके बजाय आप update_N हुक बनाते हैं। Drupal यह पता लगाएगा कि किन अपडेट्स की जरूरत है और उन पर काम किया जाएगा update.php। Drupal 6 में यह ऑटो सेलेक्ट करेगा कि कौन सा अपडेट करना है, लेकिन आप इसे बदल सकते हैं, जबकि Drupal 7 में यह संभव नहीं है।

Drupal पता लगाता है कि अंतिम रन अपडेट की संख्या को बचाकर कौन से अपडेट की आवश्यकता है। यह डेटाबेस में परिवर्तन हो सकता है, जो Drupal 7 में पुन: अपडेट करने की अनुमति देगा। पुन: गतिशील अद्यतन आमतौर पर एक बुरा विचार है और सबसे अधिक बार त्रुटियों का कारण होगा और कुछ मामलों में आपके डेटा को गड़बड़ कर सकता है।

अपडेट चलाने से पहले अपने डेटाबेस का बैकअप हमेशा याद रखें।


15

हुक का उद्देश्य अलग है।

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

यदि कुछ कार्य हैं जिन्हें मॉड्यूल स्थापित करने के दौरान दोनों करने की आवश्यकता है, और जब मॉड्यूल अपडेट किया जाता है, तो कोड दोनों हुक में मौजूद होना चाहिए। कोई मॉड्यूल नहीं है जो स्थापना के दौरान सभी अपडेट हुक को आमंत्रित करता है, और यह विशेष रूप से गलत होगा जब अपडेट फ़ंक्शन मॉड्यूल से उपयोग किए गए डेटाबेस तालिकाओं के स्कीमा को अपडेट करता है; hook_schema () को हमेशा अपडेटेड स्कीमा को वापस करना चाहिए, और स्कीमा को अपडेट करने के लिए भी अपडेट करना गलत होगा।

आपके द्वारा लिखा गया कोड काम नहीं करता है क्योंकि किसी एक अपडेट फ़ंक्शन को कॉल करने से अन्य सभी अपडेट फ़ंक्शन स्वचालित रूप से निष्पादित नहीं होते हैं।
के कार्यान्वयन से अपडेट फ़ंक्शन hook_install()को कॉल करना गलत है, क्योंकि किसी अन्य से अपडेट फ़ंक्शन को कॉल करना गलत है; अगर कुछ कोड है जिसे दो या अधिक अपडेट फ़ंक्शन से निष्पादित करने की आवश्यकता है, तो उस कोड को एक फ़ंक्शन में रखा जाना चाहिए जिसे अपडेट फ़ंक्शन से बुलाया गया है, और hook_install()यदि आवश्यक हो , तो।


5

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

इंस्टॉल पर चलने के लिए अद्यतन कार्यों को मजबूर करने के लिए, आपको अपने स्कीमा संस्करण को बदलना होगा, उदाहरण के लिए:

function mymod_install() {
  // Reset the schema version, so our update hooks can be processed during the installation.
  drupal_set_installed_schema_version('mymod', '7000');
  // Then run the updates as usual.
  mymod_update_7001();
}

या इसे ड्रश से चलाएं drush -y updb:।

यह भी देखें: क्या आपके मॉड्यूल के अपडेट हुक को चलाने के लिए मजबूर करना संभव है?


1

हुक_ स्थापना mymod.moduleफ़ाइल में काम नहीं करेगी ।

आप जगह पर है hook_installऔर hook_uninstallएक अलग फाइल मेंmymod.install

मुझे लगता है कि hook_update_N()इसे भी रखा जाना चाहिएmymod.install


अद्यतन किए गए प्रश्न के बाद उत्तर:

एक लिंक से उद्धृत , कृपया जानकारी फ़ाइल में अपना संस्करण संख्या जांचें।

जब से मैं निजी तौर पर विकसित कर रहा हूं और योगदान के लिए नहीं, मेरे मॉड्यूल में .INfo फ़ाइल में मेरा 'संस्करण' फ़ील्ड या तो रिक्त है या अपरिवर्तित है जब मैं किसी मॉड्यूल को अपडेट करता हूं। मैं वास्तव में ग्रहण पीडीटी के लिए सबवर्सिव का उपयोग कर रहा हूं और इसलिए मेरी जानकारी फ़ाइल संस्करण संख्या कभी भी अपडेट नहीं होती है। इस प्रकार, मेरे hook_update_6001 को update.php द्वारा नहीं बुलाया जा रहा था।

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