Come duplicare programmaticamente un nodo?


11

Sto cercando di creare una copia di un modulo web che ho realizzato, con un nuovo indirizzo e-mail come destinatario.

Dopo aver caricato il nodo con node_load, posso semplicemente salvarlo con node_save? Ciò creerà un nuovo nodo con nuovi timestamp e ID?

Come posso ottenere il nid del nuovo nodo che è stato creato?

Risposte:


17

Basta disinserire l'ID nodo con unset($node->nid)e node_save () creerà un nuovo nodo.

Il codice eseguito da node_save()è il seguente:

// 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';
}    

L'ultimo argomento di drupal_write_record () non viene passato; questo significa che la funzione non aggiorna una riga del database esistente.

Dopo aver salvato l'oggetto nodo con node_save(), $node->nidcontiene l'ID nodo per la riga del database appena creata.


L'oggetto webform del nodo ha molte chiavi nid nei suoi array che contengono il vecchio nid, cosa devo fare al riguardo?
Arosboro,

Drupal basta controllare $node->nid. Se nessuno di questi ID nodo è l'ID del nodo caricato, che deve essere modificato con l'ID del nodo salvato, è possibile lasciare tali ID nodo così come sono.
kiamlaluno

2
Se stai usando il modulo percorso potresti anche volerunset($node->path);
Patrick James McDougle

6

Ho dovuto pubblicare questo come risposta perché il sistema ti fa avere 50 punti reputazione prima che tu possa commentare.

Comunque, in risposta a @koivo e alla sua risposta. Volevo solo aggiungerlo per me, anche sconvolgendo $node->vidil trucco. Quindi il mio codice per disinserire e salvare è

// 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

In D7 devi disinserire sia l'id nodo unset($node->nid)che l'id revisione unset($node->vid). Costruisco un modulo per clonare nodi di un certo tipo (prodotto) avente un determinato riferimento di riferimento (con la sostituzione di quel termine id). Ecco l'invio finale:

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

Potresti considerare di salvare nuovamente anche i timestamp $node->uid.


Se è presente un campo di riferimento entità sul nodo originale, non sta conservando il suo valore sul nodo clonato e viene sollevata anche l'eccezione di entità entità per non specificare il tipo di nodo. Sto testando in D7. qualche indizio?
Kirking

2

Prova il modulo di replica .
Avevo bisogno di clonare e modificare facilmente le cose su un sito che ho fatto di recente e ho scoperto che questo modulo funzionava bene.
Controlla il file replicate.api.php per vedere quanto è facile da usare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.