किसी प्रोग्राम को प्रोग्रामेटिक रूप से अपडेट करना, हुक_नोड_अपडेट


13

वर्तमान में जब भी नोड बनाया या अपडेट किया जाता है, तो किसी क्षेत्र को अपडेट करने की कोशिश करना। हालाँकि मान नोड के भीतर पॉप्युलेट नहीं हो रहा है, क्या मुझे इस विशेष हुक के साथ नोड ऑब्जेक्ट तक पहुंच है? मुझे क्या याद आ रही है?

  function vbtoken_node_update($node) {


      entity_get_controller('node')->resetCache(array($node->nid));


      $types = node_type_get_types(); //What are the current Node Content Types?
      $yes = ($types['volunteer_project']->type);

      if($node->type === $yes){


        $hash = md5($node->title . $node->nid . $node->nid);
        $hashed = substr($hash, 0, 6);
        $node = node_load($node->nid);
        $node->tcode[$node->language][0]['value'] = $hashed;
        node_save($node);

        watchdog('vbtoken', 'Added a new Token code to %nid', array('%nid' => $node->nid));

        }
        else 
        {
          dpm('not working dude');
        }

    }

जवाबों:


16

इकाई मेटाडाटा रैपर

निकाय एपीआई कुछ रैपर कक्षाएं प्रदान करता है जिनका उपयोग आप संस्थाओं के साथ आसानी से निपटने और प्रदान की गई इकाई संपत्ति सूचना मॉड्यूल का लाभ उठाने के लिए कर सकते हैं। रैपर की मदद से आप संपत्ति की जानकारी तक पहुंच सकते हैं, ज्ञात गुणों पर लूप कर सकते हैं, या केवल वर्णित डेटा मान प्राप्त कर सकते हैं / सेट कर सकते हैं, आदि।

ये कुछ सरल उपयोग उदाहरण हैं जो README में पाए जाते हैं:

इस जानकारी (मेटाडेटा) के उपयोग के लिए मॉड्यूल कुछ रैपर कक्षाएं प्रदान करता है जो मूल्यों को प्राप्त करने और स्थापित करने में आसानी करते हैं। रैपर इकाई गुणों के रैपर को प्राप्त करने के लिए जंजीर के उपयोग का समर्थन करता है, उदाहरण के लिए एक नोड लेखक का मेल पता जिसे वह उपयोग कर सकता है:

$wrapper = entity_metadata_wrapper('node', $node);
$wrapper->author->mail->value();

उपयोगकर्ता के मेल पते को अपडेट करने के लिए कोई भी उपयोग कर सकता है

$wrapper->author->mail->set('sepp@example.com');

या

$wrapper->author->mail = 'sepp@example.com';

रैपर हमेशा संपत्ति की जानकारी में वर्णित डेटा लौटाते हैं, जिसे सीधे यूनिट_गेट_प्रोपर_इनफो () या रैपर के माध्यम से प्राप्त किया जा सकता है:

$mail_info = $wrapper->author->mail->info();

आदेश में उत्पादन के लिए एक पाठ मूल्य का उपयोग करने के लिए मजबूर कर सकता है, जैसे

$wrapper->title->value(array('sanitize' => TRUE));

सैनिटाइज्ड नोड टाइटल पाने के लिए। जब कोई प्रॉपर्टी पहले ही डिफॉल्ट रूप से सैनिटाइज्ड हो जाती है, तो नोड बॉडी की तरह, एक संभवत: नहीं-सैनिटाइज्ड डेटा प्राप्त करना चाहता है क्योंकि यह अन्य उपयोग के मामलों के लिए एक ब्राउज़र में दिखाई देगा। ऐसा करने के लिए कोई भी 'डीकोड' विकल्प को सक्षम कर सकता है, जो किसी भी स्वच्छता डेटा के लिए सुनिश्चित करता है कि टैग छीन लिए गए हैं और संपत्ति लौटाने से पहले एचटीएमएल इकाइयां डीकोड की गई हैं:

$wrapper->body->value->value(array('decode' => TRUE));

इस तरह एक हमेशा डेटा प्राप्त होता है जैसा कि उपयोगकर्ता को दिखाया गया है। हालाँकि यदि आप वास्तव में कच्चे, असंसाधित मूल्य प्राप्त करना चाहते हैं, यहां तक ​​कि स्वच्छता संबंधी पाठ्य डेटा के लिए भी, तो आप ऐसा कर सकते हैं:

$wrapper->body->value->raw();

और ज्यादा उदाहरण:

$wrapper->body->set(array('value' => "content"));
$wrapper->field_text[0] = 'the text';
$wrapper->field_text[0]->set(array('value' => "content"));
$wrapper->field_text2->summary = 'the summary';
$wrapper->field_text2->value = 'the text';

$wrapper->save();
$wrapper->delete();

अधिक डॉक्स : http://drupal.org/node/1021556


बहुत बहुत धन्यवाद। आपके उत्तर ने मुझे कुछ दिशा देने में मदद की कि मुझे क्या करना था। :) सामुदायिक चट्टानों !! \ m /
SGhosh

यह हुक_नोड_अपडेट पर काम करेगा लेकिन हुक_नोड_इन्टर () पर नहीं । आपको mysql से एक डुप्लिकेट प्राथमिक कुंजी त्रुटि मिलेगी, क्योंकि नोड मॉड्यूल और आपका कस्टम कोड दोनों एक ही नोड को दो बार (एक ही नोड आईडी का उपयोग करके) सम्मिलित करने की कोशिश कर रहे होंगे।
leon.nk

14

मेरे लिए काम field_attach_update('node', $node)करने के अंत में कॉलिंग hook_node_update। मुझे लगता है कि काम field_attach_insert('node', $node)के अंत में hook_node_insertभी होगा। तो, एक नमूना समारोह इस तरह दिखेगा:

function mymodule_node_update($node) {
  $new_value = // ...do some stuff to compute a new value for the field.
  $node->field_my_field[LANGUAGE_NONE][0]['value'] = $new_value;
  field_attach_update('node', $node);
}

कॉल करने node_load node_saveया कुछ भी वापस करने की कोई आवश्यकता नहीं है।

मुझे लगता है कि इसका कारण यह है node_save, जिसमें से hook_node_updateऔर hook_node_insertकहा जाता है, एक लेनदेन में सभी डेटाबेस प्रश्नों को लपेटता है। (की पहली पंक्ति नोट node_save: $transaction = db_transaction()।) इन प्रश्नों तक कहा जाता है नहीं कर रहे हैं node_saveखत्म। node_saveलेन-देन में जोड़ने वाली अंतिम क्वेरी से कहा जाता है field_attach_update, जो $ नोड ऑब्जेक्ट का उपयोग करता है जैसा कि पहले hook_node_update कहा जाता है। इसलिए आपको field_attach_updateफिर से कॉल करके किसी अन्य क्वेरी को पंक्तिबद्ध करने की आवश्यकता है । कम से कम, कि मेरी समझ क्या चल रहा है।

यदि आपको नोड के गैर-फ़ील्ड विशेषताओं (जैसे, $node->log) को बदलने में समस्या हो रही है , तो कॉल करने का _node_save_revision($node, $user->uid, 'vid');भी प्रयास करें । यह एक नया संशोधन नहीं बनाएगा।


2

यह है कि आप किसी नोड पर मान कैसे बदलते हैं:

$node = node_load($nodeID);
$node->field_fieldname['und'][0]['value'] = $val;
node_save($node);

4
undवास्तव में यहाँ उचित नहीं है, ओ पी पहले से ही है कि वे उपयोग कर रहे हैं कोड में कहा है $node->languageभाषा कोड के लिए
क्लाइव

यह सुपर सहायक धन्यवाद क्लाइव और लांस है, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि जब भी नोड बचाया जाता है, तो फ़ील्ड मान सहेजा जाता है, इसलिए हुक_नोड_उपडेट का मेरा उपयोग। क्या इस हुक में $ नोड वापस करना संभव होगा या क्या मुझे पूरी तरह से एक नोड_लोड करना होगा? मैंने वास्तव में सोचा था कि मुझे नोड ऑब्जेक्ट सीधे हुक_नोड_अपडेट के माध्यम से पारित हो गया था ....
सामान्य ज्ञान

ठीक है, इसलिए मैंने आपकी सिफारिश के अनुसार कोड अपडेट किया है - यह मूल निकाय में है। समस्या: अंतहीन लूप जिसमें पेज लोड नहीं होता है और mysql और अपाचे दोनों सीपीयू पर 85% लोड से ऊपर की ओर हिट करना शुरू करते हैं। निश्चित रूप से यहां कुछ लूपिंग चल रही है। कोई अन्य सुझाव?
3

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

समस्या को सहेजने से पहले नोड को सहेजने से प्राप्त किया गया था जिसके परिणामस्वरूप एक पुनरावर्ती लूप था। खराब हुक पसंद और खराब निर्माण
सामान्य ज्ञान

1

ऊपर लांस के समाधान में सुधार, पूरे नोड की बचत से बचने पर जब केवल कुछ फ़ील्ड मान संशोधित किए जाते हैं:

$node = node_load($nodeID);
// for each field whose value remains unchanged
unset($node->field_<field-name>); 
// for each field whose value changes
$node->field_<field-name>[LANGUAGE_NONE][0]['value'] = <new-value>;
field_attach_update('node', $node);
entity_get_controller('node')->resetCache(array($node->nid));

यह भी साइड इफेक्ट से बचने के लिए उपयोगी हो सकता है node_save()

स्रोत: नोड के क्षेत्रों को बचाने के लिए नोड को बचाने के बिना ही

https://www.urbaninsight.com/2011/10/24/saving-nodes-fields-without-saving-node-itself

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