Node mit Drupal laden und ändern


Ein Node ist die Grundlage von Drupal. Alles ist ein Node. Wer noch nicht weiss, was ein Node ist, soll mal Google fragen. Also, ich gehe davon aus, dass der Leser weiss, was ein Node ist. Nodes können programmiererisch sehr einfach verändert werden. Dazu gibt es den hook_nodapi. Dieser hook wird immer aufgerufen, wenn Operationen am Node durchgeführt werden. Beispiel:

  • Ein Benutzer erstellt einen neuen Blogeintrag. Es wird zuerst der $op = presave, dann $op = insert aufgerufen. Jedes Modul, welches hook_nodeapi implementiert kann also darauf einfluss nehmen. Ich könnte also folgendes machen:
function mymodule_nodeapi(&$node, $op) {  
  if ($op == 'presave') {
    $node->title = trim($node->title);
  }
}

Dadurch würde jetzt jedes mal wenn ein Node gespeichert wird, der Titel getrimmt (sprich Leerzeichen am Anfang und am Ende entfernt). Es ist dabei nicht nötig, irgend einen Wert zurück zugeben, da der $node als Referenz (dafür ist dieses & Zeichen) mitgegeben wird. Änderungen, welche am $node Objekt gemacht werden werden direkt übernommen. -> Grosse Flexibilität!!!

Manchmal ist es auch notwendig einen Node zu laden. Auch das ist denkbar einfach: Die Funktion node_load:

  $node = node_load(array('nid' => $nid));

Hier wird zuerst der Node aus der node Tabelle geladen und dann wird der hook_nodeapi mit $op = load aufgerufen. Auch hier könnte ich jetzt einfluss drauf nehmen und dem node noch zusätzliche Attribute mitgeben:

function mymodule_nodeapi(&$node, $op) {  
  if ($op == 'load') {
    $node->hello_world = 'Hello World';
  }
}

Oky, wenn ich jetzt nodeload aufrufe, dann wird diesem Node ein kleines «Hello World» hinzugefügt. Zusätzlich kann ich dort auch auf die ganzen CCK Informationen und einfach alle Infos, welche zu einem Node gehören auslesen (werden automatisch über nodeload() geladen.

Ein kleines Wort zur Performance. Wenn der Node nicht aus dem Cache kommt, dann kann diese Funktion sehr teuer sein, besonders wenn viele Module installiert sind, welche alle den Node mit irgendwelchen Daten anreichern wollen. Wenn dann dazu noch mehrere Nodes auf einer Seite sind, für welche alle noch ein node_load ausgeführt wird… teuer. Die gute Nachricht jedoch: Drupal hat einen Cache (falls eingeschalten) und so geht das Ganze doch ziemlich rassig.