[gelöst] Theme_hook($node) lädt nicht das Node-object
Eingetragen von abc123 (92)
am 26.12.2010 - 14:36 Uhr in
am 26.12.2010 - 14:36 Uhr in
Hi,
ich schreibe gerade an einem Modul mit dem ich auf der Bearbeitungsseite Datenbankeinträge auswählen und zum Node-object hinzufügen und entfernen kann. Die Ausgabe soll als Tabelle mittels function theme_hook($node) und darin mit $output = theme('table', $headers, $rows) erfolgen.
Dummerweise kann ich $rows mit allem möglichen füllen, nur nicht mit dem Node-object.
Jetzt suche ich mittlerweile seit 4 Tagen nach einer Lösung...
Vielleicht kann hier jemand helfen.
/**
* Implement hook_nodeapi().
*/
function meinmodul_nodeapi(&$node, $op, $teaser, $page) {
switch ($op) {
case 'delete revision':
db_query('DELETE FROM {meinmodul} WHERE nid = %d AND vid = %d', $node->nid, $node->vid);
break;
}
}
/**
* Implement hook_view().
*/
function meinmodul_view($node, $teaser = FALSE, $page = FALSE) {
$node = node_prepare($node, $teaser);
$meinfeld_count = count($node->meinfeld);
for ($i = 0; $i < $meinfeld_count; $i++) {
$node->content['meinfeld'] = array ( '#value' => theme('meinmodultheme', $node->meinfeld, '') );
}
return $node;
}
/**
* Implement hook_theme()
*/
function meinmodultheme_theme() {
return array(
'meintheme' => array(
'arguments' => array('node'),
),
);
}
/**
* Implement theme_hook()
*/
function theme_meintheme($node) {
$node = node_load($node->nid);
$headers = array(
t('Spalte 1'),
t('Spalte 2'),
t('Spalte 3'),
t('Spalte 4'),
);
// Füllen des arrays von Hand funktioniert
$rows = array(
array(
'Zelle 1, 'Zelle 2', 'Zelle 3', 'Zelle 4'
),
);
// ENDE Füllen des arrays von Hand funktioniert
// Füllen des arrays mit Datenbankabfrage funktioniert
$sql = "SELECT * FROM meinfeld";
$res = db_query($sql);
while ($row = db_fetch_object($res)) {
$rows[] = array(
$row-title, $row->nid, $row->title, $row->type
);
}
// ENDE Füllen des arrays mit Datenbankabfrage funktioniert
// Füllen des arrays mit Variable funktioniert
global $user;
$rows = array(
'data' =>array(
array('data' => $user->name
),
),
);
// ENDE Füllen des arrays mit Variable funktioniert
// Füllen mit Node Object funktioniert NICHT
$rows[] = array(
$node->content['meinfeld']['title'], $node->content['meinfeld']['inhalt'], $node->content['meinfeld']['diese'], $node->content['meinfeld']['jenes']
);
// ENDE Füllen mit Node Object funktioniert NICHT
$output = theme('table', $headers, $rows);
return $output;
}
Greetz
abc123
- Anmelden oder Registrieren um Kommentare zu schreiben
Gib Dir mal mittels print_r
am 26.12.2010 - 15:09 Uhr
Gib Dir mal mittels print_r das Node-Objekt aus. Ich bin mir sicher, daß Du die einzelnen Felder falsch ansprichst. Da sind noch Arrays drum herum.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Hallo Werner
am 27.12.2010 - 12:29 Uhr
danke für die schnelle Antwort. Hier die Ausgabe von print_r($node)
[meinfeld] => Array
(
[0] => Array
(
[title] => Titel 1
[inhalt] => Inhalt 1
[dieses] => Dieses 1
[jenes] => Jenes 1
)
[1] => Array
(
[title] => Titel 2
[inhalt] => Inhalt 2
[dieses] => Dieses 2
[jenes] => Jenes 2
)
Eigentlich sollte ich mit
$rows[] = array(
$node->meinfeld[0]['title'], $node->meinfeld[0]['inhalt'], $node->meinfeld[0]['dieses'], $node->meinfeld[0]['jenes']
);
an die Elemente des Node-objectes herankommen. Tuts aber nicht.
In der Templatedatei node-meinmodul.tpl.php gebe ich die Felder ja auch mit
<?php print $node->meinfeld[0]['title'] ?>
aus.
Gruss abc123
PS. Wenn das funktioniert steppe ich natürlich mit einem Loop durch die einzelnen Elemente des arrays und erhalte so eine tabellenartig gestaltete Liste meiner Datenbankeinträge.
theme
am 27.12.2010 - 13:12 Uhr
Hallo.
$node->content['meinfeld'] = array ( '#value' => theme('meinmodultheme', $node->meinfeld, '') );
Definierst Du irgendwo die Funktion
theme_meinmodultheme($arg1, $arg2)
? Die versucht Drupal nämlich übertheme('meinmodultheme', $node->meinfeld, '')
aufzurufen.function theme_meintheme($node) {
$node = node_load($node->nid);
Wieso lädst Du hier nochmal das Node-Objekt, das Du schon als Argument übergeben bekommst? Das kostet unnötig Performance.
Wo genau wird diese Theme-Funktion aufgerufen und welche Werte übergibst Du?
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Hi Stefan
am 27.12.2010 - 14:48 Uhr
YES,
es geht..
Die function theme_meinmodultheme($arg1, $arg2 usw..) soll eigentlich diverse Datenbankeinträge - die ich später noch erweitern möchte - mittels $output als Tabelle realisieren und von function meinmodul_view($node, $teaser = FALSE, $page = FALSE) getriggert werden. Nun hatte ich versucht in der function meinmodul_view() per Loop durch das array $node->content durchzusteppen und für jedes Element dieses arrays die function theme_meintheme($node) mit der Tabellenausgabe zu bemühen. Deshalb hatte ich als Argument für
$node->content['meinfeld'] = array ( '#value' => theme('meinmodultheme', $node->meinfeld, '') );
das Element des Node-objectes ($node->meinfeld) übergeben.
Hatte da auch schon ein schlechtes Gewissen wegen der Performance und zum Debuggen hatte ich testweise in der function theme_meintheme($node) das Node-object mittels
$node = node_load($node->nid)
nochmals geladen.
Wenn ich den Loop aber in die function theme_meinmodul($node) verlagere und als Argument nur $node in der function meinmodul_view, also
$node->content['meinfeld'] = array ( '#value' => theme('meinmodultheme', $node) );
übergebe, dann funktionierts wie gewünscht.
Hier im Zusammenhang der funktionierende Code:
**
* Implement hook_nodeapi().
*/
function meinmodul_nodeapi(&$node, $op, $teaser, $page) {
switch ($op) {
case 'delete revision':
db_query('DELETE FROM {meinmodul} WHERE nid = %d AND vid = %d', $node->nid, $node->vid);
break;
}
}
/**
* Implement hook_view().
*/
function meinmodul_view($node, $teaser = FALSE, $page = FALSE) {
$node = node_prepare($node, $teaser);
$node->content['meinfeld'] = array ( '#value' => theme('meinmodultheme', $node) );
return $node;
}
/**
* Implement hook_theme()
*/
function meinmodultheme_theme() {
return array(
'meintheme' => array(
'arguments' => array('node'),
),
);
}
/**
* Implement theme_hook()
*/
function theme_meintheme($node) {
$headers = array(
t('Spalte 1'),
t('Spalte 2'),
t('Spalte 3'),
t('Spalte 4'),
);
$meinfeld_count = count($node->meinfeld);
for ($i = 0; $i < $meinfeld_count; $i++) {
$rows[] = array(
$node->meinfeld[$i]['title'],
$node->meinfeld[$i]['inhalt'],
$node->meinfeld[$i]['dieses'],
$node->meinfeld[$i]['jenes']
);
}
$output = theme('table', $headers, $rows);
return $output;
}
Danke nochmal, dieser Anstoss war die richtige Richtung