Zugegeben, Beispielcode zu finden, der tut, was ich im Folgenden beschreibe war nicht sonderlich schwierig. Die Lösung war aber so erleuchtend, dass ich jetzt einfach diesen Artikel darüber schreiben muss.
Folgendes Problem
Ich möchte eine Node beliebigen Typs speichern. In meinem Fall war es eine Kontainer-Node, die eigentlich nur Referenzen (Node Reference ist eine Untermodul von CCK, welches entsprechende Felder zur Verfügung stellt) auf 4 andere Nodes speichert. Den prinzipiellen Ablauf hatte ich vorher mit Formulardaten bereits kennen gelernt und läuft für Formulardaten wie folgt:
- Man wandle das Array mit den Daten aus dem Formular in ein stdClass-Objekt
- Man übergebe dieses Objekt an node_save()
Aus dem Formular-Array kommt jetzt außer den eigentlichen Daten des jeweiligen Content-Types noch jede Menge anderes Zeug mit (User, Datum, Menüoptionen ...). Wenn ich also jetzt einen Content-Type habe, der über 4 Node-IDs 4 Nodes referenziert, muss ich mir dann selbst ein Objekt bauen, dass den ganzen Datenwust schon mitbringt?
Folgende Lösung
Glücklicherweise nicht, denn der ganze Datenwust um die eigentlichen Felder herum wird von node_save() automatisch hinzugefügt wenn er fehlt.
Hier ein bisschen Beispielcode, der das Vorgehen verdeutlicht:
<?php
global $user;
$container = new stdClass();
// node-type angeben
$container->type ='node_container';
// node-title angeben
$container->title = 'node-container_'.$user->uid.'_'.time();
// node_reference felder befüllen
$container->field_1 = array(
0 => array( 'nid' => $node_1->nid )
);
$container->field_2 = array(
0 => array( 'nid' => $node_2->nid )
);
$container->field_3 = array(
0 => array( 'nid' => $node_3->nid )
);
$container->field_4 = array(
0 => array( 'nid' => $node_4->nid )
);
// speichern des Kontainers
node_save($container);
?>
$node_1 bis $node_4 sind dabei die Nodes, die in $container gespeichert werden.