php Drupal-कैसे एक सीसीके नोड रीफ्रेंस क्षेत्र प्रोग्राम को अद्यतन करने के लिए?




drupal-6 cck (4)

मैं एक नोड (बी टाइप) बनाने की कोशिश कर रहा हूं और उसे एक प्रकार नोड के सीसीके नोडरेफरेंस फ़ील्ड को node_save () पद्धति का उपयोग करके असाइन करना है।

$node_type_A = node_load($some_nid);
$node_type_A->field_type_B_node_ref[]['nid'] = $node_type_B_nid;

$node_type_A = node_submit($node_type_A);
node_save($node_type_A);

नतीजतन, एक नया बी प्रकार नोड बनाया जाएगा, लेकिन कोई संदर्भ एक प्रकार नोड को निर्दिष्ट नहीं किया जाएगा। किसी भी सहायता की सराहना की जाएगी।


मैं नोड संदर्भों को $node->field_node_reference[0]['items'][0]['nid'] रूप में नोड संदर्भों को संग्रहीत करते हुए दिखाता हूं, $node->field_node_reference[0]['nid'] । क्या आपने यह नकल करने की कोशिश की है?


मैंने अभी अपने स्वयं के मॉड्यूल में से एक को चेक किया है जो वस्तु प्रारूप के लिए कुछ समान करता है, और $node_type_A->field_type_B_node_ref[]['nid'] सही होना चाहिए।

जांचने के लिए एक बात यह है कि जब आप नोड लोड करते हैं, तो सीसीके नोड संदर्भ एरे को खाली मान के साथ पूर्व-पॉप्यूलेट कर सकता है। यदि आपने फ़ील्ड को केवल एक मान की अनुमति देने के लिए कॉन्फ़िगर किया है, तो सरणी field_type_B_node_ref[] ऑपरेटर ( field_type_B_node_ref[] ) का प्रयोग करके यह एक दूसरी प्रविष्टि बना देगा जो कि मौजूदा मान को ओवरराइट करने के बजाय ( field_type_B_node_ref[1] ) को अनदेखा कर दिया जाएगा ( field_type_B_node_ref[0] ) यदि संभव हो तो सरणी कुंजी को स्पष्ट रूप से निर्दिष्ट करने का प्रयास करें


GApple सही है, प्रारूप सही है, लेकिन कुछ चीजें हैं जो आप के बारे में देखभाल करना चाहते हैं

डेल्टा मूल्य
पहले आपको $node_type_A से जुड़ी नवीनतम नोड संदर्भ के डेल्टा मूल्य की जरूरत है, डेल्टा वास्तव में एक आंशिक सूचकांक है, जब $node_type_A vid क्षेत्र के साथ जोड़ा जाता है, वे डेटाबेस में नोड संदर्भ तालिका का सूचक बन जाते हैं। दूसरे शब्दों में, $node_type_B लिए इसकी गिनती $node_type_B में संदर्भित है, ठीक है?

GApple फिर से सही है, आपको बिल्कुल यह कहना है कि कहां नया संदर्भ जोड़ना है। जब आपको वह डेल्टा मूल्य मिलता है तो आप कह सकते हैं कि कहां से नया डेल्टा + 1 जोड़ना होगा? यह रहा:

function get_current_delta($node_vid){
    return db_result(db_query("SELECT delta FROM {content_field_type_A_node_ref}
                               WHERE vid = '%d'
                               ORDER BY delta DESC
                               LIMIT 1", $node_vid));
}

नया संदर्भ जोड़ना
हमें डेल्टा मिला! इसलिए हम $node_type_B नोड को हमारी $node_type_A नोड में संलग्न कर सकते हैं:

// Loading type_A node.
$node_type_A = node_load($some_nid);

// Getting current delta value.
$current_delta = get_current_delta($node_type_A->vid);

// "Appending" a node reference based on delta. 
$node_type_A->field_type_B_node_ref += array($current_delta + 1 => array('nid' => $node_type_B_nid));

नवीनीकृत नोड को सुरक्षित करना
वैकल्पिक रूप से नोड ऑब्जेक्ट में कुछ आवश्यक फ़ील्ड पॉप्युलेट करने के लिए node_submit() को कॉल करें और इसे node_save() का उपयोग करके node_save() । आखिरकार, आपको अपने सीसीके क्षेत्रों के साथ नोड को पूरी तरह से बचाया जाने के लिए content_insert() को कॉल करना होगा:

// Resaving the updated node.
$node_type_A = node_submit($node_type_A);
node_save($node_type_A);
content_insert($node_type_A);

सामग्री कैश फ़्लशिंग
शायद सबसे महत्वपूर्ण हिस्सा, यह कुछ दिनों के लिए मुझे 'हत्या कर रहा था सीसीके के पास cache_content नामक डेटाबेस में एक कैश तालिका है, जिसे अद्यतन नोड को cache_content (इसकी संरचना पर एक नज़र डालें) , आप देखेंगे कि $node_type_A थीम आउटपुट में कुछ भी नहीं $node_type_A भले ही तालिकाओं को अपडेट किया गया हो हमें उस सामग्री कैश तालिका से एक रिकॉर्ड को निकालना होगा, इससे ड्रुपल को डेटा के नवीनतम स्नैपशॉट दिखाने के लिए मजबूर किया जाएगा। आप एक फ़ंक्शन के रूप में निम्नलिखित को परिभाषित कर सकते हैं:

db_query("DELETE FROM {cache_content} WHERE cid = '%s'", 'content:' . $node_type_A->nid . ':' . $node_type_A->vid);

आशा करता हूँ की ये काम करेगा ;)


महान पोस्ट, लेकिन एक सुधार: मैन्युअल रूप से डीबी क्वेरी से कैश प्रविष्टियों को फ्लश नहीं करें इस घटना में कोई मेमकैश या किसी अन्य बाहरी कैश का प्रयोग कर रहा है जो इसे विफल करने जा रहा है।

cache_clear_all () समाशोधन के लिए आपका मित्र है।

सीसीके मॉड्यूल से सीधे निर्देशित कोड:

cache_clear_all('content:'. $node_type_A->nid .':'. $node_type_A->vid, content_cache_tablename());