it-swarm.it

Come duplicare programmaticamente un nodo?

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?

11
Arosboro

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.

Una volta che l'oggetto nodo è stato salvato con node_save(), $node->nid Contiene l'ID nodo per la riga del database appena creata.

17
kiamlaluno

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 azzerando il $node->vid ha fatto il 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);
6
Jorge Calderon

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.
Dai un'occhiata al file replicate.api.php per vedere quanto è facile da usare.

2
2pha

In D7 è necessario disattivare entrambi l'id del nodo unset($node->nid) e l'id di 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 i timestamp e $node->uid anche.

2
leymannx