CCK Feld sprich mit mir

Drupal 5.x, 6.x 

Um CCK Felder in Templates, in Themefunktionen oder anderweitig ansprechen zu können ist nur wenig Code notwendig.

CCK Feld ausgeben

Die Syntax ist Folgende. Beispiel mit einem CCK Feld foobar:

<?php
$node->field_foobar[0]['value'];
?>

Handelt es sich um ein Feld das in einem Node Profile Inhaltstyp existiert muss vorher das Nodeobjekt geladen werden.

"Node Profile" Nodeobject laden

Nodeobjekt eines Node Profile Inhaltstyp laden. Der Inhaltstyp ist "address":

<?php
global $user;
$nodeprofile = nodeprofile_load('address', $user->uid);
?>

Dann das Feld ansprechen:

<?php
$nodeprofile->field_foobar[0]['value'];
?>

Die Object-Variable $node, das Nodeobject

Um CCK generierte Felder in Nodetypes ansprechen zu können muss das Nodeobject, die Object-Variable $node, auch verfügbar sein. Dies ist nicht in allen Situationen der Fall. Ein einfaches

<?php
print $node
?>

erzeugt eine Ausgabe mit der man erkennen kann ob das Nodeobject verfügbar ist oder nicht.

Wird mit print $node eine Ausgabe erzeugt, also das Nodeobject ist verfügbar, kann man sich den Inhalt des Nodeobjectes anzeigen lassen um zu sehen wie man die einzelnen Werte des Nodeobjectes ansprechen kann.

Um die Anzeige des Nodeobjectes zu realisieren wird die PHP Funktion print_r() verwendet. Um bei der Verwendung eine lesbare Anzeige zu erhalten wird die Anzeige der PHP Funktion etwas gepimpt. 

<?php
print '<pre>';
print_r($node);
print '<pre>'; 
?>

zeigt ob die Verfügbarkeit gegeben ist. Erfolgt dabei keine Ausgabe ist das Nodeobject nicht verfügbar und es erst muss geladen werden um es verwenden zu können.

Nodeobject laden

Das Laden des Nodeobjectes kann/muss in Zusammenhang mit der Kenntnis einer Node ID erfolgen. Verwendet wird dazu die Drupal Funktion node_load(). In der Regel ist eine Node ID verfügbar wenn eine Node angezeigt wird. In dieser Situation kann man die Node ID aus der URL mittels der Drupal Funktion arg() sozusagen aufgreifen.

Als Beispiel ein Block-Template oder der PHP Codebereich in einem Block. Die Beispiel URL lautet: example.com/node/14

Um das Nodeobject zu laden wird folgenderPHP Code verwendet.

<?php
if ( arg(0)  == 'node' && is_numeric(arg(1)) ) {
  $node = node_load(arg(1));
}
?>

Dem URLpart node entspricht arg(0) und dem URL Part 14 entspricht arg(1). Auf die Prüfung mit if() sollte man nicht verzichten wenn die Situation eintreten kann das bei Verwendung des Codes eine URL zur Anzeige kommt die nicht dem Schema example.com/node/14 folgt. 

Nicht immer Nodeobject laden

In den Fällen in denen eine Node ID bekannt ist, beispielsweise in einem View mit einem Argument als Node ID, muss das Nodeobject logischerweise nicht erst geladen werden um es ansprechen zu können.

Testfrage

Befindet man sich in einem Nodetype Template kann man direkt arg(1) verwenden - auch ohne zu prüfen. Denn wenn eine Node angezeigt entspricht die URL immer dem Schema example.com/node/14. Richtig?

Und was ist bei der Anzeige von Nodes in Teaserlisten wenn die URL beispielsweise dem Schema example.com/taxomomy/term/32 entspricht?

CCK Felder unterschiedlich ansprechen

Entweder mit

<?php
$node->field_foobar[0]['value'];
?>

oder mit

<?php
$node->field_foobar[0]['view'];
?>

Ob man die erste oder zweite Variante verwendet oder verwenden muss hängt davon ab ob es sich bei dem anzusprechenden Feld um ein Feld handelt das nur einen einzelnen Wert enthält wie beispielseise ein einzeiliges Textfeld oder ob es sich um ein Feld handelt das mehrere Werte enthält wie beispielsweies ein Bild- oder Linkfeld.

Links

Drupal API: node_load()
Drupal API: arg()
PHP Funktion: print_r()

Powered by Drupal. Created with ZenWalk.