हुक_स्थापना () का उपयोग करके मैं डेटाबेस तालिका में डिफ़ॉल्ट मान कैसे जोड़ूं?


9

मैं कुछ तालिकाओं के अपने स्कीमा के साथ एक कस्टम मॉड्यूल बना रहा हूं। मॉड्यूल को काम करने के लिए (डिफ़ॉल्ट स्थान, चयन विकल्प, आदि) के लिए इन तालिकाओं को पूर्व-आबादी में कुछ मान रखने की आवश्यकता होती है।

हुक_ स्थापना के दौरान इन तालिकाओं में डिफ़ॉल्ट मान सम्मिलित करने का सबसे अच्छा तरीका क्या है?

चूंकि drupal_write_record उपलब्ध नहीं है, मैं db_query का उपयोग कर सकता हूं, लेकिन मैं केवल यह सुनिश्चित करना चाहता हूं कि ऐसा करने से मैं कोई कार्डिनल नियम नहीं तोड़ रहा हूं।

जवाबों:


7

बेहतर तरीका यह है कि इसे hook_enable () के अंदर किया जाए ; जिस समय हुक लगाया जाता है, मॉड्यूल पहले से ही स्थापित होता है, और इसके डेटाबेस का स्कीमा Drupal, और के लिए उपलब्ध होता है drupal_write_record()। चूंकि हुक को एक मॉड्यूल सक्षम किया जाता है, और हर बार जब मॉड्यूल स्थापित किया जाता है, तो हुक लागू होता है, हुक कार्यान्वयन की जांच करनी चाहिए कि क्या यह उन डेटाबेस पंक्तियों को पहले से ही नहीं जोड़ा था (उदाहरण के लिए, यह एक ब्यूपियन मान युक्त एक ड्रुपल चर का उपयोग करना चाहिए) ।

hook_enable()एक समान उद्देश्य के लिए उपयोग किए जाने वाले मॉड्यूल के उदाहरण के रूप में , आप forum_enable () , या php_enable () (जो "PHP कोड" इनपुट प्रारूप जोड़ता है ) की जांच कर सकते हैं।

function php_enable() {
  $format_exists = (bool) db_query_range('SELECT 1 FROM {filter_format} WHERE name = :name', 0, 1, array(':name' => 'PHP code'))->fetchField();
  // Add a PHP code text format, if it does not exist. Do this only for the
  // first install (or if the format has been manually deleted) as there is no
  // reliable method to identify the format in an uninstall hook or in
  // subsequent clean installs.
  if (!$format_exists) {
    $php_format = array(
      'format' => 'php_code', 
      'name' => 'PHP code',
      // 'Plain text' format is installed with a weight of 10 by default. Use a
      // higher weight here to ensure that this format will not be the default
      // format for anyone. 
      'weight' => 11, 
      'filters' => array(
        // Enable the PHP evaluator filter.
        'php_code' => array(
          'weight' => 0, 
          'status' => 1,
        ),
      ),
    );
    $php_format = (object) $php_format;
    filter_format_save($php_format);

    drupal_set_message(t('A <a href="@php-code">PHP code</a> text format has been created.', array('@php-code' => url('admin/config/content/formats/' . $php_format->format))));
  }
}

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


अगर मैंने इसे हुक_एनेबल () में किया है, तो इसका मतलब है कि डिफ़ॉल्ट मान हर बार रीसेट किया जाएगा कि मॉड्यूल सक्षम और अक्षम है। मुझे लगता है कि यह काफी सामान्य है, क्योंकि पूरी तरह से अन-इंस्टॉल करने और फिर से इंस्टॉल करने के विपरीत (जिस बिंदु पर यह उम्मीद की जाती है कि डेटाबेस रीसेट हो जाता है)।
संतरे

1
यही कारण है कि मैंने लिखा, "हुक कार्यान्वयन की जांच होनी चाहिए कि क्या यह उन डेटाबेस पंक्तियों को पहले से ही नहीं जोड़ रहा है।" इसका मतलब यह है कि यह जांचना चाहिए कि क्या मान पहले से ही डेटाबेस तालिका में हैं, या यह जाँचने के लिए कि यह पहले से ही काम कर रहा है, ड्रुपल चर का उपयोग करें। डेटाबेस तालिका की जाँच करना होगा यदि उन मूल्यों को आवश्यक रूप से डेटाबेस में होना चाहिए; उदाहरण के लिए, यदि मॉड्यूल से मान आवश्यक हैं, तो यह मामला है, और उपयोगकर्ताओं को डिफ़ॉल्ट मान निकालने की अनुमति नहीं है।
kiamlaluno

स्पष्टीकरण के लिए धन्यवाद। क्या मेरी स्वयं की कस्टम तालिका बनाम इन चर को संग्रहीत करने में कोई अंतर है? यह कस्टम चयन बॉक्स के लिए मूल्यों की एक सरणी मात्र है।
oranges13

ड्रुपल बूटस्ट्रैप्स, और एक वैश्विक चर में सहेजे जाने पर उपयोग किए जाने वाले सभी मान variable_set(), जो नष्ट नहीं होते हैं variable_del(), वे मेमोरी में लोड होते हैं; इसका मतलब यह है कि वे स्मृति में हैं जो भी मॉड्यूल उन मूल्यों का उपयोग कर रहा है, या नहीं। कस्टम डेटाबेस तालिका का उपयोग करके, आप यह सुनिश्चित कर सकते हैं कि उन मूल्यों को केवल तब लोड किया जाता है जब मॉड्यूल को वास्तव में इसकी आवश्यकता होती है। variable_set()यदि ड्रुपल चर में एक सरणी है जिसमें आप एक नया सरणी इंडेक्स जोड़ते रहते हैं तो आपको इसका उपयोग नहीं करना चाहिए , उदाहरण के लिए।
kiamlaluno

कोड (D7) को देखते हुए। मुझे हुक_ इंस्टॉलेशन और हुक_नेबल के आह्वान के बीच कोड की केवल 2 पंक्तियाँ दिखाई देती हैं: स्थानीय चर का अद्यतन और प्रहरी का आह्वान। तो, एक वास्तविक स्थापित के दौरान, इन 2 हुक के बीच कोई अंतर नहीं है कि क्या उपलब्ध है और पंजीकृत है और क्या नहीं। एकमात्र अंतर यह है कि क्या यह पहली बार स्थापित है या केवल मॉड्यूल को फिर से सक्षम करना है।
फित्ज़रविन

4

मैं hook_install () में db_query/ db_insert(D6 / D7) के साथ जाऊंगा।

यह बुरा अभ्यास नहीं माना जाता है (और कोई भी कभी भी आपको उपयोग करने के लिए मजबूर नहीं करता है drupal_write_record())।

मॉड्यूल को अक्षम और पुन: सक्षम करने के लिए लोगों के लिए यह असामान्य नहीं है, और उस स्थिति में आपका कोड hook_enable()हर बार आग लगाएगा। जो अच्छा नहीं है।

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