प्रोग्राम को नोड नोड डुप्लिकेट कैसे करें?


11

मैं प्राप्तकर्ता के रूप में एक नए ईमेल पते के साथ, एक वेबफार्म की एक प्रति बनाने के लिए देख रहा हूँ।

मैं नोड को नोड_ लोड करने के बाद लोड कर सकता हूं, क्या मैं इसे नोड_सेवे के साथ बचा सकता हूं? क्या यह नए टाइमस्टैम्प और आईडी के साथ एक नया नोड बनाएगा?

जो नया नोड बनाया गया है, उसे मैं कैसे प्राप्त कर सकता हूं?

जवाबों:


17

बस नोड आईडी के साथ परेशान करेंunset($node->nid) , और node_save () एक नया नोड बनाएगा।

node_save()निम्न में से कोड निष्पादित किया गया है:

// Insert a new node.
$node->is_new = empty($node->nid);
// ...
if ($node->is_new) {
  _node_save_revision($node, $user->uid);
  drupal_write_record('node', $node);
  db_query('UPDATE {node_revisions} SET nid = %d WHERE vid = %d', $node->nid, $node->vid);
  $op = 'insert';
}    

Drupal_write_record () का अंतिम तर्क पारित नहीं हुआ है; इसका मतलब यह है कि फ़ंक्शन मौजूदा डेटाबेस पंक्ति को अपडेट नहीं करेगा।

एक बार नोड ऑब्जेक्ट के साथ सहेजा गया है node_save(), $node->nidनव निर्मित डेटाबेस पंक्ति के लिए नोड आईडी शामिल है।


नोड के वेबफ़ॉर्म ऑब्जेक्ट के पास इसकी सरणियों में बहुत अधिक एनआईडी कुंजियां हैं जो पुराने एनआईडी में हैं, मुझे उनके बारे में क्या करना चाहिए?
एरोसबोरो

Drupal बस जाँच करें $node->nid। यदि उन नोड आईडी में से कोई भी लोड नोड का आईडी नहीं है, जिसे सहेजे गए नोड की आईडी के साथ बदलने की आवश्यकता है, तो आप उन नोड आईडी को छोड़ सकते हैं जैसे वे हैं।
kiamlaluno

2
यदि आप पथ मॉड्यूल का उपयोग कर रहे हैं, तो आप यह भी कर सकते हैंunset($node->path);
पैट्रिक जेम्स मैकडॉग

6

मुझे इसे एक उत्तर के रूप में पोस्ट करना था क्योंकि सिस्टम आपको टिप्पणी करने से पहले 50 प्रतिष्ठा अंक देता है।

वैसे भी, @koivo और उसके जवाब में। मैं सिर्फ उसके लिए जोड़ना चाहता $node->vidथा, साथ ही चाल को भी अनसुना कर देता था। तो परेशान करने और बचाने के लिए मेरा कोड है

// Load a node
$node = node_load(1);

// unset version and node id's
unset($node->nid);
unset($node->vid);
unset($node->path);

// Save the copy
node_save($node);

2

D7 में आपको नोड आईडी unset($node->nid)और संशोधन आईडी unset($node->vid)दोनों को अनसेट करना होगा । मैं एक निश्चित प्रकार के संदर्भ (उस शब्द आईडी की जगह) के साथ एक निश्चित प्रकार (उत्पाद) के नोड्स को क्लोन करने के लिए एक फॉर्म का निर्माण करता हूं। यहाँ अंतिम प्रस्तुत है:

function MYMODULE_form_submit($form, &$form_state) {
    $old_tid = $form_state['values']['old_tid'];
    $new_tid = $form_state['values']['new_tid'];

    $query = new EntityFieldQuery();
    $result = $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'product')
    ->fieldCondition('field_some_term_reference', 'tid', $old_tid)
    ->execute();

    foreach ($result['node'] as $product) {
        $node = node_load($product->nid);
        $node->field_some_term_reference[LANGUAGE_NONE][0]['tid'] = $new_tid;
        unset($node->nid);
        unset($node->vid);
        node_save($node);
    }   
}

आप टाइमस्टैम्प को पूर्ववत रखने के लिए विचार कर सकते हैं $node->uid


यदि मूल नोड पर कोई इकाई क्षेत्र है तो यह क्लोन नोड पर इसके मूल्य को बरकरार नहीं रख रहा है और नोड प्रकार को निर्दिष्ट नहीं करने के लिए भी एंटेपरफॉर्मफॉर्मएक्ससेप्शन उठाया गया है। मैं डी 7 में परीक्षण कर रहा हूं। कोई सुराग?
किरकिंग

2

प्रतिकृति मॉड्यूल का प्रयास करें ।
मुझे आसानी से क्लोन करने और एक साइट पर चीजों को बदलने की ज़रूरत थी जो मैंने हाल ही में किया था और पाया कि यह मॉड्यूल अच्छी तरह से काम करता है। कितनी आसानी से उपयोग किया जाता है यह देखने के
लिए replicate.api.php फ़ाइल देखें।

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