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


18

मैं दिनांक iCal मॉड्यूल का लेखक हूं, और मैं जिस नए प्रमुख संस्करण पर काम कर रहा हूं (3.x) को उन उपयोगकर्ताओं के लिए दो-भाग स्कीमा अपडेट की आवश्यकता है जिन्होंने 2.x स्थापित किया था। मैंने अपडेट हुक लिखा है जो इन परिवर्तनों को बनाता है, लेकिन अगर मेरा कोई उपयोगकर्ता डेटाबेस अपडेट स्क्रिप्ट को चलाने में विफल रहता है, तो उन्हें अपने iCal फीड आयातकों से संबंधित एक त्रुटि संदेश मिलेगा।

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

तो क्या उन उपयोगकर्ताओं के लिए एक संदेश प्रदर्शित करने का कोई तरीका है जो अपडेट नहीं चलाते हैं? या किसी तरह से जबरन अपडेट हुक को अंजाम दिया जाता है जब पेज लोड होने पर पहली बार 3.x 2.x के ओवरटॉप हो जाता है?


2
मुझे लगता है कि आप variable_set()अपने अपडेट फ़ंक्शन में एक ऐसा कर सकते हैं जो एक चर सेट करता है जब यह सफलतापूर्वक चलाया गया था कि आप अंदर देख सकते हैं _preprocess_page()लेकिन आप हर बार इसे देख रहे होंगे ताकि यह सुनिश्चित न हो कि प्रदर्शन कितना अनुकूल होगा।
जिमजम्मा 20

जवाबों:


4

जिमजम्मा की टिप्पणी पर विस्तार:

variable_set()अपने अपडेट फ़ंक्शन में ऐसा करें जो एक चर सेट करता है जब इसे सफलतापूर्वक चलाया गया था जिसे आप _preprocess_page () के अंदर देख सकते हैं

और हर पेज लोड पर यह जाँचने के बजाय, केवल तभी करें जब व्यवस्थापक क्षेत्र को ब्राउज़ करें और यदि स्थापित संस्करण 3.0 (3.1, 3.2) है, तो उस जाँच को मार दें यदि आप पुराने संस्करण को अपग्रेड पथ के रूप में समर्थन करना बंद कर देते हैं)।

इसके अलावा स्थिति रिपोर्ट पेज पर प्रतिक्रिया प्रदान करने के लिए हुक_ वेतन का उपयोग करें :

स्थापना आवश्यकताओं की जाँच करें और स्थिति रिपोर्टिंग करें।
(...)
'रनटाइम' चरण केवल शुद्ध इंस्टॉलेशन आवश्यकताओं तक सीमित नहीं है, बल्कि रखरखाव कार्यों और सुरक्षा मुद्दों जैसे सामान्य स्थिति की जानकारी के लिए भी उपयोग किया जा सकता है।


15

मॉड्यूल अपडेट को मजबूर करने के कुछ तरीके हैं।

  1. सीधे अपडेट फ़ंक्शन को कॉल करना।

    $sandbox = [];
    module_load_include('install', 'FOO');
    FOO_update_7001($sandbox);
  2. स्कीमा संस्करण को रुचि के बिंदु पर रीसेट करना और हमेशा की तरह फिर से अपडेट चलाना।

    drupal_set_installed_schema_version('module_name', '7000');

    या केवल नवीनतम अपडेट स्कीमा को फिर से चलाने के लिए रीसेट करें:

    drupal_set_installed_schema_version('foo', drupal_get_installed_schema_version('foo') - 1);

    टिप्पणियाँ:

    • इसमें रखा जा सकता है hook_install, इसलिए अद्यतन प्रक्रिया के दौरान सभी अनुक्रम अद्यतन हुक निष्पादित किए जाएंगे।
    • स्थापना फ़ाइल के बाहर इस फ़ंक्शन का उपयोग करने के लिए, आपको Drupal को install.incपहले और मॉड्यूल की स्थापना फ़ाइल में शामिल करना होगा, जैसे

      require_once DRUPAL_ROOT . '/includes/install.inc';
      module_load_include('install', 'foo');
    • ini_set('max_execution_time', 0);PHP टाइमआउट को रोकने के लिए अधिक इंस्टॉलेशन अपडेट्स को जोड़ने पर विचार करें ।
  3. का उपयोग कर drush। नीचे कुछ उदाहरण खोजें:

    • drush eval 'module_load_include('install', 'foo'); $s = []; foo_update_7001($s);'
    • drush sqlq "UPDATE system SET schema_version = 7000 WHERE name = 'foo'" && drush -y updb

1
ओह अच्छा, मुझे इसके बारे में पता नहीं था drupal_set_installed_schema_version()। अद्यतन डिबगिंग के लिए यह सुपर आसान होगा!
coredumperror

1
तो इसे डालने में मुख्य समस्या hook_install()लंबे बैचेड (सैंडबॉक्स) अपडेट्स को चलाने की है। आदर्श स्थिति में, उसी तरह से अपडेट को ट्रिगर करने का एक तरीका होना चाहिए जैसा update.phpकि टाइमआउट को रोकने के लिए PHP थ्रेड को पुनरारंभ करने के साथ होता है। चींटी विचार कैसे करना है?
एलेक्स स्क्रीपनीक

@ Alex.Designworks आप ini_set('max_execution_time', 0);अपडेट को ट्रिगर करने से पहले जोड़ सकते हैं ।
kenorb

1

(एक जवाब में बताया गया)

अद्यतन का प्रदर्शन किया गया है या नहीं, इसका पता लगाने के लिए आप "स्कीमा स्कीमा से चुनें"। यदि नहीं, तो चलाने के लिए मना करें (एक त्रुटि संदेश के साथ)।


कृपया अपना उत्तर दें, और उपयोग का उदाहरण देने का प्रयास करें।
Елин Й

इस टिप्पणी को नजरअंदाज करें।
coredumperror

मुझे डर है कि यह काम नहीं करेगा, क्योंकि प्रश्न में कार्यक्षमता दूसरे मॉड्यूल के लिए एक प्लगइन है, और मैं उस मॉड्यूल को उपयोगकर्ताओं को अपने आयातकों के साथ गड़बड़ करने से नहीं रोक सकता।
coredumperror

आप मॉड्यूल के स्कीमा संस्करण की जांच नहीं कर सकते हैं जिसे आप अपडेट के लिए मॉनिटर करना चाहते हैं?
user18099

0

मैं उपरोक्त सुझावों से सहमत हूं - मेरा एकमात्र जोड़ "ट्रिगर एंड एक्ट्स" की जांच करना भी होगा - ऐसा लगता है कि ट्रिगर होने पर आपको एक एक्शन (सूचित उपयोगकर्ता या रन अपडेट) की आवश्यकता होती है (उपयोगकर्ता चेक पेज को चेक करता है, इत्यादि) । उदाहरणों के उदाहरणों के लिए उदाहरण मॉड्यूल देखें, दोनों कार्रवाई और ट्रिगर उदाहरण कोड हैं। :)


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