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.