node.tpl.php anpassen
am 03.02.2010 - 01:28 Uhr in
Hallo,
ich kann es einfach nicht ...
Ich möchte meine node.tpl.php anpassen und zwar wie folgt: Überschrift und darunter der Text. In einen div-Container möchte ich alle anderen Angaben per float:right einbinden. Das kann ich auch alles, aber ich habe mir mit <pre><?php print_r($node)?></pre> die einzelnen Elemente anzeigen lassen und komme da nicht weiter.
Einzelne Links würde ich gerne untereinander anzeigen, aber wie bekomme ich ein Array wie dieses angezeigt?
[contactlink] => Array
(
[title] => Contact the author
[href] => user/4/contact
[attributes] => Array
(
[title] => Email the author via the contact form.
)
)<?php foreach($field_contactlink[0] as $c);?>
funktioniert nicht. Was mache ich denn da blos falsch? Bin leider nicht der PHP Freak - noch nicht einmal Ansatzweise ...
Gruß,
Kirsten
P.S. Der Container soll dann so aussehen:
Autor: DerAutor
Erstellt am: 03.Februar 2010
Zuletzt geändert: 04.Februar 2010
Kategorien: Kategorie 1
Kategorie 2
Kommentare: (2)
Kommentar schreiben
Autor kontaktieren
Autor ignorieren- Anmelden oder Registrieren um Kommentare zu schreiben

@Kirsten1965
am 03.02.2010 - 01:43 Uhr
bleib dran, kommt gleich noch mehr.
------------------------
Quiptime Group
Als Erstes empfehle ich Dir
am 03.02.2010 - 01:48 Uhr
Als Erstes empfehle ich Dir das Modul Devel zu aktivieren.
Damit kann man an Stelle von print_r($node) dsm($node) verwenden. Solch eine Debug-Ausgabe mittels der Funktion dsm(), dpm() geht auch, ist um Welten besser lesbar und bei weitem informativer.
Geht gleich weiter.
EDIT
Also im Code dsm verwenden:
<?phpdsm($node);
?>
Keine pre Tags.
------------------------
Quiptime Group
Basics
am 03.02.2010 - 01:59 Uhr
Weiter mit einigen Basics.
Links sollte man mit der l() Funktion erzeugen.
Der Link in Deiner Frage damit gebildet:
<?php$my_link = l(t('Contact the author'), 'user/'. $node->uid .'/contact', array('attributes' => array('title' => t('Email the author via the contact form.'))));
?>
Hier habe ich gleich noch die t() Funktion verwendet. Dadurch sind die damit gebildeten Textstrings uebersetzbar.
Nun kann man sich mittels dsm() ansehen was im Link drinsteckt.
<?phpdsm($my_link);
?>
------------------------
Quiptime Group
Stürze mich gleich mal rein ...
am 03.02.2010 - 02:32 Uhr
Hallo Quiptime,
danke für die Modulempfehlung. Hatte mich noch nicht an Devel herangetraut, weil ich nicht genau wußte, was damit anfangen.
Werde mir das Modul ziehen und dann nach Deiner Erklärung meine Wünsche umsetzen - hoffe ich. Wenn ich steckenbleibe, werde ich mich nochmals melden.
Danke für den Schupser!
Kirsten
Funktionen-Suppe
am 03.02.2010 - 02:55 Uhr
Um den angefragten Inhalt darzustellen sammelt man die Informationen aus dem Nodeobject $node und den im Nodetemplate verfuegbaren Template-Variablen zusammen zusammen.
Im Folgenden ein paar Codeschnipsel die Dir helfen koennen die anzuzeigenden Infos zusammenzustellen.
Den Author verwendet man entweder so wie er im Template bei submitted vorhanden ist ode geniert die Ausgabe neu - wenn man nur seinen Namen haben will.
<?php
$user_name = theme('username', user_load(array('uid' => $node->uid)));
print $user_name;
// Den Usernamen als Link
l($user_name, 'user/'. $node->uid);
// oder
$user_link = l(theme('username', user_load(array('uid' => $node->uid))), 'user/'. $node->uid);
//oder
$user_contact_link = l(t('Contact user'), 'user/'. $node->uid .'/contact', array('attributes' => array('title' => t('Contact with').' '. $user_name)));
?>
Hier werden die Drupalfunktionen theme_username() und user_load() verwendet.
Erstellt und geaendert stecken in $node als Timestamp.
<?php$date_node_created = format_date($node->created, 'medium');
$date_node_changed = format_date($node->changed, 'medium');
?>
Mit veraendertem Parameter medium aendert man das angezeigte Format des Datums.
Auch format_date() ist eine Drupalfunktion.
Die Kategorien stecken in $node->taxonomy. Hierbei muss man bedenken das es keine Terms geben koennte. Je nach dem ob Termzuordnung required oder nicht.
<?php
if (count($node->taxonomy) > 0) {
foreach($node->taxonomy as $tid => $term) {
// dsm($term);
// Hier Term anzeige aufbauen.
// Der Name des Term ist: $term->name;
// $terms[] = $term->name;
// oder
// Das Ganze mit Link zum Term
// $terms[] = l($term->name, taxonomy_term_path($term));
}
// Nun befinden sich im Array $terms die Kategorien in abgespeckter Form vergleichsweise
// ihrem Platz im Nodeobject $node und sind zur Ausgabe innerhalb von div Elementen bereit
}
?>
Ich hoffe ich konnte Dir auf den Weg helfen.
PS
Ich hoffe im Weiteren das Du die Bedeutung von Drupal's API Website erkannt hast.
------------------------
Quiptime Group
DAAAAAAANKEEEE!!!
am 03.02.2010 - 17:45 Uhr
Hallo Quiptime,
ich hatte ja schon einmal öfter in die API von Drupal geschaut, aber ich wußte nicht so richtig, wie damit umgehen. Das ist ja eine Fundgrube! Sicherlich werde ich im Laufe der Zeit noch so manche weitere Anpassung an der Website vornehmen. Jetzt wo ich nicht nur weiß wo, sondern auch WIE ich suchen muß!
Meine node.tpl.php ist nun (fast) fertig uns schaut so aus:
<!-- node -->
<div id="node-<?php print $node->nid; ?>" class="node <?php print $node_classes; ?>">
<?php if ($submitted): ?>
<?php print $picture ?>
<?php endif;?>
<div class="node-main"> <?php if ($page == 0): ?>
<h2 class="title"><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>
<div class="content">
<?php print $content ?>
</div>
</div>
<div class="node-box"> <strong>Autor</strong>:
<?php $user_name = theme('username', user_load(array('uid' => $node->uid))); print $user_name; l($user_name, 'user/'. $node->uid); ?>
<br/>
<strong>Erstellt am:</strong> <?php print $date_node_created = format_date($node->created, 'medium'); ?><br/>
<strong>Zuletzt geändert</strong>: <?php print $date_node_changed = format_date($node->changed, 'medium'); ?><br/>
<strong>Kategorien</strong>:
<?php if (count($node->taxonomy) > 0) { foreach($node->taxonomy as $tid => $term){print $terms = l($term->name, taxonomy_term_path($term));} }?>
<br/>
<strong>Kommentare</strong>: <?php print $comment_count ?><br/>
<?php $user_name = theme('username', user_load(array('uid' => $node->uid))); print $user_comment_add = l(t('Write your own comment'), 'comment/reply/'. $node->nid .'', array('attributes' => array('title' => t('Please add your own personal comment here.').' '))); ?><br/>
<?php $user_name = theme('username', user_load(array('uid' => $node->uid))); print $user_contact_link = l(t('Contact user'), 'user/'. $node->uid .'/contact', array('attributes' => array('title' => t('Get in touch with ').' '. $user_name))); ?><br/>
<?php $user_name = theme('username', user_load(array('uid' => $node->uid))); print $user_ignore_user = l(t('Ignore member'), 'ignore_user/add/'. $node->uid .'', array('attributes' => array('title' => t('Ignore the member: ').' '. $user_name))); ?><br/>
</div>
</div>
<!-- /node-<?php print $node->nid; ?> -->
Auch das Devel Modul war eine super Empfehlung! Viel übersichtlicher für einen Newbie, wie mich!
Allein ein kleine Kleinigkeit habe ich nicht hinbekommen. Eigentlich was ich der Ansicht , dass ich mit $output auch noch die einzelnen Kategorien trennen und jeweils in einer Reihe auflisten kann mit
<li></li>. Allein, was immer ich ausprobierte, die Kategorien stehen in einer Zeile und ohne das geringste Leerzeichen dazwischen!Wenn ich dafür noch einen Tipp bekommen könnte ....
Unter unseren Danksagungen hast Du einen eigenen Platz auf unserer Site bekommen mit diesem Link: http://www.quiptime.com/ Wenn Du da lieber einen anderen hättest - kein Problem!
Gruß,
Kirsten
Abfrage einbauen oder anderes Template?
am 04.02.2010 - 00:56 Uhr
Hallo,
ich schon wieder. Mittlerweile habe ich meine node.tpl.php aktiviert und per CSS angepasst.
.floating-right { width: 27%;
float: right;
background: #fff url(../images/sky/fill_block.png) 0 100% repeat-x;
border: 1px solid #ddd;
padding: 5px 20px 20px 20px;
margin-bottom: 15px;
}
.floating-right h2 {
font-size: 130%;
padding: 0 0 0 3px;
}
.floating-right {
-webkit-border-radius: 5px;
-khtml-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
.floating-right a{ text-decoration: none;
font_weight: bold;
}
.floating-left {
width: 64%;
padding-left: 5px;
float: left;
}
<!-- node -->
<div id="node-<?php print $node->nid; ?>" class="node <?php print $node_classes; ?>">
<?php if ($submitted): ?>
<?php print $picture ?>
<?php endif;?>
<div>
<div class="floating-left"><?php if ($page == 0): ?><h2 class="title"><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2><?php endif; ?>
<div class="content"> <?php print $content ?></div></div>
<div class="floating-right">
<h2>Zusatzinformationen</h2>
<strong>Autor:</strong> <?php $user_name = theme('username', user_load(array('uid' => $node->uid))); print $user_name; l($user_name, 'user/'. $node->uid); ?><br/>
<strong>Erstellt am:</strong> <?php print $date_node_created = format_date($node->created, 'medium'); ?><br/>
<strong>Zuletzt geändert:</strong> <?php print $date_node_changed = format_date($node->changed, 'medium'); ?><br/>
<strong>Kategorien:</strong> <?php if (count($node->taxonomy) > 0) { foreach($node->taxonomy as $tid => $term){print $terms = l($term->name, taxonomy_term_path($term));} }?><br/>
<strong>Kommentare:</strong> <?php print $comment_count ?><br/>
<?php $user_name = theme('username', user_load(array('uid' => $node->uid))); print $user_comment_add = l(t('Write your own comment'), 'comment/reply/'. $node->nid .'', array('attributes' => array('title' => t('Please add your own personal comment here.').' '))); ?><br/>
<?php $user_name = theme('username', user_load(array('uid' => $node->uid))); print $user_contact_link = l(t('Contact user'), 'user/'. $node->uid .'/contact', array('attributes' => array('title' => t('Get in touch with ').' '. $user_name))); ?><br/>
<?php $user_name = theme('username', user_load(array('uid' => $node->uid))); print $user_ignore_user = l(t('Ignore member'), 'ignore_user/add/'. $node->uid .'', array('attributes' => array('title' => t('Ignore the member: ').' '. $user_name))); ?><br/>
</div>
</div>
</div>
<!-- /node-<?php print $node->nid; ?> -->
Wenn ich allerdings alle Nodes eines Taxonomy Terms anzeigen lasse, also z.B. unter http://localhost/taxonomy/term/98, dann wird der Block mit den Zusatzinformationen auch angezeigt - siehe Abbildung.
Da möchte ich die aber nicht angezeigt bekommen... Wo muß ich die ausblenden lassen?
Löst man das mit einer Abfrage if ... else oder ist das ein anderes Template zuständig?
Gruß,
Kirsten
Block Sichtbarkeits-Steuerung
am 04.02.2010 - 02:45 Uhr
Jeder Block hat in seiner Konfiguration eine Sichtbarkeitssteuerung mit 3 Varianten der Vorgehensweise.
Am flexibelsten ist es mit PHP Code zu arbeiten. Im PHP Code wird die Sichtbarkeit des Blockes mit return TRUE oder return FALSE gesteuet. Logischer Weise wird bei TRUE der Block angezeigt.
Meist wird man im PHP Code eine Kombination der Bedingungsabfragen aus "Ist eine bestimmte URL (oder URL-Fragmente)" oder "Ist es ein bestimmter Nodetype" verwendet.
1.
URL kann man bequem mit der arg() Funktion abfragen.
2.
Bei der Nodetype-Pruefung ist in der Regel eine URL mit der ID einer Node der Ausganspunkt.
Zu 1.
Beispiel URLs: aboutus oder contact
Das sind eindeutige Strings. Die URL Pruefung mit arg() fragt die einzelnen URL-Teile zwischen den / ab und zaehlt dabei von der Ziffer 0 beginnend.
Die beiden URLs waeren also
<?phpif (arg(0) == 'aboutus' || arg(0) == 'contact') {
return FALSE;
}
else {
return TRUE;
}
?>
Nur bei diesen beiden URL's wird der Block nicht gezeigt.
Zu 2.
Beispiel URL: node/45 vom Nodetype story
<?php
if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == '') {
$mynode = node_load(arg(1));
// Das Nodeobject ist erst Jetzt im Block verfuegbar.
// Diese Pruefung wird bei der Anzeige aller Nodes ablaufen.
if ($mynode->type != 'story') {
return FALSE;
}
}
if (arg(0) == 'aboutus' || arg(0) == 'contact' || arg(0) == 'impressum') {
return TRUE;
}
// Anzeige auf Terms pruefen.
// Urls von normalen Termlisten haben das Schema taxonomy/term/98
// Man macht sich eine Variable verfuegbar mit der man auf alle Terms des betreffenden Vocabularies pruefen kann
if (arg(0) == 'taxonomy' && arg(1)== 'term' is_numeric(arg(2)) && arg(3) == '') {
$terms = taxonomy_get_term(arg(2));
// Alle Vocabularies haben eine ID - vid
// Term ID 98 gehoert zum Vocabulary ID 5
if ($terms-vid == 5) {
return FALSE;
}
}
?>
Bei der Node-URL Pruefung: Die Bedingung mit arg(2) kann man bedarfweise vorsichtshalber verwenden. Damit wird auf URLs nach dem Schema node/45/print oder node/45/forum gepuft.
Da man solche Pruefungen auch an anderen Stellen, beispielsweise im Header Code eines View, verwenden kann sollte man dieses Argument arg(2) nicht uebersehen.
Gleiches gilt fuer arg(3) bei Termlisten-URLs.
URLs die mittels URL Alias (und Pathauto) geaendert sind werden trotzdem auf ihren "echten" Aufbau geprueft. Drupal loest das intern auf sozusagen.
Hat man mehrere Bloecke die auf die gleiche Art gesteuert werden sollen verwendet man den PHP Code in jedem einzelnen in Frage kommenden Block.
===========================================================
Dein Template code:
<div class="content"> <?php print $content ?></div></div>Ist das 2. schliessende div eventuell zu viel?
Zusatzinfo
Den Inhalt im Nodetemplate der in der Variable $content steckt kann man nicht direkt aus dieser Variable heraus aufdroeseln um ihn different anzeigen zu lassen.
Man muss den Inhalt der Anzeige von $content unterbinden und an seiner Stelle die Bestandteile einzeln ansprechen um sie anzuzeigen.
Jeder "eigentliche" Inhalt einer Node Node setzt sich aus mehr oder weniger vielen Felden zusammen. Meist hat man einen Nodetype mittels des Modules CCK gepimpt und zusaetzliche Felder im Nodetype intergiert. In der Nodetype Konfiguration kann man die Felder begutachten und mit
<?phpdsm($node);
?>
kann man die einzelnen Felder erkennen. Wie Felder angesprochen werden ist hinreichend dokumentiert. Mein Blog hat auch einen Post dazu.
===========================================================
Nodetype Template - Kategorien anzeigen:
<?php
if (count($node->taxonomy) > 0) {
foreach ($node->taxonomy as $tid => $term) {
print $terms = l($term->name, taxonomy_term_path($term));
}
}
?>
Richtig echt Drupal like kann man so vorgehen. Man steckt die Term-Werte zunaechst in eine Array Variable an statt sie gleich mit print auszugeben.
Um dieses Array auszugeben verwendet man die Drupalfunktion theme_links().
<?php
if (count($node->taxonomy) > 0) {
foreach ($node->taxonomy as $tid => $term) {
$my_terms[] = l($term->name, taxonomy_term_path($term), array('attributes' => array('class' => 'my-extra-term-'. $tid)));
}
}
print theme('links', $terms, array('class' => 'my-super-duper-term-links'));
// Oder das Gleiche mit zusaetzlichem div und mit "Float-Folge-Schutz" CSS Klasse clear-block.
print '<div class="my-terms clear-block">'. theme('links', $my_terms, array('class' => 'my-terms-super-duper-links')) .'</div>';
?>
Dies sollte eine Liste der einzelnen Terms ausgeben die man mittels CSS bedarfsweise formatiert.
Sehe Dir mit Firebug die CSS Klassen von im Theme bereits existierenden Kategorie-Anzeigen an und verwende diese CSS Klassen (an Stelle von "my-terms-super-duper-links"). Das erspart Dir Arbeit.
===========================================================
Code abspecken:
<?phpprint $date_node_created = format_date($node->created, 'medium');
?>
Das gleiche Ergebis mit
<?phpprint format_date($node->created, 'medium');
?>
PS
Danke fuer die Referenz URL auf Deiner Website zu mir. Wie lautet die URL zur Website?
------------------------
Quiptime Group
Toller Thread!!
am 24.03.2010 - 14:02 Uhr
Danke an Kirsten1965 (für die Frage) und Quiptime (für die super Anfänger-Hilfe in php).
Ich liebe dieses Forum dafür...
dpm & Co funktioniert nicht
am 22.07.2011 - 09:58 Uhr
Also im Code dsm verwenden:
<?phpdsm($node);
?>
Was stimmt nicht, wenn das nicht funktioniert?
dsm, dpm, print_r - es entstehen keine Outputs - trotz aktivem DEVEL-Modul…
Bist Du denn sicher, daß der
am 22.07.2011 - 10:48 Uhr
Bist Du denn sicher, daß der Code auch durchlaufen wird? Das ist immer das erste, das Du prüfen solltest.
Beste Grüße
Werner