Zwei views in einem node? (oder: gleichzeitig mehrere nodes erstellen)
am 27.01.2008 - 22:25 Uhr in
Hallo!
Mein Vorhaben ist wie folgt:
Einem Content Type (1) mit bereits einer View Reference sollen Bilder angehängt werden können.
Das klappt auch sehr gut mit dem CCK Modul ImageField. Allerdings kann dort nur ein Bild angefügt werden.
(mit ImageField Gallery habe ich es bisher nicht geschafft, dies zu umgehen)
Deshalb meine Idee:
Ich erstelle einen weiteren Content Type (2) nur für den Bild-Upload, den ich dann an den ursprünglichen Content Type (1) einbinde.
Da ich dort aber schon eine View Reference drin habe, scheint eine zweite View Reference dadurch in der Funktion gestört zu werden. (es wären die selben Argumente - nur ein anderer Filter für den Node:Type)
Kann ich das Problem irgendwie umgehen?
Gäbe es u.U. auch die Möglichkeit, bei Erstellung der Node vom ursprünglichen Content Type (1) gleichzeitig auch einen Node von einem anderen Content Type (2) zu erstellen, die dann beide über einen dynamischen Link verbunden sind? (also so, dass ich den Link nicht manuell eingeben/umändern müsste)
Die Ideallösung würde so aussehen, dass das erste Bild im Node des Content Type (1) angezeigt würde, und es einen Link zum zugehörigen Node des Content Type (2) gäbe, wo dann alle restlichen Bilder durch einen anderen View dargestellt werden.
- Anmelden oder Registrieren um Kommentare zu schreiben
Imagecache ...
am 28.01.2008 - 05:38 Uhr
Imagecache ...
Ok, das habe ich ja schon
am 28.01.2008 - 11:09 Uhr
Ok, das habe ich ja schon installiert und damit das (eine) Bild, das ich per CCK ImageField angehängt habe, verändert. (thumbnail klein, preview groß)
Vielleicht kannst du etwas genauer erläutern, was du damit meintest. Wie kann ich ImageCache dazu einsetzen, mehrere Bilder an den Node anzuhängen?
Imagefield
am 28.01.2008 - 11:19 Uhr
Eher Imagfield, das erlaubt mehrere Fotos pro Node, die du mit Imagecache skalieren (Felder anzeigen) und per Contemplate (noch beser eigenem Nodetypen-Template) stylen kannst. Wichtig dabei ist, dass du das Feld zweimal anlegst, einmal für das große Bild, einmal für die kleinen. Du kannst alternativ auch einen View referncieren und einbinden, der die anderen Fotos enthält.
Stimmt: Ich könnte mehrere
am 28.01.2008 - 20:28 Uhr
Stimmt: Ich könnte mehrere ImageField fields in den Content Type reinschreiben.
Das wäre aber eher eine Notlösung, finde ich, weil die ganzen ImageFields das Create Content Formular ziemlich unübersichtlich machen würden.
Die bessere Lösung wäre wohl ein referenzierter View. ABER da habe ich ja wieder das Problem mit den zwei Views in einem Node... Oder ich könnte zwei Nodes beim Erstellzeitpunkt bereits mit einanderverknüpfen. (was ja irgendwie machbar sein müsste)
Zum Verständnis: Momentan sieht es bei mir so aus:
- ImageCache, ImageField und LightboxV2 installiert und aktiviert.
- Zwei Presets in ImageCache (eins für Preview, das andere für Thumbnail)
- Ein ImageField im Content Type (Display Fields: Full auf Lightbox Preview-Preset gesetzt; Teaser brauche ich nicht)
- Contemplate Template für den Content Type, wo das ImageField eingebettet ist (aus Body Variables entnommen)
- Der Content Type enthält bereits eine andere Views-Reference und ein paar andere Fields
Damit habe ich ein sehr gut funktionierendes Bild mit Teaser und Preview. Jetzt suche ich nach einer möglichst eleganten Lösung, dort mehrere Bilder reinzubekommen - am besten so, dass zuerst nur das erste Bild angezeigt wird und nach einem weiteren "Klick" dann alle anderen.
Vielleicht hilft dir der
am 28.01.2008 - 20:50 Uhr
Vielleicht hilft dir der Beitrag http://www.drupalcenter.de/node/6986
Einbinden mehrerer Views geht doch eigentlich problemlos mit theme_view().
Auszug aus dem views.module:
/**
* Returns a themed view.
* @param $view_name
* The name of the view.
* @param $limit
* Maximum number of nodes displayed on one page. if $limit is set and $use_pager is
* not, this will be the maximum number of records returned. This is ignored
* if using a view set to return a random result.
* If NULL, the setting defined for the $view will be used.
* @param $use_pager
* If set, use a pager. Set this to the pager id you want it to use if you
* plan on using multiple pagers on a page. Note that the pager element id
* will be decremented in order to have the IDs start at 0.
* If NULL, the setting defined for the $view will be used.
* @param $type
* 'page' -- Produce output as a page, sent through theme.
* The only real difference between this and block is that
* a page uses drupal_set_title to change the page title.
* 'block' -- Produce output as a block, sent through theme.
* 'embed' -- Use this if you want to embed a view onto another page,
* and don't want any block or page specific things to happen to it.
* @param $view_args
* An array containing the arguments for the view
*/
function theme_view($view_name, $limit = NULL, $use_pager = NULL, $type = 'embed', $view_args = array())
Da du dem View explizit Argumente übergeben kannst, dürften sich zwei Views nicht gegenseitig stören.
Habe das selbst so in Verwendung, und klappt wunderbar (Beispiel: http://www.zugspitzpokal.de/node/45 - Ergebnis und Galerie sind zwei unterschiedliche Views)
Zum Anzeigen von zuerst einem, dann alle anderen Bilder, kannst du auch mit dem Views Argument Handling Code arbeiten und dort die Variable $offset nutzen: http://www.drupalcenter.de/node/7590
Danke für die Links!
am 29.01.2008 - 00:13 Uhr
Danke für die Links!
Ich werde mir die Möglichkeiten mal anschauen. In Sachen PHP bin ich leider Neuling, deshalb suche ich möglichst nach "out-of-the-box" Lösungen. Wenn ich dafür aber keinen allzu komplizierten Code schreiben muss, und mich vielleicht an anderem Code anlehnen kann, bekomme ichs vielleicht auch so hin..
Füge einfach etwas wie in
am 29.01.2008 - 03:03 Uhr
Füge einfach etwas wie
<?php
theme_view('terminanhang',NULL,NULL,'block',array($node->nid,'story',3));
theme_view('terminanhang',NULL,NULL,'block',array($node->nid,'story',2));
theme_view('terminanhang',NULL,NULL,'block',array($node->nid,'story',1));
theme_view('terminanhang',NULL,NULL,'block',array($node->nid,'album'));
?>
in die Template-Datei deines Node-Typs: z.B. node-termin.tpl.php
terminanhang ist der Name des Views, block ist die Anzeigeart (kann auch page oder embed gesetzt werden), im array() stehen die zu übergebenden Argumente - in meinem Fall Node-Id, Node-Typ und Term-Id (Taxonomy).
Im View an sich, kannst du im Argument Handling Code Variablen wie $limit nutzen. z.B.
<?php
if (arg(2) != 'zeige_alle_bilder'){ //z.b. domain.de/node/123/zeige_alle_bilder
$use_pager = TRUE;
$limit = 1;
}
?>
Somit würde nur wenn das dritte Argument (arg(0)) im Pfad (node = arg(0), 123 = arg(1)) gleich zeige_alle_bilder ist alle Bilder angezigt werden, sonst nur eines.
Ebenso könntest Du auch in der Template-Datei arbeiten:
<?php
if (arg(2) != 'zeige_alle_bilder'){
theme_view('bilder_von_node',1,0,'embed',array($node->nid)); //Zeige nur 1 Bild limit = 1, page = 0
} else {
theme_view('bilder_von_node',NULL,NULL,'embed',array($node->nid)); //Zeige Alle Bilder (wenn view Standard-einstellungen auf Pager aus gestellt sind)
}
?>
?>
Nochmals danke für deine
am 05.02.2008 - 00:21 Uhr
Nochmals danke für deine Hilfe!
Ich habe die Argumente noch nicht ausprobiert, aber zumindest kann ich per Template und theme_view zwei Views ordentlich in einem Node darstellen. (was ohne eigenes Node-Template nicht funktioniert hat: ein View wurde doppelt dargestellt und der andere gar nicht)
Werd' mich mal genauer mit den Templates befassen und dann mal sehen, was ich mit den Argumenten so anstellen kann. Dein Beispiel-Code ist da sehr anschaulich - danke!