Bir düğümü programlı olarak nasıl çoğaltırım?


11

Alıcı olarak yeni bir e-posta adresi ile yaptığım bir web formunun bir kopyasını oluşturmak istiyorum.

Düğümü node_load ile yükledikten sonra, node_save ile kaydedebilir miyim? Bu yeni zaman damgaları ve kimlikleri olan yeni bir düğüm yaratacak mı?

Oluşturulan yeni düğümün boşluğunu nasıl alabilirim?

Yanıtlar:


17

Düğüm kimliğinin ayarını kaldırmanız yeterlidirunset($node->nid) ve node_save () yeni bir düğüm oluşturur.

Yürütülen kod node_save()şudur:

// 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 () işlevinin son argümanı iletilmez; Bu, işlevin var olan bir veritabanı satırını güncellemeyeceği anlamına gelir.

Düğüm nesnesi ile kaydedildikten sonra node_save(), $node->nidyeni oluşturulan veritabanı satırı için düğüm kimliğini içerir.


Düğümün webform nesnesinin dizilerinde eski nid'i içeren çok sayıda nid anahtarı var, onlar hakkında ne yapmalıyım?
Arosboro

Drupal sadece kontrol et $node->nid. Bu düğüm kimliklerinin hiçbiri, kayıtlı düğümün kimliği ile değiştirilmesi gereken yüklü düğümün kimliği değilse, bu düğüm kimliklerini oldukları gibi bırakabilirsiniz.
kiamlaluno

2
Yol modülünü de kullanmak isteyebilirsinizunset($node->path);
Patrick James McDougle

6

Bunu bir cevap olarak göndermek zorunda kaldım, çünkü sistem yorum yapmadan önce 50 itibar puanına sahip olmanızı sağlar.

Her neyse, @koivo ve cevabına yanıt olarak. Sadece benim için eklemek istedim, aynı zamanda $node->vidhile yaptı. Ayarlamayı kaldırma ve kaydetme kodum

// 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'de düğüm kimliğini unset($node->nid)ve revizyon kimliğini unset($node->vid)her ikisinin de ayarını kaldırmanız gerekir . Belirli bir terim referansı olan (bu terim kimliğini değiştirerek) belirli bir türden (ürün) düğümleri klonlamak için bir form oluşturur. İşte son başvuru:

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

Zaman damgalarını ve yeniden kaydetmeyi de düşünebilirsiniz $node->uid.


Orijinal düğümde herhangi bir varlık başvurusu alanı varsa, klonlanmış düğümde değerini korumaz ve ayrıca düğüm türünü belirtmemek için varlık biçiminde istisna oluşturulur. D7'de test yapıyorum. bir ipucu?
kiranking

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.