it-swarm.asia

كيفية تكرار عقدة برمجيا؟

إنني أتطلع إلى إنشاء نسخة من نموذج ويب قمت بإنشائه ، بعنوان بريد إلكتروني جديد كمستلم.

بعد تحميل العقدة باستخدام node_load ، هل يمكنني حفظها باستخدام node_save؟ هل سيؤدي ذلك إلى إنشاء عقدة جديدة مع طوابع زمنية وهويات جديدة؟

كيف يمكنني الحصول على nid للعقدة الجديدة التي تم إنشاؤها؟

11
Arosboro

فقط قم بإلغاء تعيين معرف العقدة مع 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 على معرف العقدة لصف قاعدة البيانات الذي تم إنشاؤه حديثًا.

17
kiamlaluno

اضطررت لنشر هذا كإجابة لأن النظام يجعلك تمتلك 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);
6
Jorge Calderon

حاول وحدة تكرار .
كنت بحاجة إلى استنساخ الأشياء وتغييرها بسهولة على موقع قمت به مؤخرًا ووجدت أن هذه الوحدة تعمل بشكل جيد.
تحقق من ملف replicate.api.php لترى مدى سهولة استخدامه.

2
2pha

في 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);
    }   
}

قد تفكر في حفظ الطوابع الزمنية und $node->uid كذلك.

2
leymannx