"state of the art"-drupal theme
am 02.07.2009 - 09:50 Uhr in
huhu,
mich würde mal interessieren, wie andere Leute, sagen wir mal erfahrene Leute drupal Themes machen. Ich meine jetzt nicht dieses Grund-Setup des Zen-Themes, sondern, im Detail. Wie sieht ein gut gemachter View oder node aus? was man mit cck nicht einfach zusammen draggen kann.
ich bin einfach nicht sicher, ob meine Arbeitsweise optimal oder überhaupt orthodox ist
- Anmelden oder Registrieren um Kommentare zu schreiben

Theme erstellen
am 02.07.2009 - 11:00 Uhr
Moin.
Ich kann ja mal kurz meine Erfahrungen zusammenschreiben.
Zuerst mal kurz bemerkt: ich bin kein Designer, sondern würde mich hauptsächlich als Entwickler sehen. Da ich Drupal schon seit Längerem kenne und auch dafür entwickel, kenne ich auch die internen Strukturen und Abläufe ganz gut, was wiederum beim Umsetzen von Designs hilfreich ist.
Bei einem größeren Projekt hatten wir ein ziemlich festes Design vorgegeben. Dies bestand größtenteils aus Designvorlagen (kein HTML, nur Bilder).
Also habe ich mir erstmal anhand der vorgegeben Struktur überlegt, welche Regionen ich benötige. Als diese klar waren, konnte ich damit dann die .info des Themes erstellen.
Ausgehend von garland habe ich dann die page.tpl.php so angepasst, dass die Seite dann vom grundlegenden Aufbau schonmal wie gewünscht aussieht (inkl. CSS).
Jetzt kamen die Views und die eigentlichen Templates.
Ich bin ein Freund von klaren, einfachen Variablen in Templates. Standardmäßig werden in den Templates von Views (und auch in einigen Anderen) Inhalte in etwa so ausgegeben:
<?php print $fields['profile_field_firstname_value']->content; ?>Gruselig.
Um dies für einen Themer freundlicher zu gestalten, habe ich dem View also eine
preprocessFunktion spendiert, die das obige Konstrukt in eine einfache Variable packt.Im Template sieht das dann jetzt also so aus:
<?php print $profile_firstname; ?>Irgendwie angenehmer, oder?!
Das Schöne an den
preprocessFunktionen ist auch, dass man hier gleich noch ein paar evtl. notwendige Berechnungen und Formatierungen vornehmen kann, so dass sich der Themer (also der, der die Templates erstellt) überhaupt nicht darum kümmern muss. Er hat seine einfachen Variablen und kann die ganz simpel ausgeben.Bei Eingabeformularen (Node und Webform) bin ich dann übrigens genauso vorgegangen. Erst alle Daten mittels
preprocessFunktion in einfache Variablen packen (und gegebenenfalls noch ein paar Felder anpassen -> z.B. '#size' angepasst oder das Label) und dann in einem eigenen Template ausgeben.Ob das nun "gut" ist oder nicht, bleibt eigentlich jedem selbst überlassen. Ich bin damit bisher eigentlich ganz gut gefahren.
Und falls sich jemand in ein paar Monaten mal die Templates anschauen sollte, bekommt er möglicherweise nicht gleich einen Anfall wegen diverser seltsamer PHP-Konstrukte.
hth,
Stefan
(PS: es sind übrigens 33 Templates für Views und insgesamt 34
preprocessFunktionen :-) )--
sei nett zu Deinem Themer
ich schreib einfach mal wie
am 02.07.2009 - 11:17 Uhr
ich schreib einfach mal wie bei mir ein beliebiges node-template normalerweise aussieht:
<?php
if($page == 0){
//für die Voransicht zb für views die ich nicht themen kann
} else
{
//für die Nodeansicht
}
?>
dann benutze ich prinzipiell
<?php
$this_node=node_load($node->nid);
?>
dann später zb
<?php
echo '<h2>'.$this_node->title.'</h2>';
?>
ausserdem benutze ich immer
check_markup. ich wüsste gar nicht wie man da drum herum kommt<?php
echo '<div class="node-teaser">';
echo check_markup($this_node->teaser);
echo '</div>';
?>
das ist alles etwas umständlich und unelegant. sicher geht das besser oder?
Du brauchst die $node nicht
am 02.07.2009 - 13:03 Uhr
Du brauchst die $node nicht laden, weil die dort schon vorhanden ist.
Schau Dir die Standard node.tpl.php unter /modules/node/node.tpl.php an, wenn du nicht genau weißt was rein muss oder nicht.
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Ein Forum ist kein Ersatz für das www (Google.de).
also in der
am 02.07.2009 - 13:10 Uhr
also in der
/modules/node/node.tpl.phpsteht nur<?php print $content ?>und in
$contentist der gensammte Inhalt der node, ohne das ich die Inhalte in ihre einzelnen Bestandteile zerlegen könnte. :/$node
am 02.07.2009 - 13:21 Uhr
Wozu verwendest Du denn
<?php $this_node = node_load($node->nid); ?>?Sämtliche Daten des Node sind bereits in der Variable
$nodeenthalten.Mit Deiner Version erzeugst Du nur unnötig Datenbankzugriffe und Serverlast (da Du das komplette Node-objekt noch ein weiteres Mal lädst).
Stefan
--
sei nett zu Deinem Themer
node.tpl.php
am 02.07.2009 - 13:22 Uhr
also in der
/modules/node/node.tpl.phpsteht nur ...Wenn Du mal in den Kommentar im oberen Bereich der node.tpl.php schaust siehst Du sämtliche verfügbare Variablen. Unter Anderem auch
$node.hth,
Stefan
--
sei nett zu Deinem Themer
super, dieser threat hat
am 02.07.2009 - 13:26 Uhr
super, dieser threat hat sich schon gelohnt ;)
ich kann also an Stelle von
<?php
$this_node
=node_load($node->nid);
echo '<h2>'.$this_node->title.'</h2>';
?>
einfach schreiben:
<?php
echo '<h2>'.$title.'</h2>';
?>
Danke
loomie schrieb super,
am 02.07.2009 - 13:55 Uhr
super, dieser threat hat sich schon gelohnt ;)
Ein Threat lohnt sich niemals, außer für Erpresser, Bankräuber, dergleichen Gesindel. Aber so ein Thread, der kann mitunter schon was... ;-)
--
mortendk: everytime you use contemplate... Thor is striking down from above with his mighty hammer - crushing and killing a kitten!
webseiter.de
ok, aber wo bekomme ich in
am 03.07.2009 - 09:33 Uhr
ok, aber wo bekomme ich in diesem Fall den body-text her?
in
$node->bodyist nochmal der gesammte Inhalt der node enthalten bzw. das was ich beiadmin/content/node-type/page/displayeingestellt hab.was ist wenn ich ein ganz bestimmtes feld abgreifen will?
z.B. $node->field_myfield[0][
am 03.07.2009 - 09:46 Uhr
z.B.
$node->field_myfield[0]['mydata']<pre><?php print_r($node); ?>
</pre>
an den Inhalt komme ich mit
am 03.07.2009 - 11:37 Uhr
an den Inhalt komme ich mit
echo $node->content['body']['#value'];aber wie komme ich an den teaser?Edit: vergesst es. ich habs gerade om der API gefunden.
<?php echo node_teaser($node->content['body']['#value']); ?>Re: $this_node = node_load($node->nid)
am 03.07.2009 - 12:17 Uhr
Wozu verwendest Du denn
<?php $this_node = node_load($node->nid); ?>? ... Mit Deiner Version erzeugst Du nur unnötig Datenbankzugriffe und Serverlast (da Du das komplette Node-objekt noch ein weiteres Mal lädst).Der Node wird als statische Variable in der Funktion
node_loadgespeichert, so das ein zweites "Laden" normalerweise lediglich den Overhead für den Funktionsaufruf und den Zugriff auf die Variable erzeugt, nicht jedoch Overhead durch Datenbankabfragen.Trotzdem sollte man es vermeiden, sich den Node erneut zu holen:
node_loaddie aktuelle Revision des Nodes. Das muss aber nicht unbedingt die Revision sein, die der Benutzer sehen will.$nodewurde bereits durchnode_build_contentverarbeitet. Das ist besonders wichtig weilnode_build_contentwird ein entsprechender Eintrag in$node->contentangelegt, der dann mitdrupal_rendersicher ausgegeben werden kann,node_build_contentwirdhook_nodeapi($op = 'view')umgangen.--
