Anzeigen von bestimmten Inhalten an beliebigen stellen im eigenen Theme
am 14.02.2013 - 13:22 Uhr in
Ich bin ein Drupal-Einsteiger und habe einige Grundlegende Fragen. Habe zu dem Thema leider nichts gefunden da sich die meisten Tutorials entweder an "Enduser" richten oder bestimmte Module behandeln – sich somit auf der Drupal-Oberfläche abspielen.
Kurz zu meinem Background…
Ich bin Designer und Frontend-Entwickler mit rech guten Kenntnisse in HTML, CSS und JS. Meine CMS-Erfahrungen beschränken sich auf Wordpress. Jeder Inhalt (in WP, "Artikel") bekommt da eine ID (kann man auch selber vergeben). Mit Hilfe dieser ID kann man diese Inhalte überall und sooft man will anzeigen. Das ganz sieht da etwas so aus…
//p=71 steht hier für einen Post mit der Nummer 71 – also ein ganz bestimmter Inhalt
<?php
query_posts('p=71');
?>
<?php
while (have_posts()) : the_post();
?>
<?php
the_content();
?>
<?php
endwhile;
?>
Nun suche ich seit Tagen verzweifelt nach ähnlichen PHP-Befehlen für Drupal (7) und komme keinen Schritt weiter. Konkret brauche ich die Möglichkeit bestimmte Inhalte und Inhaltsteile (also Drupal-Seiten und Felder) direkt in meinem Theme anzuzeigen. Sodass z.B. auch die Möglichkeit besteht die Inhalte mehrere Seiten auf einer Seite anzuzeigen. Ohne Module wie "Panel" oder "Single Page" zu nutzen – ich möchte die grundlegenden Zugriffsmöglichkeiten verstehen und das Layouten selber übernehmen. Gibt es vielleicht eine Referenz mit möglichen Zugriffsbefehlen (inkl. Syntax)?
Wäre für Hinweise und Tipps sehr dankbar.
- Anmelden oder Registrieren um Kommentare zu schreiben
Die Drupal-API unterscheidet
am 14.02.2013 - 13:34 Uhr
Die Drupal-API unterscheidet sich in weiten Teilen von der Wordpress-API, da auch die Zielsetzung und Systematik beider Systeme eine andere ist. Da muss man etwas umdenken, bzw. sich einfach beides aneignen. Während du bei Wordpress eben mit dem Loop arbeiten kannst, um z.B. bestimmte Kategorien oder Tags aufzulisten, musst, bzw. solltest du bei Drupal etwas anders vorgehen. Dabei sollte man immer bedenken, dass Drupal ein modulares System ist, wobei man die Module nicht unbedingt mit Plugins von Wordpress gleichsetzen kann. Wo Plugins z.B. neue Widgets oder breitgefächerte Funktionen, wie Galerien mit sich bringen können, da sind Module bei Drupal nicht selten schon deswegen wichtig um bestimmte (Grund)Funktionalitäten bereit zu stellen.
Um einen ähnlichen Effekt wie den Loop aus Wordpress zu erreichen würde ich mich an deiner Stelle mit dem Modul Views beschäftigen, eines der, wenn nicht sogar das essentielle Modul für Drupal. Mittels Views stellst du Datenbankabfragen und eben auch Auflistungen bereit, und kannst so z.B. verschiedene Inhalte und Inhaltstypen auflisten und zusammen fassen, z.B. als Teaser, nur mit Titeln, oder auch ganze Nodes und Node-Teile. Diese Views kannst du dann als Seite, oder eben als Block ausgeben. Den Block kannst du dir dann so vorstellen wie ein Widget in Wordpress, dass du in die Sidebar, oder eben eine der Sidebars packst, wenn es mehrere gibt. Nur dass das, was bei Wordpress auf die Sidebar beschränkt ist, bei Drupal eben überall möglich ist, vorausgesetzt es gibt eine Region, wo der Block abgelegt werden kann. Diese Regionen kannst du selbst definieren und dort platzieren wo du willst.
Ich selbst bin auch eher Designer, und Drupal bietet dir da wirklich alle Möglichkeiten, weit ausgeprägter als Wordpress, aber es ist eben auch deutlich komplexer. Außerdem wird Drupal maßgeblich von Codern entwickelt, und Coder haben oft kein Gespür für Design und nicht selten nicht einmal für Usability und Enduser-Nutzung. Du musst dich da also rein fuchsen, aber Drupal geht dafür eben auch erst da los, wo Wordpress aufhört. Zwar kannst du einen Loop in Wordpress anpassen, aber einen View in Drupal kannst du noch viel ausgeprägter anpassen, wenn denn nötig. Ich arbeite selbst auch mit beiden Systemen, lande aber immer wieder bei Drupal, da es mir eben mehr Freiraum gibt als Designer.
Ich hoffe, das konnte dir irgendwie helfen. :)
Danke, das bringt mich etwas weiter...
am 14.02.2013 - 14:35 Uhr
... jetzt weiß ich, dass ich mir "View" anschauen muss (dachte bisher es stellt lediglich ein neue Navibar im Adminbereich zur Verfügung).
Aber was genau ist ein "Node" im Drupalkontext? Ist es gleichzusetzen mit "Feld" innerhalb eines "Inhalttyps"? (habe die Deutsche Version)
Eduard schriebAber was genau
am 14.02.2013 - 14:50 Uhr
Aber was genau ist ein "Node" im Drupalkontext? Ist es gleichzusetzen mit "Feld" innerhalb eines "Inhalttyps"? (habe die Deutsche Version)
Eine Node ist nicht zu verwechseln mit z.B. node.js, weswegen der Context wirklich wichtig ist.
Eine Node kann man sich als Behälter vorstellen. Stelle dir deine Seite als Schrank mit ganz vielen Schubladen vor, was damit die Page ist. Jede der Schubladen ist nun eine Node, und in jeder dieser Schubladen kann sich verschiedener Inhalt befinden, z.B. ein Post, ein Profil, oder eben ganz verschiedene Dinge. Die Node ist also der Teil, wo auf einer Seite Inhalt dargestellt wird. Das ist etwas knifflig, da es nicht bedeutet, dass nur in Nodes Contet dargestellt werden kann, natürlich kann die Page, quasi der Rahmen um die Node, auch Content enthalten, wobei das eher das grundsätzliche Gerüst der Seite, also dein Markup nebst Navigation, usw. wäre. Inhalte der Node ändern sich also von Node zu Node (nicht zwingend das Design), die der Page bleiben in aller Regel gleich. Wobei Drupal auch Möglichkeiten bietet, dass je nach Bedingung zu ändern.
Die Node stellt also die Struktur und das Design, als auch die Daten der Node selbst dar.
Generell ist der Aufbau hierarchisch page.tpl.php > node,tpl.php > body (content)/fields (Enitäten, usw.)
Schau dir hierzu mal: Overview of theme files an.
Das Feld in einem Inhaltstypen wird also in der Node ausgegeben, wobei die Node generell sein kann (node.tpl.php), oder z.B. dem Inhaltstypen entsprechend (node--inhaltstyp.tpl.php), oder auch der einzelnen Node (nid) angepasst (node--26.tpl.php). Hierzu empfehle ich als Stichwort "template suggestions", siehe auch: Drupal 7 Template (Theme Hook) Suggestions. Das bietet insgesamt die Möglichkeit das Design des Inhalts, nicht der gesamten Seite, je nach Inhaltstyp anzupassen, vor allem auch vom Design und der Struktur her.
Ich hoffe, ich konnte das bildlich darstellen, und habe nicht zu viel Verwirrung gestiftet. :)
Für jemand, der vielleicht
am 14.02.2013 - 14:53 Uhr
Für jemand, der vielleicht schon einmal mit dem Programm Excel oder ähnlichen gearbeitet hat kann man den Datentyp und den Node auch so erklären:
Beste Grüße
Werner
Danke ist jetzt etwas klarer...
am 14.02.2013 - 15:50 Uhr
... wobei ich schätze, dass es wohl eins dieser Dinge ist, die man erst richtig versteht, wenn man was man damit gemacht hat.
Aber um mal meine ursprüngliche Frage etwas zu präzisieren, ein Beispiel....
Wenn ich in meiner page.tpl.php
<?php
print $logo;
?>
Jetzt habe ich eine Seite angelegt (Name: testseite, Inhaltstyp: Einfache Seite, keine Menueintrag, Inhalt: Beispieltext)
Kann ich jetzt genauso direkt diese Seite innhalb der page.tpl.php einbinden? Etwa so:
<?php
print 'testseite';
?>
Und wenn ja, wie sehe dann die Syntax aus?
Du meinst, ob du den
am 14.02.2013 - 16:01 Uhr
Du meinst, ob du den Seiteninhalt direkt ausgeben kannst?
Wie gesagt, das geschieht über die node. Dazu wird in der node.tpl.php
<?php
print render($content);
?>
ausgegeben, was alle Inhalte der Node darstellt, also alle Felder, nebst body. Siehe dazu auch: node.tpl.php documentation
Es gibt sicherlich Wege Inhalte eines Inhaltstypes auch direkt in der page.tpl.php auszugeben, aber in 99% der Fälle macht das einfach keinen Sinn, zumindest so unmittelbar, und entspricht auch nicht der Systematik von Drupal. Oder hast du da konkrete Fallbeispiele, dessen was du realisieren willst?
Und ja, das lernt man alles primär wenn man damit Arbeit, dann wird einem die Systematik und Hierarchie recht schnell verständlich. Mein Tipp - Kleine Schritte. Nicht alles durcheinander und auf einmal, das kann nur schief gehen. :)
Es gibt ein grobes
am 14.02.2013 - 16:20 Uhr
Es gibt ein grobes Fallbeispiel...
Es soll eine Single Page Seite sein. Sprich es gibt nur eine Seite mit unterschiedlichen Inhalten. Diese Inhalte werden mit Drupal gepflegt (jeder Inhalt eine Seite oder vielleicht ein Block? oder ein View?). Im Theme muss ich dann die einzelnen Inhalt direkt ansprechen um sie erstmal mit CSS zu positionieren und zu "stylen" und um sie schließlich mit JQuery von links nach rechts usw. animieren zu können.
Das machst du über Views.
am 14.02.2013 - 16:57 Uhr
Das machst du über Views. Nehmen wir mal an du hast:
Inhaltstyp I (Kuchen)
Inhaltstyp II (Pommes)
Nun legst du verschiedene Inhalte an, also Nodes. Danach hast du die Inhalte:
Kuchen A, Kuchen B, Kuchen C
Pommes A, Pommes B, Pommes C
Nun erstellst du einen View (Ansicht), und listest z.B. alle Inhalte, oder nur die Titel des Inhaltstypen Kuchen auf. Du hast dann also eine Liste aus
Kuchen A,
Kuchen B,
Kuchen C
Gleiches machst du mit Pommes, oder du mischt beide, dann hast du z.B.
Kuchen A,
Pommes A,
Kuchen B,
Pommes B,
Kuchen C,
Pommes C
Das gibst du dann als Block aus. Jeder View ein Block.
Blöcke werden wie oben schon erwähnt in Regionen gelagert, und Regionen liegen normalerweise in der page und nicht der node, wobei auch letzteres möglich ist.
Wenn du nur eine Seite darstellen willst, dann ist das ja eigentlich die Front. Da kennt Drupal z.B. die suggestion page--front.tpl.php.
Danach legst du dann in deiner info-datei in deinem Theme-Ordner Regionen an, z.B.:
regions[pommes] = Pommes View
Diese Region kannst du dann in deiner Page ausgeben, via:
<?php
print render($page['pommes']);
?>
Wenn du nun den Cache der Seite leerst, und danach in deine Block-Verwaltung im Adminbereich gehst, dann findest du dort deine per View angelegten Blöcke. Diese kannst du dann auf den zuvor erstellten Regionen platzieren, und danach sollte die entsprechende Liste angezeigt werden.
Wie gesagt, dass sind jetzt "very basics". Das geht alles noch im Detail. Dem View kannst du z.B. noch CSS-Klassen mitgeben, oder du themest den View, indem du ein template anlegst, z.B. via views-view-fields--deinviewname.tpl.php, und dann gibst du die einzelnen Infos und Felder direkt aus, und kannst unmittelbar Einfluss auf Positionierung oder das Markup nehmen.
Da nun aber ins Detail zu gehen würde hier den Rahmen wirklich sprengen. Das muss man sowieso selbst lernen, weil man es einfach nicht im Detail erklären kann, ohne das man dafür ein Buch schreiben müsste. :) Das hört sich jetzt alles wahnsinnig komplex an, ist es aber eigentlich gar nicht. Man muss es nur einmal wissen!
Vielen Dank!
am 14.02.2013 - 17:23 Uhr
Das:
<?php
print render($page['pommes']);
?>
ist im Prinzip das worauf ich hinaus wollte.
Und jetzt weiß ich auch, dass View und Blöcke der Schlüssel ist.
Ich werde das mal morgen im Detail durcharbeiten.
Vielen herzlichen Dank!
Danke nochmal
am 15.02.2013 - 16:20 Uhr
Hab das alles mal so ausprobiert und es hat alles auf Anhieb (fast) geklappt.