it-swarm.com.de

Wie dupliziere ich einen Knoten programmgesteuert?

Ich möchte eine Kopie eines von mir erstellten Webformulars mit einer neuen E-Mail-Adresse als Empfänger erstellen.

Kann ich den Knoten nach dem Laden mit node_load einfach mit node_save speichern? Wird dadurch ein neuer Knoten mit neuen Zeitstempeln und IDs erstellt?

Wie kann ich die NID des neuen Knotens abrufen, der erstellt wurde?

11
Arosboro

Deaktivieren Sie einfach die Knoten-ID mit unset($node->nid), und node_save () erstellt einen neuen Knoten.

Der von node_save() ausgeführte Code ist der folgende:

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

Das letzte Argument von drupal_write_record () wird nicht übergeben; Dies bedeutet, dass die Funktion eine vorhandene Datenbankzeile nicht aktualisiert.

Nachdem das Knotenobjekt mit node_save() gespeichert wurde, enthält $node->nid Die Knoten-ID für die neu erstellte Datenbankzeile.

17
kiamlaluno

Ich musste dies als Antwort posten, da das System Ihnen 50 Reputationspunkte einbringt, bevor Sie einen Kommentar abgeben können.

Wie auch immer, als Antwort auf @koivo und seine Antwort. Ich wollte das nur für mich hinzufügen und auch das $node->vid hat den Trick gemacht. Mein Code zum Deaktivieren und Speichern lautet also

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

Versuchen Sie das Replikationsmodul .
Ich musste einfach Dinge auf einer Site klonen und ändern, die ich kürzlich erstellt hatte, und fand, dass dieses Modul gut funktionierte.
Überprüfen Sie die Datei replicate.api.php , um zu sehen, wie einfach die Verwendung ist.

2
2pha

In D7 müssen Sie die Knoten-ID unset($node->nid) und die Revisions-ID unset($node->vid) beide deaktivieren. Ich erstelle ein Formular zum Klonen von Knoten eines bestimmten Typs (Produkts) mit einer bestimmten Begriffsreferenz (durch Ersetzen dieser Begriffs-ID). Hier ist die endgültige Einreichung:

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

Sie können auch die Zeitstempel und $node->uid Erneut speichern.

2
leymannx