मैं बाद के कार्यों के लिए किस हुक का उपयोग कर सकता हूं?


16

मैंने इसी प्रश्न के साथ कई पोस्ट पाए हैं, लेकिन उत्तर हमेशा किसी अन्य विषय पर आते हैं या वे मेरी आवश्यकताओं के लिए काम नहीं करते हैं।

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

मेरी योजना अपनी कार्यक्षमता को अपने तरीके से अलग करने और दोनों हुक को लागू करने की है, लेकिन मैं ड्रुपल के साथ चीजों को ठीक से सीखने की कोशिश कर रहा हूं और इसलिए मैं सोच रहा हूं कि क्या कोई हुक है जो वास्तव में मेरी आवश्यकताओं के साथ फिट बैठता है।

क्या एक हुक है जिसे हर बार एक नोड को सहेजा जाता है और कहा जाता है कि बचत पूरी होने के बाद?


3
आप के संयोजन का उपयोग कर सकते हैं hook_node_insertऔर hook_node_update(हर बार एक नोड बचाया जा रहा है)।
अजीत

हां, मैंने ऊपर पोस्ट में वर्णित किया है।
केनी वाइलैंड

@KennyWyland आपने उल्लेख किया है hook_node_submitलेकिन नहीं hook_node_update?
डेविड थॉमस

आपको नोड nid और hook_node_insertसाथ ही में मिलेगा hook_node_update
सुमित मदन

2
hook_node_insert()और hook_node_update()इसके लिए सही हुक हैं, hook_node_submit()नोड को सहेजने से पहले फॉर्म जमा करने की प्रक्रिया के दौरान कहा जाता है। मत भूलना आप स्पष्ट कैश करने के लिए किसी भी समय की जरूरत है आप जोड़ना / एक हुक को दूर
क्लाइव

जवाबों:


5

प्रश्न पर टिप्पणियों को देखते हुए, ऐसा लगता है कि स्पष्ट समाधान हुक का उपयोग करना है hook_node_insert()और hook_node_update()

मैंने वास्तव में बस कुछ ऐसा ही किया जैसा कि उत्तर में वर्णित है: मैंने एक फ़ंक्शन लिखा था जो वह करता है जो मैं चाहता हूं कि हर बार एक नोड बनाया / अपडेट किया जाए और फिर उन प्रत्येक हुक से कॉल करें। यह ठीक काम करता है।


यह अच्छा है! आप इससे भी कर सकते हैं hook_form_alter()drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx उस विधि में नकारात्मक पक्ष यह है कि इसे केवल तभी कहा जाएगा जब कोई नोड एक विशिष्ट फॉर्म के माध्यम से डाला / अपडेट किया गया हो। मेरे मामले में, मुझे नोड्स के सभी परिवर्धन और संशोधनों को पकड़ने की आवश्यकता थी।
डोनट

12

ऐसा करने का सही तरीका ड्रुपल के डीबी लेनदेन का सम्मान करना है। यदि आप हुक_नोड_इन्टर में कोई डेटाबेस क्रिया करना चाहते हैं तो आपको यह विचार करना चाहिए कि नोड वास्तव में अभी तक नहीं बचा है। जिसका अर्थ है कि अगर यह विफल हो जाता है और वापस लुढ़क जाता है तो आप अपने डेटाबेस में अनाथ डेटा के साथ समाप्त हो जाते हैं। इसलिए Drupal डेटाबेस API का उपयोग किया जाना चाहिए न कि सीधे क्वेरी निष्पादन।

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

function your_module_node_update($node){
  if($node->type == 'your_node'){
    register_shutdown_function('_your_module_post_insert',$node->nid);
  }
}

function _your_module_post_insert($nid) {
  $node = node_load($nid);
  if ($node) {
      node_save($node);
  }
} 

अद्यतन: आप यहां एक आसान विकल्प भी पा सकते हैं /programming//a/24035797/1726778


1
अच्छा विचार। हालांकि इसका उपयोग करना बेहतर है drupal_register_shutdown_function()। लेकिन इस बात का ध्यान रखें कि दोनों को php-fpm पर्यावरण में समस्याएँ लगती हैं, drupal.stackexchange.com/q/102603/10667
Shevchuk

अगर एक नोड एक कार्बनिक समूह के रूप में कार्य कर रहा था, तो मुझे यह जांचने में परेशानी हो रही थी og_is_group। मुझे लगता है कि मुझे इस कारण से नकारात्मक बातें मिल रही थीं।
हिमलिंग

5

एक नया ड्रूपल मॉड्यूल है, हुक पोस्ट एक्शन , जो पोस्ट सेव हुक्स को जोड़ता है। चलो यह देखने की कोशिश करें कि क्या यह काम करता है।

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