नए टेबल को हुक_अपडेट_ () में बनाया जाना चाहिए?


11

जब आप एक नई तालिका बनाते हैं hook_schema(), तो क्या उस तालिका को भी जोड़ा जाना चाहिए hook_update_N()? या वहाँ कुछ चाल है, या कुछ मुझे याद है, databae- अद्यतन स्वचालित रूप से तालिकाओं को जोड़ने के लिए है?

Hook_update_N () के प्रलेखन में नई तालिकाओं को शुरू करने के बारे में कुछ भी नहीं बताया गया है, जबकि प्रलेखन काhook_schema() कहना है:

इस हुक द्वारा घोषित तालिकाएँ स्वचालित रूप से बनाई जाएंगी जब मॉड्यूल को पहली बार सक्षम किया जाता है , और मॉड्यूल की स्थापना रद्द होने पर हटा दिया जाता है।

(हाईलाइट मेरी है)

और यदि हां, तो दोनों हुक_update_N () और hook_schema () में नई तालिका के लिए स्कीमा परिभाषाओं की नकल करने से कैसे बचें। केवल स्कीमा का जिक्र इस प्रकार है:

 function hook_update_N(&$sandbox) {
   $schema = hook_schema();
   $name = "foo";
   $table = $schema["foo"];
   db_create_table($name, $table);
 }

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

आप इस के साथ कैसे पेश आएंगे?


प्रलेखन के लिए drupal.org/node/150215 का संदर्भ लें । इसलिए मूल रूप से एक मॉड्यूल स्थापित होने के बाद एक नई तालिका जोड़ने के लिए हुक_अपडेट_ के माध्यम से है, लेकिन आप नए उपयोगकर्ताओं या ताज़ा इंस्टॉल के लिए भी हुक की परिभाषा को हुक_स्क्रीन में जोड़ते हैं। यदि आप वर्तमान टेबल को हुक_अपडेट_ के माध्यम से अद्यतन करने के लिए कोई तालिका परिवर्तन करते हैं तो इसे योग करें, लेकिन आप हुक_केमे में परिवर्तन को भी मर्ज करते हैं।
junedkazi

1
इसलिए DRY का उल्लंघन करने से बचने का कोई तरीका नहीं है, ऐसा लगता है। अफ़सोस की बात है।
Berkes

ऐसा कुछ भी नहीं जिससे मैं वाकिफ हूं। लेकिन आप एक छोटा फ़ंक्शन लिख सकते हैं जिसमें स्कीमा परिभाषा है और उस परिभाषा को दोनों फ़ंक्शन में कॉल करें।
junedkazi

@berkes एक और फ़ंक्शन को परिभाषित कर सकता है जो अतिरिक्त स्कीमा लौटाता है और इसे अपडेट और इंस्टॉल हुक दोनों में संदर्भित करता है।
191

जवाबों:


15

तो बस drupal.org से एक कॉपी पेस्ट। आपको स्कीमा परिभाषा को हुक_केमे में जोड़ने की भी आवश्यकता है।

/**
 * Create new database table {mytable2}.
 */
function mymodule_update_7101() {
  $schema['mytable2'] = array(
     // table definition array goes here
  );
  db_create_table('mytable2', $schema['mytable2']);
}

क्या आपका मतलब है कि हुक_सफेमा () से हुक_अपडेट_ () में तालिका-परिभाषा को कॉपी करने का कोई अन्य तरीका नहीं है। दूसरे शब्दों में: कि DRY का उल्लंघन करने से बचने का कोई तरीका नहीं है?
Berkes

3
@berkes स्थान पर ... वहाँ एक बहुत अच्छा स्पष्टीकरण क्यों है है यहाँ मामले में आप पहले से ही यह नहीं देखा है
क्लाइव

@Clive यह एक भयानक उदाहरण है। इसे पहले कभी नहीं देखा। +1
junedkazi

); @junedkazi वहाँ लिंक आप अपनी टिप्पणी में उपलब्ध कराई गई पर यह करने के लिए एक लिंक भी है
क्लाइव

-2

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


/**
 * Implements hook_install().
 */
function mymodule_install() {
  // Change the update number accordingly for more updates.
  for ($i = 7101; $i < 7102; $i++) {
    $update_func = 'mymodule_update_' . $i;
    if (function_exists($update_func)) {
      $update_func();
    }
  }
}


निर्देशानुसार API का उपयोग करना बेहतर Drupal अभ्यास है। सीधे हुक_केमे () और हुक_अपडेट_ () का उपयोग करें। एक चीज जो मैं करता हूं वह है कि मेरे मॉड्यूल के हुक_केमे कार्यान्वयन को हुक_अपडेट_ () में कॉल करें, और फिर संबंधित डीबी_ * फ़ंक्शन चलाएं।
mradcliffe

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

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