View der Textkörper alleine
am 24.05.2008 - 11:35 Uhr in
Hallo Leute,
ich habe einen CCK-Inhaltstyp mit Pflichtfeldern (Datum, Select-Textfeld) und einem normalen Textkörper.
Nun würde ich gerne eine View erstellen, bei der nur die ganzen Textkörper ohne die anderen beiden Felder erscheinen, die ich intern für Kategorisierungen verwende.
Geht das mit view überhaupt oder muss ich dazu das node.tpl ändern? Das "How to theme views" habe ich gesehen und es gibt einen Beitrag der was über ID-Selektoren berichtet - könnte jeweils eine Lösung für mich sein - aber geht es nicht auch direkt in views, einfach für die view NUR den Textkörper auszuwählen? Ich weiss nicht wie ich die beiden anderen Felder abwählen kann.
Im view habe ich natürlich NUR den Textkörper ausgewählt, aber bei den Anzeigeoptionen habe ich "Vollständige Nodes" angeklickt (bei Liste der Anrisstexte ist es genauso) und es werden dann die beiden Felder mit angezeigt.
Danke für Hinweise!
hermx
- Anmelden oder Registrieren um Kommentare zu schreiben
Wenn du nur das Bodyfeld
am 24.05.2008 - 12:23 Uhr
Wenn du nur das Bodyfeld anzeigen willst, kannst du das entweder in der tpl.php machen oder mit dem Module http://drupal.org/project/contemplate
--------------
Blog www.freeblogger.org: Deutscher IRC-Channel: irc.freenode.net #drupal.de ... Jabber-me: dwehner@im.calug.deXING
Danke, Contemplate teste ich
am 24.05.2008 - 12:35 Uhr
Danke, Contemplate teste ich mal...
Grup hermx
Wenn Du einen separaten
am 24.05.2008 - 12:47 Uhr
Wenn Du einen separaten Inhaltstyp hast kannst Du dafuer auch ein Template erstellen: node-dein_inhaltstyp.tpl.php
Um im Template nur den Nodebody auszugeben. Ganz allgemein:
<div class="content">
<?php print $node->body; ?>
</div>
Du kannst im Template auch alle Felder einzeln ansprechen um sie auszugeben. Allgemein den Body:
<div class="content">
<?php print $node->content[body]['#value'];?>
</div>
oder so:
<div class="content">
<?php print $node->field_dein_datum_feld[0]['view'];?>
<?php print $node->field_dein_select_feld[0]['view'];?>
</div>
Die Namen der Felder sieht man in der Administration des Inhaltstyp.
Hinweis:
Der Code zur Ausgabe der einzelnen Felder ist nur prinzipiell.
Z. Beisp. muss das Datum formatiert ausgegeben werden (gibts eine Drupalfunktion)
bzw. die einzelnen Felder benoetigen ein sie umgebendes Div mit einer CSS Klasse die auf den Namen des Feldes Bezug nimmt (wegen dem CSS Finishing).
PS
Mit dem Nodetemplate bist Du schneller als die Fummelei mit Contemplate.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Danke quiptime, für die
am 24.05.2008 - 13:27 Uhr
Danke quiptime, für die konkrete Hilfe!
Das ist genau die Art von Info die ich als Noch-Anfänger brauche!
Super!
Da ich einen extra Inhaltstyp ja habe, werde ich es so machen.
Gruß, hermx
Frage zu View mit Textkörper alleine
am 24.05.2008 - 20:48 Uhr
Danke soweit für die Info, nun aber noch eine Frage:
Ich hätte gerne, dass meine vereinfachte Darstellung der Nodes NUR innerhalb einer view gilt, wenn ich die nodes als solche aufsuche, sollen sie ganz normal angezeigt werden. Wenn ich nun eine node-eigenertyp.tpl.php erstelle, sehen die Nodes immer so aus.
Wie kann ich erreichen, dass ich innerhalb eines view nur die Textkörper (ohne Titel, weitere Felder, submittedt etc) sehe aber wenn ich die node-url direkt aufrufe den node normal sehen kann?
Danke für Hilfe!
hermx
Na das kommt darauf an wie
am 24.05.2008 - 21:17 Uhr
Na das kommt darauf an wie Dein View aufgebaut ist bzw. was er anzeigt.
Wenn der View die Teaser anzeigt ist es leicht: Im Nodetemplate gibt es getrennte Ausgaben von Teaser und Body.
Wenn das nicht geht (View zeigt keine Teaser) dann kann man die URL als Unterscheidungsmerkmal verwenden.
Dein View hat eine konkrete URL. Die Nodeansichten haben eine andere URL: node/x
Bevor Du im Nodetemplate die Felder ausgibst pruefe einfach was gerade angezeigt wird - der View oder eine Node. Prinzipielles Beispiel:
// Viewanzeige abfragen
if ( arg(0) == 'URL_des_View' ) {
// zeige etwas bestimmtes
}
// Nodeansicht abfragen
if ( arg(0) == 'node' && is_numeric(arg(1)) ) {
// zeige etwas anderes, der normale Node-Code
}
Die Abfrage nach der Viewanzeige im Beispiel funktioniert nur wenn die View-URL aus einem Wort besteht - also keinen Pfad mit einem Slash enthaelt.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Super - danke!
am 24.05.2008 - 21:43 Uhr
Ja, das war genau was ich eigentlich wissen wollte, nämlich wie man in der .tpl abfragt, ob man gerade eine view oder einen node hat.
Wo findet man eigentlich systematisch, welche Variablen und so es alles gibt? (so was wie $view wäre nicht schlecht - werde mich wohl näher damit befassen müssen.)
Jedenfalls vielen Dank quiptime - jetzt habe ich mit deiner Hilfe meine erste eigene theme-Anpassung vorgenommen und es tut was ich will! Ein kleiner Schritt für die Menschheit, aber...
Gruß, hermx
Gelöst: View mit Textkörper alleine
am 24.05.2008 - 23:06 Uhr
Hier zum Schluß noch meine Lösung:
Mein views haben alle eine url mit slash, sie heissen alle /view/viewname
Das macht die Sache aber sogar noch einfacher, da allein arg(0) ausreicht um auf view zu prüfen:
Ich habe nun zwei neue .tpl' gemacht, eines für die Prüfung und eines das die eigentliche Darstellung erledigt:
Prüfung mit neuem template file "node-eigenertyp.tpl.php":
<?php
if ( arg(0) == 'view' ) {
include("node-eigenertyp.tpl.php.h");
}
else {
include("node.tpl.php");
}
?>
Will man es komplexer haben, könnte man statt dem if-else auch ein switch einbauen, in dem mehrere Fälle abgeprüft würden.
Das include file "node-eigenrtyp.tpl.php.h" habe ich (wie in C oft üblich) ... .h genannt, kann aber heissen wie es will. Darin ist die eigentliche Template um NUR den Textkörper auszugeben:
<?php
print $node->content[body]['#value'];
?>
Das könnte natürlich auch direkt ins erste .tpl file gehen, aber so ist es m.E. flexibler. Es kann so, je nach Bedarf, auch eine andere abgespeckte/kompliziertere Version von node.tpl.php für den view enthalten sein.
Damit ist mein Ziel erreicht: Ich habe eine view, die NUR die Textkörper hintereinander zeigt und wenn ich die Nodes über ihre url aufrufe kann ich alle Daten darin sehen und normal damit arbeiten.
Danke nochmal an quiptime für die Hinweise!
gruß hermx
Nac htrag/Fage zu Contemplate
am 25.05.2008 - 09:24 Uhr
Tatsächlich ist auch Contemplate hier recht nützlich.
Immerhin zeigt es einem alle verfügbaren Variablen an, und die kann man dann in seiner eigenen .tpl leichter einbauen, wenn man, so wie ich, noch nicht so viel darüber weiss, welche Variabeln es überhaupt gibt. Auch sieht man mit einem Beispielnode (den sich Contemplate automatisch reinzieht), welche Inhalte in den jeweiligen Variablen drin sind und damit hat man eine bessere Vorstellung, was in die .tpl rein soll.
Mit Contemplate selbst konnte ich mein Problem übrigens nicht lösen, da auf jeden Fall der Titel und die Autorinfo mit angezeigt werden - oder weiss jemand wie ich das mit Contemplate weggekriegt hätte?
Gruß hermx
Drupals Objekte, Drupals API
am 25.05.2008 - 11:28 Uhr
In einem Template kann man sich die Variablen und deren Inhalte auch anzeigen lassen.
Bei Nodes interessiert oft das Nodeobjekt bzw. die Inhalte des Nodeobjekt.
Bei Views ist es das Viewobjekt.
In Zusammenhang mit Usern ist es das Userobjekt.
In Zusammenhang mit Menues ist es das Menueobjekt.
Um nun die aktuellen Inhalte eines jeweiligen Objektes anzusehen kann man sie mit einer PHP-Funktion ausgeben.
Damit diese Ausgabe auch von normalen Menschen lesbar ist verwendet man dabei zusaetzlich noch ein HTML-Tag.
Um nun in einem Node-Template den Inhalt de Nodeobjektes auszugeben verwendet man folgenden Code:
<pre>
<?php print_r($node); ?>
</pre>
Meist ist diese Ausgabe sehr umfangreich. Um die Ausgabe weiter einzugrenzen kann mit
print_r()
die meist im Nodeobjekt enthaltenen Arrays einzeln ansprechen.Als Beispiel das im Nodeobjekt enthaltene Array "content":
<pre>
<?php print_r($node->content); ?>
</pre>
Schematisch kann man das auf die anderen Objekte anwenden. Beispiel Viewobjekt:
<pre>
<?php print_r($view); ?>
</pre>
usw.
Sollte in einem Template ein Objekt nicht zur Verfuegung stehen kann man es auch initialisieren. Beispiel Userobjekt.
Will ich in einem Nodetemplate etwas mit den User machen steht erst mal das Userobjekt nicht zur Verfuegung. In dieser Situation macht man Folgendes:
<pre>
<?php global $user; print_r($user); ?>
</pre>
Wenn in einem Nicht-Node-Template das Nodeobjekt nicht zur Verfuegung steht kann man es NICHT mit der PHP-Funktion
global
initialisieren.In diesem Fall muss man es regelrecht organisieren das man das Nodeobjekt laden darf. Das Erfolgt in Abhaengigkeit der Ausgabe des konkreten Templates. Wenn dbei Verwendung des Template im Kontext der HTML-Anzeige in der URL node/x verkommt dann kann man mittels der Drupal-Funktionen
arg()
undnode_load()
das Nodeobjekt laden. Beispiel:<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) ) {
$mynode = node_load(arg(1));
}
?>
<pre>
<?php print_r($mynode); ?>
</pre>
-------------------------------------------------------------
Sehr hilfreich bei der Ausgabe von Inhalten sind die verschiedenen Drupal-Funktionen. Um sie kennenzulernen oder auch nach den Details der Anwendung dieser Funktionen zu sehen gibt es die Website api.drupal.org.
Dort kann man der gewuenschten Drupalversion entsprechend nach diesen Funktionen im Autokomplettfeld suchen.
Wer sich ernsthaft mit Drupal beschaeftigen will kommt an der API von Drupal nicht vorbei.
PS
Ich arbeite nicht mit Contemplate. Ist mir zu muehselig und unuebersichtlich. Und ausserdem lernt man nicht wirklich die Variablen kennen. Man sieht sie halt eben mal nur.
Das ist wie mit dem in einem "Password helper" gespeicherten Passwort - man merkt sich das Passwort nicht weil man es nie wirklich anwendet.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Danke quiptime, sehr
am 07.06.2008 - 23:43 Uhr
Danke quiptime, sehr hilfreiche Info!
Gruß hermx
Einzelnes CCk Feld anzeigen
am 22.06.2008 - 14:18 Uhr
Ich sitzt jetzt schon ein paar stündchen dran und bekomme es einfach nicht hin.. -.-
Wie kann ich nur das img_url Feld anzeigen. Also ich brauchen nur den Inhalt dieses Feldes.
Immoment ist es so :
node.tpl.php :
$news=mysql_query("SELECT nid FROM node WHERE TYPE = 'blog' ORDER BY `created` DESC");
$nodeID = mysql_fetch_array($news, MYSQL_NUM);
$node = node_load($nodeID[0]);
print $node->content[field_img_url]['view']; // Keine ausgabe
oder
print $node->field_img_url[0]['view']; // Keine ausgabe
so langsam verzweifel ich .. :( .
Ich hoffe ihr könnte mir weiter helfen.
print_r($node); Tu es einfach!
am 22.06.2008 - 14:37 Uhr
Nach dem das Nodeobject geladen ist schaue Dir doch mal den Inhalt des Objektes an.
Tu es einfach
und dann wirst Du sehen wie man alle Parameter des Image ansprechen kann.
PS
Wie man print_r() anwenden kann um lesbare Ausgaben zu bekommen?
print '<pre>';
print_r($node);
print '</pre>';
PS
Was ist das eigentlich?
$news=mysql_query("SELECT nid FROM node WHERE TYPE = 'blog' ORDER BY `created` DESC");
$nodeID = mysql_fetch_array($news, MYSQL_NUM);
$node = node_load($nodeID[0]);
Ist das fuer Dich der einzige Weg um an die Node ID ranzukommen?
Du arbeitetst doch in einem Node Template. Dieses wir nur andewendet wenn die URL /node/x ist.
Jetzt darfst Du nur ein Mal raten was x bei /node/x ist.
Man kann die arg() Funktion verwenden um damit in node_load() die Node ID angeben zu koennen.
Die arg() Funktion ist hier auf DC massiv, auch mit Beispielen, dokumentiert!
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
quiptime schrieb Ist das
am 22.06.2008 - 14:54 Uhr
Ist das fuer Dich der einzige Weg um an die Node ID ranzukommen?
Du arbeitetst doch in einem Node Template. Dieses wir nur andewendet wenn die URL /node/x ist.
Jetzt darfst Du nur ein Mal raten was x bei /node/x ist.
Man kann die arg() Funktion verwenden um damit in node_load() die Node ID angeben zu koennen.
Die arg() Funktion ist hier auf DC massiv, auch mit Beispielen, dokumentiert!
nee nee darauf wäre ich auch gekommen :-P ;).
Ich befinde mich auf der Startseite ( node/1 ) und möchte die letzten 5 Blogeinträge als Vorschau anzeigen. Bei den Blogeinträgen handelt es sich um Projekt und deshalab soll die Vorschau ein Bild enthalten ( img_url ).
Aber jetzt habe ich es hinbekommen :)
so schauts aus :
$news=mysql_query("SELECT nid FROM node WHERE TYPE = 'blog' ORDER BY `created` DESC");
$nodeID = mysql_fetch_array($news, MYSQL_NUM);
$node = node_load($nodeID[0]);
print '<div id="preview" style=" border: 1px solid #3a91ba; margin: 10px; padding: 5px; text-align: center; max-width: 120px;">';
print $node->title . '<p>';
$img = $node->field_img_url[0]['value'];
$img = str_replace('150', '100',$img); // Breite ändern
$img = str_replace('200','150',$img); // höhe ändern
print $img ;
print ' von ' . $node->name .'</div>';
Vielen dank :)
Du hast mich nicht
am 22.06.2008 - 15:13 Uhr
Du hast mich nicht verstanden.
Oder Du willst mich nicht verstehen.
Dein SQL Statement zur Ermittlung der Node ID ist absolut überflüssig und sinnlos. Und generiert eine unnötige DB Anfrage die auch unnötige/sinnlose Systemlast erzeugt.
Denn wenn Du mich verstanden hättest dann würdest Du nicht posten:
Aber jetzt habe ich es hinbekommen :)
so schauts aus :
$news=mysql_query("SELECT nid FROM node WHERE TYPE = 'blog' ORDER BY `created` DESC");
$nodeID = mysql_fetch_array($news, MYSQL_NUM);
$node = node_load($nodeID[0]);
.....
.....
Und Styles am Tag sind so ziemlich das Letzte was man tun sollte.
PS
Du hast vergessen den p Tag zu schliessen.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Oder Du willst mich nicht
am 23.06.2008 - 21:38 Uhr
Oder Du willst mich nicht verstehen.
Wie bekomme ich den sonst die drei aktuellsten Blog einträge. Mir ist kla das ich an eine einzelne Node ID bzw. an die der Node ID der momentanen Seite auch anders dran komme.
Zitat: Wie bekomme ich den
am 23.06.2008 - 23:24 Uhr
Wie bekomme ich den sonst die drei aktuellsten Blog einträge.
Wieso 3? Du gibst doch nur eine Node aus.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
naja , okay das stand nicht
am 24.06.2008 - 18:20 Uhr
naja , okay das stand nicht ijm code , das ganz läuft in einer for schleife die 3 durchlaufen wird... ;)
so das drüfte alles sein :
$news=mysql_query("SELECT nid FROM node WHERE TYPE = 'blog' ORDER BY `created` DESC");
while($row=mysql_fetch_array($news)) {
$blogID[] = $row;
}
print '<div id="previews" class="clearfix">';
for($i = 0 ; $i <= 2; $i++)
{
$id = $blogID[$i][0];
$node = node_load($id);
print '<div onclick="self.location.href=\'?q=node/'.$id.'\';" id="preview">';
print '<header style="color: #689c3a;">'. $node->title . '</header><p>';
$img = $node->field_img_url[0]['value'];
$img = str_replace('150', '130',$img); // Breite ändern
$img = str_replace('200','130',$img); // höhe ändern
print $img ;
print '<i> von ' . $node->name .'</i></div>';
}
print '</div>';