[gelöst] preprocess_node

am 16.04.2013 - 12:43 Uhr in
Ich möchte über preprocess_node einen zsätzlichen Text nach dem Inhalt des eigentlichen Textes anhängen.
Leider ist mir nicht klar wie und was ich in dem übergebenem Array ändern muss, damit es nachher auch angezeigt wird :(
<?php
function themename_preprocess_node(&$variables) {
$text = "Das ist der Text der nach dem eigentlichen Inhalt des Nodes erscheinen soll";
//So geht es leider nicht
$variables['body'][0]['value'].=$text;
$variables['body'][0]['safe_value'].=$text;
}
?>
Bin für jeden Hinweis dankbar.
- Anmelden oder Registrieren um Kommentare zu schreiben
geht es vielleicht
am 16.04.2013 - 14:38 Uhr
geht es vielleicht so:
function themename_preprocess_node(&$variables) {
$variables['text'] = "Das ist der Text der nach dem eigentlichen Inhalt des Nodes erscheinen soll";
}
Und dann in der Template-Datei:
<?php print $text; ?>
Also besser wäre:
<?php if($text) {print $text;} ?>
Nur zur Sicherheit:Deine
am 16.04.2013 - 14:45 Uhr
Nur zur Sicherheit:
Deine Function heisst nicht etwa "themename_preprocess_node" - die wird so nicht angesprochen, ausser Dein Theme heisst "themename".
Also allenfalls das Wort "themename" durch den Namen Deines Themes ersetzen.
Wo hast Du die
am 16.04.2013 - 17:05 Uhr
Wo hast Du die
$variables['body']....
her, hast Du die irgendwo gesetzt?BTW: Wieso steht das hier unter Modulentwicklung?
Gruß
Christian
Die $variables kommt aus der
am 16.04.2013 - 18:03 Uhr
Die $variables kommt aus der Definition der Funktion
<?php
function ttnew_preprocess_node(&$variables) {
?>
Wie man sieht habe ich den Namen des Themes genommen.
Ich dacht es wäre unter Modulentwicklung gut aufgehoben. Auch wenn ich es tatsächlich nicht innerhalb eines Modules verwende, wäre das Vorhaben bestimmt auch für ein Modul geeignet.
Das soll später dabei rauskommen:
Unter dem Text eines Menüpunktes (Page Node ) sollen alle Inhalte der verfügbaren Unterpunkte aufgelistet werden. Die komplette Funktion sieht bisher so aus:
<?php
function ttnew_preprocess_node(&$variables) {
$node =$variables['elements']['#node'];
if(
$node->nid!=47
or $node->nid != 46
or $node->nid != 19
or $node->nid != 20
or $node->nid != 21
or $node->nid != 22
or $node->nid != 23
){
//Unterpunkte
$parentnow = menu_link_get_preferred('node/'.$node->nid);
$parameters = array(
'active_trail' => array($parentnow['plid']),
'only_active_trail' => FALSE,
'min_depth' => $parentnow['depth']+1,
'max_depth' => $parentnow['depth']+1,
'conditions' => array('plid' => $parentnow['mlid']),
);
$children2 = menu_build_tree($parentnow['menu_name'], $parameters);
if(is_array($children2) AND count($children2)>0){
while (list($menu2)=each($children2)) {
$text .= '<div class="ag-subsubcontent">';
if($children2[$menu2]['link']['access_callback']== 'views_access'){
$text .= views_embed_view($arr[1], 'default');
}else{
$build = node_view(node_load(substr($children2[$menu2]['link']['link_path'],strpos($children2[$menu2]['link']['link_path'],'/')+1)),'full');
$text .= drupal_render($build);
}
$text .= '</div>';
}
//Content aendern
$variables['body'][0]['value'].=$text;
$variables['body'][0]['safe_value'].=$text;
}
}
}
?>
Wenn ich die Variable $text einfach per echo in der Funktion ausgebe, steht der Inhalt über dem Inhalt des eigentich aufgerufenen Menüpuktes. Es soll aber darunterstehen. Daher dachte ich, ich könnte hier irgendwo die Variable modifizieren, welche nachher für den Content zuständig ist.
Irgendjemand eine Idee?
In der Funktion ist ja auch ein Node object verfügbar $node, aber ich weiss nicht über welchen Aufruf ich in diesem die Inhalte ändern kann.
Zitat: Daher dachte ich, ich
am 16.04.2013 - 18:53 Uhr
Daher dachte ich, ich könnte hier irgendwo die Variable modifizieren, welche nachher für den Content zuständig ist.
Meinst Du die hier
$variables['node']->body['und']['0']['value']
oder - nochmal gefragt -benutzt Du ein Theme das die$variables['body']..
erzeugt (ich glaube ZEN macht sowas..)?Gruß
Christian
Leider hat das auch keine
am 16.04.2013 - 20:25 Uhr
Leider hat das auch keine Auswirkung auf die spätere Ausgabe.
<?php
$variables['node']->body['und']['0']['value'].=$text;
?>
preprocess_node ist doch genau dafür gedacht, den node vor der Ausgabe zu Modifizieren.
Bin noch nicht so lange mit Drupal, aber irgendwie sind die Dokumentationen manchmal etwas uneingängig.
Ich habe das Theme übrigens komplett selbst erstellt, also gehe ich davon aus, dass $variables['body'] zum Standard gehört.
Ganz banal ist das nicht. Die
am 17.04.2013 - 08:15 Uhr
Ganz banal ist das nicht. Die Variable kommt schon geändert an beim Rendern der Node - kannst mal mit var_dump reinsehen.
Du wirst ja die Variable ja nicht direkt ausgeben, wie man es manchmal so macht, wenn manin der template.php ein Feld geändert hat, sondern versucht wahrscheinlich etwas in das content-Renderarray zu injezieren.
Da kann es schon heikel werden, und es wird auch nicht alles erlaubt sein. Eventuell musst du mit einem preprocess auf das Feld gehen, dafür gibt es auch Funktionen und - Dir mal den Render-Prozess genauer aussehen.
Einfacher wäre es wohl, den Body als separate Variable auszugeben.
Gruß
Christian
gefunden
am 17.04.2013 - 08:30 Uhr
$vars['content']['body'][0]['#markup'] .= $text;