Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Themes & Theming ›

node.tpl.php anpassen

Eingetragen von Kirsten1965 (703)
am 03.02.2010 - 01:28 Uhr in
  • Themes & Theming
  • Drupal 6.x

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

‹ [gelöst] CSS Formatierung greift nicht ... Kommentare durchnummerieren ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

@Kirsten1965

Eingetragen von quiptime (4972)
am 03.02.2010 - 01:43 Uhr

bleib dran, kommt gleich noch mehr.

------------------------
Quiptime Group

  • Anmelden oder Registrieren um Kommentare zu schreiben

Als Erstes empfehle ich Dir

Eingetragen von quiptime (4972)
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:

<?php
dsm
($node);
?>

Keine pre Tags.
------------------------
Quiptime Group

  • Anmelden oder Registrieren um Kommentare zu schreiben

Basics

Eingetragen von quiptime (4972)
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.

<?php
dsm
($my_link);
?>

------------------------
Quiptime Group

  • Anmelden oder Registrieren um Kommentare zu schreiben

Stürze mich gleich mal rein ...

Eingetragen von Kirsten1965 (703)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Funktionen-Suppe

Eingetragen von quiptime (4972)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

DAAAAAAANKEEEE!!!

Eingetragen von Kirsten1965 (703)
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&auml;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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Abfrage einbauen oder anderes Template?

Eingetragen von Kirsten1965 (703)
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&auml;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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Block Sichtbarkeits-Steuerung

Eingetragen von quiptime (4972)
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

<?php
if (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

<?php
dsm
($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:

<?php
print $date_node_created = format_date($node->created, 'medium');
?>

Das gleiche Ergebis mit

<?php
print format_date($node->created, 'medium');
?>

PS

Danke fuer die Referenz URL auf Deiner Website zu mir. Wie lautet die URL zur Website?

------------------------
Quiptime Group

  • Anmelden oder Registrieren um Kommentare zu schreiben

Toller Thread!!

Eingetragen von krabbe (42)
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...

  • Anmelden oder Registrieren um Kommentare zu schreiben

dpm & Co funktioniert nicht

Eingetragen von Der Robert (26)
am 22.07.2011 - 09:58 Uhr
quiptime schrieb

Also im Code dsm verwenden:

<?php
dsm
($node);
?>

Was stimmt nicht, wenn das nicht funktioniert?
dsm, dpm, print_r - es entstehen keine Outputs - trotz aktivem DEVEL-Modul…

  • Anmelden oder Registrieren um Kommentare zu schreiben

Bist Du denn sicher, daß der

Eingetragen von wla (9461)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Rolle erstellen nicht zu finden
  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
Weiter

Neue Kommentare

  • Rollen
    vor 22 Stunden 43 Minuten
  • Inzwischen sind wir bei
    vor 1 Woche 4 Tagen
  • Migrieren von D7 auf D8/ D10/ D11
    vor 1 Woche 5 Tagen
  • melde mich mal wieder, da ich
    vor 9 Wochen 2 Tagen
  • Hey danke
    vor 9 Wochen 3 Tagen
  • Update: jetzt gibt's ein
    vor 9 Wochen 4 Tagen
  • Hallo, im Prinzip habe ich
    vor 10 Wochen 1 Tag
  • Da scheint die Terminologie
    vor 10 Wochen 1 Tag
  • Kannst doch auch alles direkt
    vor 10 Wochen 5 Tagen
  • In der entsprechenden View
    vor 10 Wochen 5 Tagen

Statistik

Beiträge im Forum: 250237
Registrierte User: 20464

Neue User:

  • ocvk2810
  • marouane.blel
  • capilclinic

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 17 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association