Catalog Templates anpassen: Unterschied zwischen den Versionen
Aus Contao Community Documentation
MacKP (Diskussion | Beiträge) |
(ergänzt) |
||
(53 dazwischenliegende Versionen von 8 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | {{ | + | {{AppliesTo |
− | + | |TLVersion=ab 2.8 | |
− | + | |Version=ab 2.9 | |
− | [[Category: | + | |Ext1=Catalog ab 2.0beta1 |
− | + | }} | |
+ | [[Category:Catalog]] | ||
=Templates für den Catalog bearbeiten und verändern= | =Templates für den Catalog bearbeiten und verändern= | ||
− | Der Catalog bringt eine Menge Templates mit. Für fast jedes Modul gibt es einen eigenen Satz Templates. Zusätzlich werden Standard Templates herangezogen um zum Beispiel die Galerie oder die Filter zu generieren. | + | Der Catalog bringt eine Menge Templates mit. Für fast jedes Modul gibt es einen eigenen Satz Templates. Zusätzlich werden Standard-Templates herangezogen, um zum Beispiel die Galerie oder die Filter zu generieren. |
− | Da der Catalog aber nur ein Grundgerüst darstellt wird man nicht umhin kommen sich die Templates nach eigenen Wünschen und Vorstellungen anzupassen. | + | Da der Catalog aber nur ein Grundgerüst darstellt, wird man nicht umhin kommen sich die Templates nach eigenen Wünschen und Vorstellungen anzupassen. |
− | Zunächst geht es hier ganz allgemein um das Vorgehen bei der Template Anpassung. Wie man an bestimmte Werte kommt und so an die Ausgaben die man möchte. | + | Zunächst geht es hier ganz allgemein um das Vorgehen bei der Template-Anpassung. Wie man an bestimmte Werte kommt und so an die Ausgaben, die man möchte. |
− | Zusätzlich werden hier noch | + | Zusätzlich werden hier noch Fallbeispiele vorgestellt, die zum Teil aus den Wünschen/Problemen im Forum entstanden sind (Vielen Dank an alle die daran im Forum gearbeitet haben!!!). |
− | =Voraussetzungen für das Tutorial= | + | ==Voraussetzungen für das Tutorial== |
− | + | * der Umgang mit Contao sollte bekannt sein. | |
− | * der Umgang mit | + | * wie man [[Templates_bearbeiten|Templates bearbeitet]] sollte in Grundzügen bekannt sein. |
− | * wie man [ | + | * wie ein Katalog erstellt wird sollte von anderen Tutorials klar sein. Es sollte also ein Katalog mit Inhalten vorhanden sein. |
=Grundlagen= | =Grundlagen= | ||
− | ==Alles ein Array das entries Array== | + | ==Alles ein Array: das entries-Array== |
− | Um sich die Ausgabe | + | Um sich die Ausgabe des Arrays anzuschauen, braucht man nur diese Zeile in das Template bringen: |
− | < | + | <source lang="php"> |
+ | <?php print_r($this->entries); ?> | ||
+ | </source> | ||
− | Wenn man sich das | + | Wenn man sich das Ergebnis nun auf der neu geladenen Seite anschaut, ist das nicht gerade schön anzusehen. Alles steht hintereinander und ergibt einen Code-Brei. Deswegen sollte man sich das am Besten immer direkt in der Quellcode-Ansicht anschauen. Da bekommt man alles schön eingerückt und verschachtelt zu sehen! Oder man setzt die Ausgabe in ein <nowiki><pre></nowiki>-Tag. |
− | Auszug aus | + | Auszug aus einem Immobilien-Katalog: |
− | < | + | <source lang="php"> |
Array | Array | ||
( | ( | ||
− | + | [0] => Array | |
+ | ( | ||
+ | [id] => 33 | ||
+ | [catalog_name] => Immobilien | ||
+ | [parentJumpTo] => 27 | ||
+ | [tablename] => immo_immobilien_alle | ||
+ | [showLink] => 1 | ||
+ | [class] => first last even | ||
+ | [data] => Array | ||
( | ( | ||
− | + | [immo_titel] => Array | |
− | [ | + | ( |
− | + | [label] => Titel | |
− | + | [type] => text | |
− | + | [raw] => villa in tunesien | |
− | [ | + | [value] => villa in tunesien |
− | [ | + | ) |
+ | |||
+ | [immo_gebiet] => Array | ||
+ | ( | ||
+ | [label] => Gebiet | ||
+ | [type] => select | ||
+ | [raw] => 141 | ||
+ | [value] => Beja | ||
+ | [ref] => Array | ||
( | ( | ||
− | + | [0] => Array | |
− | + | ( | |
− | + | [id] => 141 | |
− | + | [pid] => 130 | |
− | + | [tstamp] => 1273353133 | |
− | + | [sorting] => 112 | |
− | + | [type] => | |
+ | [alias] => beja | ||
+ | [name] => Beja | ||
+ | ) | ||
− | + | ) | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ) | |
− | + | ||
− | + | ||
... | ... | ||
− | + | [immo_bild] => Array | |
− | + | ( | |
− | + | [label] => Bild - nur für das erste Bild (Ein Bild für die Vorschau / maximale Dateigröße: 2MB / maximale Maße in px: 800x600) | |
− | + | [type] => file | |
− | + | [raw] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/bild_01.jpg | |
− | + | [value] => <a href="immobilien-leser/items/miethaus-1.html" title="Die Details des Eintrags ansehen"><span class="image first even"><a rel="lightbox[lbimmo_immobilien_allecatalogrelated0]" href="tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/bild_01.jpg" title="Bild 01"><img src="system/html/bild_01-0ec9b6d1.jpg" alt="Bild 01" width="200" height="100" /></a></span></a> | |
− | + | [files] => Array | |
− | + | ( | |
− | + | [0] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/bild_01.jpg | |
− | + | ) | |
− | + | [meta] => Array | |
− | + | ( | |
− | + | [0] => Array | |
− | + | ( | |
− | + | [src] => system/html/bild_01-0ec9b6d1.jpg | |
− | + | [alt] => Bild 01 | |
− | + | [lb] => lbcatalogrelated0 | |
− | + | [w] => 200 | |
− | + | [h] => 100 | |
− | + | [wh] => width="200" height="100" | |
− | + | [caption] => | |
− | + | [metafile] => | |
− | + | ) | |
− | + | ) | |
− | + | ) | |
− | + | [immo_bildergalerie] => Array | |
− | + | ( | |
− | + | [label] => Bildergalerie - alle anderen Bilder (für die Detail Ansicht / maximale Dateigröße: 2MB / maximale Maße in px: 800x600) | |
− | + | [type] => file | |
− | + | [raw] => a:4:{i:0;s:103:"tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/how 2 rubbeldiekatz.jpg";i:1;s:89:"tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/image.png";i:2;s:99:"tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/institut-aussen.jpg";i:3;s:96:"tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/james-wilson.jpg";} | |
− | + | [value] => <span class="image first even"><a rel="lightbox[lbimmo_immobilien_allecatalogreader0]" href="tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/how 2 rubbeldiekatz.jpg" title="How 2 rubbeldiekatz"><img src="system/html/how 2 rubbeldiekatz-0d26e104.jpg" alt="How 2 rubbeldiekatz" width="50" height="50" /></a></span><span class="image odd"><a rel="lightbox[lbimmo_immobilien_allecatalogreader0]" href="tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/image.png" title="Image"><img src="system/html/image-6a4159ed.png" alt="Image" width="50" height="50" /></a></span><span class="image even"><a rel="lightbox[lbimmo_immobilien_allecatalogreader0]" href="tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/institut-aussen.jpg" title="Institut-aussen"><img src="system/html/institut-aussen-538b1b35.jpg" alt="Institut-aussen" width="50" height="50" /></a></span><span class="image odd"><a rel="lightbox[lbimmo_immobilien_allecatalogreader0]" href="tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/james-wilson.jpg" title="James-wilson"><img src="system/html/james-wilson-379f0b97.jpg" alt="James-wilson" width="50" height="50" /></a></span> | |
− | + | [files] => Array | |
− | + | ( | |
− | + | [0] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/how 2 rubbeldiekatz.jpg | |
− | + | [1] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/image.png | |
− | + | [2] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/institut-aussen.jpg | |
− | + | [3] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/james-wilson.jpg | |
− | + | ) | |
− | + | [meta] => Array | |
− | + | ( | |
− | + | [0] => Array | |
− | + | ( | |
− | + | [src] => system/html/how 2 rubbeldiekatz-0d26e104.jpg | |
− | + | [alt] => How 2 rubbeldiekatz | |
− | + | [lb] => lbcatalogreader0 | |
− | + | [w] => 50 | |
− | + | [h] => 50 | |
− | + | [wh] => width="50" height="50" | |
− | + | [caption] => | |
− | + | [metafile] => | |
− | + | ) | |
− | + | [1] => Array | |
− | + | ( | |
− | + | [src] => system/html/image-6a4159ed.png | |
− | + | [alt] => Image | |
− | + | [lb] => lbcatalogreader0 | |
− | + | [w] => 50 | |
− | + | [h] => 50 | |
− | + | [wh] => width="50" height="50" | |
− | + | [caption] => | |
− | + | [metafile] => | |
− | + | ) | |
− | + | [2] => Array | |
− | + | ( | |
− | + | [src] => system/html/institut-aussen-538b1b35.jpg | |
− | + | [alt] => Institut-aussen | |
− | + | [lb] => lbcatalogreader0 | |
− | + | [w] => 50 | |
− | + | [h] => 50 | |
− | + | [wh] => width="50" height="50" | |
− | + | [caption] => | |
− | + | [metafile] => | |
− | + | ) | |
− | + | [3] => Array | |
− | + | ( | |
− | + | [src] => system/html/james-wilson-379f0b97.jpg | |
− | + | [alt] => James-wilson | |
− | + | [lb] => lbcatalogreader0 | |
− | + | [w] => 50 | |
− | + | [h] => 50 | |
− | + | [wh] => width="50" height="50" | |
− | + | [caption] => | |
− | + | [metafile] => | |
− | + | ) | |
− | + | ) | |
− | + | ) | |
... | ... | ||
− | + | [immo_sterne] => Array | |
− | + | ( | |
− | + | [label] => Sterne (Wie viele Sterne hat das Hotel) | |
− | + | [type] => number | |
− | + | [raw] => | |
− | + | [value] => | |
− | + | ) | |
... | ... | ||
+ | </source> | ||
− | + | Das ist nur ein kleiner Auszug aus der Ausgabe. In dieser Ausgabe stehen verschiedene Dinge: | |
− | + | ||
− | Das ist nur ein kleiner Auszug aus der Ausgabe. | + | |
− | In dieser Ausgabe | + | |
Am Anfang stehen immer die Grundinformationen (id, catalog_name, parentJumpTo, tablename,showLink, class). | Am Anfang stehen immer die Grundinformationen (id, catalog_name, parentJumpTo, tablename,showLink, class). | ||
− | Die werden in der Regel nicht gebraucht | + | Die werden in der Regel nicht gebraucht, sind aber gut zu wissen, damit man mal kurz schauen kann, ob man überhaupt richtig ist ;) |
− | Alle Variablen die man bekommt stehen immer | + | Alle Variablen die man bekommt stehen immer im Array '''[data]'''. |
− | Um an die einzelnen Werte zu kommen, braucht man nur die Arrays | + | Um an die einzelnen Werte zu kommen, braucht man nur die Arrays des betreffenden Wertes nach oben hin durchzugehen. |
− | Beispiel: | + | Beispiel: |
Den Titel der Immobilie als Überschrift ausgeben: | Den Titel der Immobilie als Überschrift ausgeben: | ||
− | < | + | <source lang="php"> |
+ | <h3><?php echo $entry['data']['immo_titel']['value']; ?></h3> | ||
+ | </source> | ||
− | Das value 'villa in tunesien' soll ausgegeben werden | + | Das value 'villa in tunesien' soll ausgegeben werden. Dieses befindet sich im Array ['immo_titel'], und das ist im Array ['data']. |
So einfach bekommt man einzelne Werte ausgegeben. | So einfach bekommt man einzelne Werte ausgegeben. | ||
− | ==Die Bestandteile der | + | ==Die Bestandteile der Arrays== |
− | + | ||
Die Arrays in so einer Ausgabe sind immer gleich aufgebaut. Je nach Feldtyp etwas anders. | Die Arrays in so einer Ausgabe sind immer gleich aufgebaut. Je nach Feldtyp etwas anders. | ||
− | + | ===Standard-Informationen=== | |
− | * class | + | * [class] => die CSS-Klassen des Items (eher wichtig in einer Liste, da man dort zum Beispiel even/odd zur Verfügung hat) |
− | * link | + | * [link] => die URL der Leser Seite (auch eher listenspezifisch) |
− | * url | + | * [url] => enthält nur die URL des Links. Damit kann man seine eigenen Links bauen |
− | * data | + | * [data] => hier sind alle Felder drin |
− | === | + | ===Allgemeine Parameter=== |
Jedes Feld hat immer diese 4 Parameter: | Jedes Feld hat immer diese 4 Parameter: | ||
− | + | *[label] => enthält das Label, das im Katalog vergeben wurde | |
− | + | *[type] => enthält den Feldtyp. Zum Beispiel: text, file, select, tags | |
− | + | *[raw] => enthält die Originaldaten direkt aus der Datenbank. Hiermit kann man immer komplett eigene Ausgaben gestalten | |
− | + | *[value] => enthält die vorformatierten Daten (bei einem Textfeld den formatierten String, bei einem Datei-download den download-Link, ..) | |
+ | |||
+ | ===Spezielle Parameter=== | ||
+ | Je nach Feldtyp folgen noch spezielle Parameter: | ||
+ | *[files] => beinhaltet ein Array -> [0] ... [n] mit Dateinamen | ||
− | === | + | *[meta] => beinhaltet meta-Angaben |
+ | *:Wenn es sich um eine Datei handelt (kein Bild) wird das meta-Array diese Werte enthalten: | ||
+ | **[url] => die relative URL zum herunterladen | ||
+ | **[alt] => den alt-Text | ||
+ | **[caption] => die Beschreibung in der meta.txt-Datei | ||
+ | **[size] => die Größe in Byte | ||
+ | **[sizetext] => die Größe in lesbarer Form (z.B. 230.0 kB) | ||
+ | **[icon] => das Icon (Gesetzt wird der Standard vom System selber, basierend auf den Mime-Typen.) | ||
+ | *:Wenn es sich um ein Bild handelt, wird das meta-Array diese Werte enthalten: | ||
+ | **[src] => den Dateinamen des Bildes in angepasster Größe (falls es im Katalog selbst so benutzt wird) | ||
+ | **[alt] => Den alt-Text | ||
+ | **[lb] => die einzigartige REL=lightbox-ID damit die Slimbox angesteuert werden kann | ||
+ | **[w] => die Breite des Bildes | ||
+ | **[h] => die Höhe des Bildes | ||
+ | **[wh] => Bild width/height in einem String | ||
− | ==== | + | *[ref] => beinhaltet referenzierende Tabellen |
+ | **[parentJumpTo] => die ID des referenzierenden Katalogs (kann in Inserttags genutzt werden) | ||
+ | **[parentLink] => Der komplette Link mit dem Standard Text "View item details" | ||
+ | **[parentUrl] => Die relative URL zu der Detail-/Leser-Seite | ||
− | + | =Beispiele= | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
==Einfache Überprüfung ob Inhalt vorhanden ist== | ==Einfache Überprüfung ob Inhalt vorhanden ist== | ||
Zeile 257: | Zeile 251: | ||
Wenn man die Ausgabe von einem Div nur machen möchte wenn auch Inhalte vorhanden sind, kann man das einfach mit einer if-Abfrage erledigen: | Wenn man die Ausgabe von einem Div nur machen möchte wenn auch Inhalte vorhanden sind, kann man das einfach mit einer if-Abfrage erledigen: | ||
− | < | + | <source lang="php"> |
+ | <?php if($entry['data']['immo_bildergalerie']['value']):?> | ||
+ | <div class="immo_galerie"><?php echo $entry['data']['immo_bildergalerie']['value']; ?></div> | ||
+ | <?php endif;?> | ||
+ | </source> | ||
− | In dem Beispiel wird die Bildergalerie mit dem | + | In dem Beispiel wird die Bildergalerie mit dem umschließenden div nur dann ausgegeben wenn auch mindestens ein Bild vorhanden ist. |
==Wie man in eigenen Templates beim Katalog Thumbnails generieren kann== | ==Wie man in eigenen Templates beim Katalog Thumbnails generieren kann== | ||
− | Thumbnails werden in | + | Thumbnails werden in Contao mit der Methode Controller::[[Arbeiten mit Bildern#getImage()|getImage()]] generiert. |
Wichtig dabei ist, dass nicht der ganze Code des Bildes zurückgegeben wird, sondern lediglich die URL zum Thumbnail. | Wichtig dabei ist, dass nicht der ganze Code des Bildes zurückgegeben wird, sondern lediglich die URL zum Thumbnail. | ||
Die Methode sieht wie folgt aus: | Die Methode sieht wie folgt aus: | ||
− | < | + | <source lang="php"> |
getImage($image, $width, $height, $mode='', $target=null) | getImage($image, $width, $height, $mode='', $target=null) | ||
− | </ | + | </source> |
Die Parameter erklären sich wie folgt: | Die Parameter erklären sich wie folgt: | ||
Zeile 278: | Zeile 276: | ||
* $height (Integer) ''bedingt optional (Achtung: mind. eine Angabe zu Breite oder Höhe ist zwingend!)'' | * $height (Integer) ''bedingt optional (Achtung: mind. eine Angabe zu Breite oder Höhe ist zwingend!)'' | ||
** erwartet eine Zahl, die die Breite in Pixel angibt (z.B. 230) | ** erwartet eine Zahl, die die Breite in Pixel angibt (z.B. 230) | ||
− | * $mode (String) ''optional'' (weitergehende Informationen auf dem [http://www. | + | * $mode (String) ''optional'' (weitergehende Informationen auf dem [http://www.contao.org/blog-leser/items/die-3-varianten-der-bildanpassung-in-typolight-2.8.html offiziellen Contao-Blog]) |
** erwartet einen Angabe darüber, wie das Bild behandelt werden soll. Möglich sind: | ** erwartet einen Angabe darüber, wie das Bild behandelt werden soll. Möglich sind: | ||
*** <nowiki>''</nowiki> (Exaktes Format) - default | *** <nowiki>''</nowiki> (Exaktes Format) - default | ||
Zeile 287: | Zeile 285: | ||
Ein Beispiel für ein Template mit einem Thumbnail von 430px Breite und 300px Höhe, das proportional geparst werden soll, könnte also so aussehen: | Ein Beispiel für ein Template mit einem Thumbnail von 430px Breite und 300px Höhe, das proportional geparst werden soll, könnte also so aussehen: | ||
− | < | + | <source lang="php"> |
<img src="<?php echo $this->getImage('tl_files/meine_bilder/mein_bild.jpg',430,300,'proportional'); ?>" alt="Mein alt-Text für mein Bild" /> | <img src="<?php echo $this->getImage('tl_files/meine_bilder/mein_bild.jpg',430,300,'proportional'); ?>" alt="Mein alt-Text für mein Bild" /> | ||
− | </ | + | </source> |
==Fortlaufende Nummerierung der einzelnen Einträge in einer Liste== | ==Fortlaufende Nummerierung der einzelnen Einträge in einer Liste== | ||
Zeile 295: | Zeile 293: | ||
Die Paginierung wurde berücksichtigt: | Die Paginierung wurde berücksichtigt: | ||
− | < | + | <source lang="php"> |
− | <?php $perpage=3 | + | <?php |
− | + | $perpage=3 | |
− | + | $index=0 | |
− | < | + | foreach ($this->entries as $entry): |
− | + | <$index++ | |
− | + | if (isset($_GET['page'])): | |
− | + | $number = $index + ($perpage * ($_GET['page'] - 1)) | |
− | + | else: | |
− | + | $number = $index | |
+ | endif; | ||
... | ... | ||
− | + | endforeach; | |
− | </ | + | ?> |
+ | </source> | ||
Wobei $perpage die Anzahl der Items enhält, die pro Seite ausgegeben werden. | Wobei $perpage die Anzahl der Items enhält, die pro Seite ausgegeben werden. | ||
− | |||
==Kategorien einmalig ausgeben und die Items darunter== | ==Kategorien einmalig ausgeben und die Items darunter== | ||
Beispiel anhand eines modifizierten catalog_simple.tpl: | Beispiel anhand eines modifizierten catalog_simple.tpl: | ||
− | < | + | <source lang="php"> |
− | <?php if (count($this->entries)): | + | <?php |
− | + | if (count($this->entries)): | |
− | <div class="layout_simple"> | + | $lastcat=''; ?> |
− | <?php foreach ($this->entries as $entry): | + | <div class="layout_simple"> |
− | + | <?php foreach ($this->entries as $entry): | |
− | + | if ($lastcat!=$entry[data]['Kategorie']['value']): | |
− | <div class="cat"><?php echo $entry[data]['Kategorie']['value']; ?></div> | + | $lastcat=$entry[data]['Kategorie']['value']; ?> |
− | <?php endif; ?> | + | <div class="cat"><?php echo $entry[data]['Kategorie']['value']; ?></div> |
− | <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> | + | <?php endif; ?> |
− | <?php foreach ($entry['data'] as $field=>$data): | + | <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> |
− | + | <?php foreach ($entry['data'] as $field=>$data): | |
− | + | if ($field=='Kategorie') continue; | |
− | <div class="field <?php echo $field; ?>"> | + | if (!in_array($field, array('catalog_name','parentJumpTo'))): ?> |
− | + | <div class="field <?php echo $field; ?>"> | |
− | + | <div class="label"><?php echo $data['label']; ?></div> | |
− | </div> | + | <div class="value"><?php echo $data['value']; ?></div> |
− | <?php endif; | + | </div> |
− | + | <?php endif; | |
− | + | endforeach; | |
− | + | if ($entry['showLink'] && $entry['link']): ?> | |
− | <div class="link"><?php echo $entry['link']; ?></div> | + | <div class="link"><?php echo $entry['link']; ?></div> |
− | <?php endif; | + | <?php endif; |
− | + | if ($entry['linkEdit']): ?> | |
− | <div class="linkEdit"><?php echo $entry['linkEdit']; ?></div> | + | <div class="linkEdit"><?php echo $entry['linkEdit']; ?></div> |
− | <?php endif; ?> | + | <?php endif; ?> |
− | </div> | + | </div> |
− | <?php endforeach; ?> | + | <?php endforeach; ?> |
− | </div> | + | </div> |
− | <?php else: | + | <?php else: |
− | + | if ($this->condition): ?> | |
− | <div class="condition"><?php echo $this->condition; ?></div> | + | <div class="condition"><?php echo $this->condition; ?></div> |
− | <?php else: ?> | + | <?php else: ?> |
− | <p class="info">There are no entries matching your search.</p> | + | <p class="info">There are no entries matching your search.</p> |
− | <?php endif; | + | <?php endif; |
− | + | endif; | |
− | + | ?> | |
− | </ | + | </source> |
==Fortlaufende Nummern für die Zellen im Katalog== | ==Fortlaufende Nummern für die Zellen im Katalog== | ||
− | |||
Am Beispiel von einem simpletable.tpl | Am Beispiel von einem simpletable.tpl | ||
− | < | + | <source lang="php"> |
<table class="layout_simpletable" summary="Catalog Items" cellspacing="0" cellpadding="0"> | <table class="layout_simpletable" summary="Catalog Items" cellspacing="0" cellpadding="0"> | ||
− | <thead class="header"> | + | <thead class="header"> |
− | <tr> | + | <tr> |
− | <?php list($field, $heading) = each($this->entries); | + | <?php list($field, $heading) = each($this->entries); |
− | + | $i = 0; | |
− | + | foreach ($heading['data'] as $field=>$data): | |
− | + | $i++; | |
− | + | if (!in_array($field, array('catalog_name','parentJumpTo'))): ?> | |
− | <th class="header<?php echo $i; ?>"><?php echo $data['label']; ?></th> | + | <th class="header<?php echo $i; ?>"><?php echo $data['label']; ?></th> |
− | <?php endif; | + | <?php endif; |
− | + | endforeach; ?> | |
− | </tr> | + | </tr> |
− | </thead> | + | </thead> |
− | <tbody class="body<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> | + | <tbody class="body<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> |
− | <?php foreach ($this->entries as $entry): | + | <?php foreach ($this->entries as $entry): |
− | + | $n++ ?> | |
− | <tr class="item<?php echo $n; ?><?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> | + | <tr class="item<?php echo $n; ?><?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> |
− | <?php foreach ($entry['data'] as $field=>$data): | + | <?php foreach ($entry['data'] as $field=>$data): |
− | + | $k++; | |
− | + | if (!in_array($field, array('catalog_name','parentJumpTo'))): ?> | |
− | <td class="field <?php echo $field; ?><?php echo $k; ?>"> | + | <td class="field <?php echo $field; ?><?php echo $k; ?>"> |
− | <?php if (strlen($data['value'])): | + | <?php if (strlen($data['value'])): |
− | + | if ($entry['url'] && $field == 'title'): ?><a href="<?php echo $entry['url']; ?>"> | |
− | <?php endif; | + | <?php endif; |
− | + | echo $data['value']; | |
− | + | if ($entry['url'] && $field == 'title'): ?></a> | |
− | <?php endif; | + | <?php endif; |
− | + | endif; ?> | |
− | </td> | + | </td> |
− | <?php endif; | + | <?php endif; |
− | + | endforeach; ?> | |
− | </tr> | + | </tr> |
− | <?php endforeach; ?> | + | <?php endforeach; ?> |
− | </tbody> | + | </tbody> |
</table> | </table> | ||
− | </ | + | </source> |
− | + | ||
==Eine Bildergalerie erstellen, wo nur das 1. Bild ausgegeben wird und die anderen in der Lightbox vorhanden sind== | ==Eine Bildergalerie erstellen, wo nur das 1. Bild ausgegeben wird und die anderen in der Lightbox vorhanden sind== | ||
− | {{Achtung|diese | + | {{Achtung|diese beiden Herangehensweisen sind noch ungetestet.}} |
HTML: | HTML: | ||
Die Ausgabe sollte ungefähr so aussehen: | Die Ausgabe sollte ungefähr so aussehen: | ||
− | < | + | <source lang="php"> |
<a href="tl_files/image01.jpg" title="bla" rel="lightbox[lightbox_1]"><img src="tl_files/image01.jpg" alt="bla" /></a> | <a href="tl_files/image01.jpg" title="bla" rel="lightbox[lightbox_1]"><img src="tl_files/image01.jpg" alt="bla" /></a> | ||
<a href="tl_files/image02.jpg" title="bla" rel="lightbox[lightbox_1]"></a> | <a href="tl_files/image02.jpg" title="bla" rel="lightbox[lightbox_1]"></a> | ||
− | </ | + | </source> |
Das 1. Bild mit Vorschaubild und die anderen Bilder nur als Link, damit diese ausgegeben werden, aber erst mal nix zu sehen ist. | Das 1. Bild mit Vorschaubild und die anderen Bilder nur als Link, damit diese ausgegeben werden, aber erst mal nix zu sehen ist. | ||
Zeile 416: | Zeile 413: | ||
Template (Grundüberlegung): | Template (Grundüberlegung): | ||
1. Grundüberlegung der Ausgabe allgemein: | 1. Grundüberlegung der Ausgabe allgemein: | ||
− | < | + | <source lang="php> |
<?php if($entry['data']['einzelbild']['meta']):?> | <?php if($entry['data']['einzelbild']['meta']):?> | ||
<div class="bilder"> | <div class="bilder"> | ||
Zeile 423: | Zeile 420: | ||
</div> | </div> | ||
<?php endif;?> | <?php endif;?> | ||
− | </ | + | </source> |
2. Grundüberlegung der Ausgabe allgemein: | 2. Grundüberlegung der Ausgabe allgemein: | ||
− | < | + | <source lang="php"> |
<?php if($entry['data']['bildergalerie']['value']):?> | <?php if($entry['data']['bildergalerie']['value']):?> | ||
<div class="bilder"> | <div class="bilder"> | ||
Zeile 432: | Zeile 429: | ||
</div> | </div> | ||
<?php endif;?> | <?php endif;?> | ||
− | </ | + | </source> |
− | Damit hat man einfach nur die normale Galerie. Das wäre für | + | Damit hat man einfach nur die normale Galerie. Das wäre für diesem Fall ja nicht passend; sei an dieser Stelle jedoch noch mal dokumentiert sein. |
− | Um das jetzt zu verbinden | + | Um das jetzt zu verbinden, gibt es verschiedene Vorgehensweisen: |
1. | 1. | ||
− | < | + | <source lang="php"> |
<?php if($entry['data']['einzelbild']['meta']):?> | <?php if($entry['data']['einzelbild']['meta']):?> | ||
<div class="bilder"> | <div class="bilder"> | ||
Zeile 450: | Zeile 447: | ||
</div> | </div> | ||
<?php endif;?> | <?php endif;?> | ||
− | </ | + | </source> |
2. Für das 1. Bild (in Array ja die 0 eine andere Ausgabe machen): | 2. Für das 1. Bild (in Array ja die 0 eine andere Ausgabe machen): | ||
− | < | + | <source lang="php"> |
<?php if($entry['data']['bildergalerie']['value']):?> | <?php if($entry['data']['bildergalerie']['value']):?> | ||
<?php foreach ($entry['bildergalerie']['value'] as $field=>$data): ?> | <?php foreach ($entry['bildergalerie']['value'] as $field=>$data): ?> | ||
Zeile 463: | Zeile 460: | ||
<?php endforeach; ?> | <?php endforeach; ?> | ||
<?php endif;?> | <?php endif;?> | ||
− | </ | + | </source> |
+ | ==Referenzen ohne des Referenzmodul== | ||
+ | Will man referenzierte Werte aus einem weiteren Katalog darstellen, ohne das Referenzmodul zu benutzen, kann man auch die Templates der anderen Module anpassen. Referenzfelder sind immer innerhalb des Arrays [ref], hier ein Beispiel aus einem Kontakte-Katalog mit referenzierter Firma: | ||
+ | <source> [data] => Array | ||
+ | ( | ||
+ | [name] => Array | ||
+ | ( | ||
+ | [label] => Vorname | ||
+ | [type] => text | ||
+ | [raw] => Bubble | ||
+ | [value] => Bubble | ||
+ | |||
− | + | ) | |
− | + | ||
− | + | ||
− | |||
− | + | [firma] => Array | |
+ | ( | ||
+ | [label] => Firma | ||
+ | [type] => select | ||
+ | [raw] => 9 | ||
+ | [value] => Rainbow Islands | ||
+ | [ref] => Array | ||
+ | ( | ||
+ | [1] => Array | ||
+ | ( | ||
+ | [id] => 9 | ||
+ | [pid] => 3 | ||
+ | [sorting] => 8 | ||
+ | [tstamp] => 1329215904 | ||
+ | [firmenname] => Rainbow Islands | ||
+ | [bereich] => 8 | ||
+ | [status] => 2 | ||
+ | [webseite] => bubblebobble.islands | ||
+ | [land] => 15 | ||
+ | [info] => Jump 'n' run! | ||
+ | [parentJumpTo] => 0 | ||
+ | [parentLink] => View the item details | ||
+ | [parentUrl] => kontakte-reader/items/9 | ||
+ | ) | ||
− | < | + | ) |
− | <?php foreach ($ | + | |
− | + | ) | |
− | <div class=" | + | |
− | + | ||
+ | </source> | ||
+ | Dem Kontakt ist über ein Auswahlfeld eine Firma aus einem weiteren Katalog zugeordnet. In dem Firmenkatalog findet man einfache Textfelder (firmenname, webseite, info) und Werte, die selbst wiederum aus einer Taxonomie oder einem anderen Katalog gewählt wurden und deshalb nur mit ihrer id angezeigt werden (bereich, status, land). Um die einfach bezogenen Werte einzubinden, reicht eine zusätzliche Abfrage des 'ref'-Arrays. Um die weiter referenzierten Werte auszugeben, muss man allerdings eine Datenbank-Abfrage starten. | ||
+ | |||
+ | Die beiden Optionen als Beispiel: | ||
+ | |||
+ | '''zusätzliche Schleife über das 'ref'-Array:''' | ||
+ | <source> | ||
+ | <?php if (count($this->entries)): ?> | ||
+ | |||
+ | <div class="layout_full"> | ||
+ | |||
+ | <?php foreach ($this->entries as $entry): ?> | ||
+ | <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> | ||
+ | <?php if($entry['linkEdit']): ?><?php echo $entry['linkEdit']; ?><?php endif; ?> | ||
+ | <?php foreach ($entry['data'] as $field=>$data): ?> | ||
+ | <?php if (strlen($data['raw']) && !in_array($field, array('catalog_name','parentJumpTo'))): ?> | ||
+ | <div class="field <?php echo $field; ?>"> | ||
+ | <div class="label"><?php echo $data['label']; ?></div> | ||
+ | <div class="value"><?php echo $data['value']; ?></div> | ||
+ | |||
+ | <!-- zusätzliche Abfrage--> | ||
+ | <?php if (array_key_exists('ref', $data)): ?> | ||
+ | <?php foreach ($data['ref'] as $ref): ?> | ||
+ | <div class="label">Web</div> | ||
+ | <div class="value"><?php echo $ref['webseite']; ?></div> | ||
+ | <div class="label">Info</div> | ||
+ | <div class="value"><?php echo $ref['info']; ?></div> | ||
+ | <?php endforeach; ?> | ||
+ | <?php endif; ?> | ||
+ | <!-- zusätzliche Abfrage--> | ||
+ | |||
+ | </div> | ||
+ | <?php endif; ?> | ||
+ | <?php endforeach; ?> | ||
+ | </div> | ||
<?php endforeach; ?> | <?php endforeach; ?> | ||
− | </ | + | </div> |
+ | <?php else: ?> | ||
+ | <p class="info"><?php echo $this->noItemsMsg; ?></p> | ||
+ | <?php endif; ?> | ||
+ | </source> | ||
+ | |||
+ | '''Datenbankabfrage:''' | ||
+ | <source> | ||
+ | <?php if (count($this->entries)): ?> | ||
+ | |||
+ | <div class="layout_full"> | ||
+ | |||
+ | <?php foreach ($this->entries as $entry): ?> | ||
+ | <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> | ||
+ | <?php if($entry['linkEdit']): ?><?php echo $entry['linkEdit']; ?><?php endif; ?> | ||
+ | <?php foreach ($entry['data'] as $field=>$data): ?> | ||
+ | <?php if (strlen($data['raw']) && !in_array($field, array('catalog_name','parentJumpTo'))): ?> | ||
+ | <div class="field <?php echo $field; ?>"> | ||
+ | <div class="label"><?php echo $data['label']; ?></div> | ||
+ | <div class="value"><?php echo $data['value']; ?></div> | ||
+ | |||
+ | <!-- DB-Abfrage--> | ||
+ | <?php if (array_key_exists('ref', $data)): ?> | ||
+ | <?php foreach ($data['ref'] as $ref): ?> | ||
+ | <div class="label">Status</div> | ||
+ | <div class="value"> | ||
+ | <?php $this->import('Database'); | ||
+ | $objData = $this->Database->prepare("SELECT name FROM tl_taxonomy WHERE id=?")->execute($ref['status']); | ||
+ | echo $objData->name; ?> | ||
+ | </div> | ||
+ | <div class="label">Land</div> | ||
+ | <div class="value"> | ||
+ | <?php $this->import('Database'); | ||
+ | $objData = $this->Database->prepare("SELECT name FROM tl_taxonomy WHERE id=?")->execute($ref['land']); | ||
+ | echo $objData->name; ?> | ||
+ | </div> | ||
+ | <?php endforeach; ?> | ||
+ | <?php endif; ?> | ||
+ | <!-- DB-Abfrage--> | ||
+ | |||
+ | </div> | ||
+ | <?php endif; ?> | ||
+ | <?php endforeach; ?> | ||
+ | </div> | ||
+ | <?php endforeach; ?> | ||
+ | </div> | ||
+ | |||
+ | <?php else: ?> | ||
+ | <p class="info"><?php echo $this->noItemsMsg; ?></p> | ||
+ | <?php endif; ?> | ||
+ | </source> | ||
+ | Beides kann man dann natürlich auch kombinieren. | ||
+ | Weitere Beispiele gibt's auch im Forum: [http://www.contao-community.de/showthread.php?5448-2-Kataloge-referenzieren-GEL%D6ST] | ||
+ | |||
+ | ==Alle Werte ausgeben und nur einen anpassen (als Beispiel Bilder mit eigener Beschreibung)== | ||
+ | Hier ein Auszug wie bei dem Feld beispiel_bild der gewünschte Code ausgegeben wird und ansonsten die Werte einfach normal vom Catalog ausgegeben werden. | ||
+ | <source lang="php"> | ||
+ | <?php foreach ($entry['data'] as $field=>$data): ?> | ||
+ | <div class="field <?php echo $field; ?>"> | ||
+ | <?php if($field=='beispiel_bild'):?> | ||
+ | {{image::<?php echo $data['files']['0']; ?>?width=<?php echo $data['meta']['0']['w']; ?>&height=<?php echo $data['meta']['0']['h']; ?>&alt=<?php echo $data['value']; ?>&mode=crop&rel=lightbox}} | ||
+ | <?php elseif(!in_array($field, array('catalog_name','parentJumpTo'))):?> | ||
+ | <div class="label"><?php echo $data['label']; ?></div> | ||
+ | <div class="value"><?php echo $data['value']; ?></div> | ||
+ | <?php endif; ?> | ||
+ | </div> | ||
+ | <?php endforeach; ?> | ||
+ | </source> | ||
+ | |||
+ | ==Wert nur ausgeben, wenn Mitglied in einer bestimmten Gruppe ist == | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | $this->import('FrontendUser', 'User'); | ||
+ | if (in_array(2, $this->User->groups)): | ||
+ | ?> | ||
+ | |||
+ | <span>Meine Ausgabe</span> | ||
+ | |||
+ | <?php endif; ?> | ||
+ | </source> | ||
+ | |||
+ | Zunächst müssen die Werte vom Frontend-User importiert werden. Danach kann man abfragen, ob die ID (in diesem Fall die 2) in dem Array vorkommt und dann eine Ausgabe machen. So kann man mit einem Template die Ausgabe für mehrere Gruppen individualisieren. | ||
+ | |||
+ | ==Alle Werte ausgeben und nur einen anpassen und als Bild ausgeben (Taxonomie mit verlinkten Icons) == | ||
+ | Ähnlich wie im obigen Beispiel wird hier eine Spalte so angepasst, dass die Taxonomie IDs gegen Icons getauscht werden (auch ideal für Immobilien, Ferienwohnungen). | ||
+ | |||
+ | Zunächst wird abgefragt, welches Katalogfeld seperat behandelt wird <nowiki><?php if($field=='tags'): ?></nowiki>. Zwischen den Kommentaren werden zunächst zum einfacheren Vorgehen die (verlinkten) Icons in eine Variable gespeichert ($icons) und darunter mittels foreach das Puffer-Array angesprochen und ausgegeben. Dadurch lassen sich auch Tageinträge größer eins verarbeiten: | ||
+ | <source lang="php"> | ||
+ | <?php foreach ($entry['data'] as $field=>$data): ?> | ||
+ | <td class="field <?php echo $field; ?>"> | ||
+ | <?php if($field=='tags'): ?> | ||
+ | <!------------------ ANFANG ------------------> | ||
+ | <?php | ||
+ | $icons=array( | ||
+ | // Schema: 'id' => 'zu generierender html code', | ||
+ | '2' => '<a href="#" title="eins"><img src="tl_files/eins.gif" alt="eins" /></a>', | ||
+ | '3' => '<a href="#" title="eins"><img src="tl_files/zwei.gif" alt="zwei" /></a>', | ||
+ | '4' => '<a href="#" title="eins"><img src="tl_files/drei.gif" alt="drei" /></a>' | ||
+ | ); | ||
+ | foreach($data['ref'] as $info) | ||
+ | echo $icons[$info['id']]; | ||
+ | ?> | ||
+ | <!------------------ ENDE ------------------> | ||
+ | <?php elseif(!in_array($field, array('catalog_name','parentJumpTo'))): ?> | ||
+ | <div class="value"><?php echo $data['value']; ?></div> | ||
+ | <?php endif; ?> | ||
+ | </td> | ||
+ | <?php endforeach; ?> | ||
+ | </source> | ||
− | == | + | ==Zeilenumbrüche in Texten von textarea Feldern als HTML Umbrüche im Template ausgeben== |
+ | Ist ein Feld vom Typ textarea, kann man dort Zeilenumbrüche eingeben und speichern. Diese werden im Frontend aber nicht angezeigt. | ||
+ | Mit folgendem Befehl werden die Umbrüche in HTML umgewandelt und damit im Frontend sichtbar. Den Code einfach vor der Ausgabe des description Feldes einfügen. | ||
+ | <source lang="php"> | ||
+ | // replace new line feed \n (0x0A) in description field by HTML line break <br/> | ||
+ | $entry['data']['description']['value'] = str_replace("\xa", "<br/>", $entry['data']['description']['value']); | ||
+ | </source> | ||
− | [ | + | ==Zeichenanzahl von Texten begrenzen== |
+ | Zu lange Textpassagen lassen sich mit folgendem Code ganz einfach auf die gewünschte Länge begrenzen. | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | if(strlen($entry['data']['description']['value']) >= 20) | ||
+ | { | ||
+ | $entry['data']['description']['value'] = wordwrap($entry['data']['description']['value'], 20); //Zeilenumbruch einfügen spätestens nach 20 Zeichen | ||
+ | $entry['data']['description']['value'] = substr($entry['data']['description']['value'], 0, strpos($entry['data']['description']['value'], "\n")).'...'; //bei Zeilenumbruch Text abschneiden | ||
+ | } | ||
+ | echo $entry['data']['description']['value']; | ||
+ | ?> | ||
+ | </source> | ||
+ | Oder man benutzt die Methoden String::wordWrap(), String::substr(), String::substrHtml() aus Contao. | ||
− | --- | + | ==Links zu weiteren Beispielen== |
+ | Im englischen Catalog-Wiki: | ||
+ | [http://code.google.com/p/typolight-catalog/wiki/EN_CatalogTemplatesTutorial http://code.google.com/p/typolight-catalog/wiki/EN_CatalogTemplatesTutorial] | ||
− | + | Im Forum: | |
+ | [http://www.contao-community.de/showthread.php?10335-Berufs-und-Ausstellerverzeichnis-kombinieren&p=74438#post74438 Zwei Kataloge im Template verbinden] |
Aktuelle Version vom 17. August 2012, 15:14 Uhr
betrifft | |
---|---|
TYPOlight Version | ab 2.8 |
Contao Version | ab 2.9 |
Extensions | Catalog ab 2.0beta1 |
Inhaltsverzeichnis
- 1 Templates für den Catalog bearbeiten und verändern
- 2 Grundlagen
- 3 Beispiele
- 3.1 Einfache Überprüfung ob Inhalt vorhanden ist
- 3.2 Wie man in eigenen Templates beim Katalog Thumbnails generieren kann
- 3.3 Fortlaufende Nummerierung der einzelnen Einträge in einer Liste
- 3.4 Kategorien einmalig ausgeben und die Items darunter
- 3.5 Fortlaufende Nummern für die Zellen im Katalog
- 3.6 Eine Bildergalerie erstellen, wo nur das 1. Bild ausgegeben wird und die anderen in der Lightbox vorhanden sind
- 3.7 Referenzen ohne des Referenzmodul
- 3.8 Alle Werte ausgeben und nur einen anpassen (als Beispiel Bilder mit eigener Beschreibung)
- 3.9 Wert nur ausgeben, wenn Mitglied in einer bestimmten Gruppe ist
- 3.10 Alle Werte ausgeben und nur einen anpassen und als Bild ausgeben (Taxonomie mit verlinkten Icons)
- 3.11 Zeilenumbrüche in Texten von textarea Feldern als HTML Umbrüche im Template ausgeben
- 3.12 Zeichenanzahl von Texten begrenzen
- 3.13 Links zu weiteren Beispielen
Templates für den Catalog bearbeiten und verändern
Der Catalog bringt eine Menge Templates mit. Für fast jedes Modul gibt es einen eigenen Satz Templates. Zusätzlich werden Standard-Templates herangezogen, um zum Beispiel die Galerie oder die Filter zu generieren.
Da der Catalog aber nur ein Grundgerüst darstellt, wird man nicht umhin kommen sich die Templates nach eigenen Wünschen und Vorstellungen anzupassen. Zunächst geht es hier ganz allgemein um das Vorgehen bei der Template-Anpassung. Wie man an bestimmte Werte kommt und so an die Ausgaben, die man möchte. Zusätzlich werden hier noch Fallbeispiele vorgestellt, die zum Teil aus den Wünschen/Problemen im Forum entstanden sind (Vielen Dank an alle die daran im Forum gearbeitet haben!!!).
Voraussetzungen für das Tutorial
- der Umgang mit Contao sollte bekannt sein.
- wie man Templates bearbeitet sollte in Grundzügen bekannt sein.
- wie ein Katalog erstellt wird sollte von anderen Tutorials klar sein. Es sollte also ein Katalog mit Inhalten vorhanden sein.
Grundlagen
Alles ein Array: das entries-Array
Um sich die Ausgabe des Arrays anzuschauen, braucht man nur diese Zeile in das Template bringen:
<?php print_r($this->entries); ?>
Wenn man sich das Ergebnis nun auf der neu geladenen Seite anschaut, ist das nicht gerade schön anzusehen. Alles steht hintereinander und ergibt einen Code-Brei. Deswegen sollte man sich das am Besten immer direkt in der Quellcode-Ansicht anschauen. Da bekommt man alles schön eingerückt und verschachtelt zu sehen! Oder man setzt die Ausgabe in ein <pre>-Tag.
Auszug aus einem Immobilien-Katalog:
Array ( [0] => Array ( [id] => 33 [catalog_name] => Immobilien [parentJumpTo] => 27 [tablename] => immo_immobilien_alle [showLink] => 1 [class] => first last even [data] => Array ( [immo_titel] => Array ( [label] => Titel [type] => text [raw] => villa in tunesien [value] => villa in tunesien ) [immo_gebiet] => Array ( [label] => Gebiet [type] => select [raw] => 141 [value] => Beja [ref] => Array ( [0] => Array ( [id] => 141 [pid] => 130 [tstamp] => 1273353133 [sorting] => 112 [type] => [alias] => beja [name] => Beja ) ) ) ... [immo_bild] => Array ( [label] => Bild - nur für das erste Bild (Ein Bild für die Vorschau / maximale Dateigröße: 2MB / maximale Maße in px: 800x600) [type] => file [raw] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/bild_01.jpg [value] => <a href="immobilien-leser/items/miethaus-1.html" title="Die Details des Eintrags ansehen"><span class="image first even"><a rel="lightbox[lbimmo_immobilien_allecatalogrelated0]" href="tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/bild_01.jpg" title="Bild 01"><img src="system/html/bild_01-0ec9b6d1.jpg" alt="Bild 01" width="200" height="100" /></a></span></a> [files] => Array ( [0] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/bild_01.jpg ) [meta] => Array ( [0] => Array ( [src] => system/html/bild_01-0ec9b6d1.jpg [alt] => Bild 01 [lb] => lbcatalogrelated0 [w] => 200 [h] => 100 [wh] => width="200" height="100" [caption] => [metafile] => ) ) ) [immo_bildergalerie] => Array ( [label] => Bildergalerie - alle anderen Bilder (für die Detail Ansicht / maximale Dateigröße: 2MB / maximale Maße in px: 800x600) [type] => file [raw] => a:4:{i:0;s:103:"tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/how 2 rubbeldiekatz.jpg";i:1;s:89:"tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/image.png";i:2;s:99:"tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/institut-aussen.jpg";i:3;s:96:"tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/james-wilson.jpg";} [value] => <span class="image first even"><a rel="lightbox[lbimmo_immobilien_allecatalogreader0]" href="tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/how 2 rubbeldiekatz.jpg" title="How 2 rubbeldiekatz"><img src="system/html/how 2 rubbeldiekatz-0d26e104.jpg" alt="How 2 rubbeldiekatz" width="50" height="50" /></a></span><span class="image odd"><a rel="lightbox[lbimmo_immobilien_allecatalogreader0]" href="tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/image.png" title="Image"><img src="system/html/image-6a4159ed.png" alt="Image" width="50" height="50" /></a></span><span class="image even"><a rel="lightbox[lbimmo_immobilien_allecatalogreader0]" href="tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/institut-aussen.jpg" title="Institut-aussen"><img src="system/html/institut-aussen-538b1b35.jpg" alt="Institut-aussen" width="50" height="50" /></a></span><span class="image odd"><a rel="lightbox[lbimmo_immobilien_allecatalogreader0]" href="tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/james-wilson.jpg" title="James-wilson"><img src="system/html/james-wilson-379f0b97.jpg" alt="James-wilson" width="50" height="50" /></a></span> [files] => Array ( [0] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/how 2 rubbeldiekatz.jpg [1] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/image.png [2] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/institut-aussen.jpg [3] => tl_files/usertreffen2010/immo/tunesien-immobilie_cat_items/immo_immobilien_alle/james-wilson.jpg ) [meta] => Array ( [0] => Array ( [src] => system/html/how 2 rubbeldiekatz-0d26e104.jpg [alt] => How 2 rubbeldiekatz [lb] => lbcatalogreader0 [w] => 50 [h] => 50 [wh] => width="50" height="50" [caption] => [metafile] => ) [1] => Array ( [src] => system/html/image-6a4159ed.png [alt] => Image [lb] => lbcatalogreader0 [w] => 50 [h] => 50 [wh] => width="50" height="50" [caption] => [metafile] => ) [2] => Array ( [src] => system/html/institut-aussen-538b1b35.jpg [alt] => Institut-aussen [lb] => lbcatalogreader0 [w] => 50 [h] => 50 [wh] => width="50" height="50" [caption] => [metafile] => ) [3] => Array ( [src] => system/html/james-wilson-379f0b97.jpg [alt] => James-wilson [lb] => lbcatalogreader0 [w] => 50 [h] => 50 [wh] => width="50" height="50" [caption] => [metafile] => ) ) ) ... [immo_sterne] => Array ( [label] => Sterne (Wie viele Sterne hat das Hotel) [type] => number [raw] => [value] => ) ...
Das ist nur ein kleiner Auszug aus der Ausgabe. In dieser Ausgabe stehen verschiedene Dinge:
Am Anfang stehen immer die Grundinformationen (id, catalog_name, parentJumpTo, tablename,showLink, class). Die werden in der Regel nicht gebraucht, sind aber gut zu wissen, damit man mal kurz schauen kann, ob man überhaupt richtig ist ;)
Alle Variablen die man bekommt stehen immer im Array [data]. Um an die einzelnen Werte zu kommen, braucht man nur die Arrays des betreffenden Wertes nach oben hin durchzugehen.
Beispiel: Den Titel der Immobilie als Überschrift ausgeben:
<h3><?php echo $entry['data']['immo_titel']['value']; ?></h3>
Das value 'villa in tunesien' soll ausgegeben werden. Dieses befindet sich im Array ['immo_titel'], und das ist im Array ['data']. So einfach bekommt man einzelne Werte ausgegeben.
Die Bestandteile der Arrays
Die Arrays in so einer Ausgabe sind immer gleich aufgebaut. Je nach Feldtyp etwas anders.
Standard-Informationen
- [class] => die CSS-Klassen des Items (eher wichtig in einer Liste, da man dort zum Beispiel even/odd zur Verfügung hat)
- [link] => die URL der Leser Seite (auch eher listenspezifisch)
- [url] => enthält nur die URL des Links. Damit kann man seine eigenen Links bauen
- [data] => hier sind alle Felder drin
Allgemeine Parameter
Jedes Feld hat immer diese 4 Parameter:
- [label] => enthält das Label, das im Katalog vergeben wurde
- [type] => enthält den Feldtyp. Zum Beispiel: text, file, select, tags
- [raw] => enthält die Originaldaten direkt aus der Datenbank. Hiermit kann man immer komplett eigene Ausgaben gestalten
- [value] => enthält die vorformatierten Daten (bei einem Textfeld den formatierten String, bei einem Datei-download den download-Link, ..)
Spezielle Parameter
Je nach Feldtyp folgen noch spezielle Parameter:
- [files] => beinhaltet ein Array -> [0] ... [n] mit Dateinamen
- [meta] => beinhaltet meta-Angaben
- Wenn es sich um eine Datei handelt (kein Bild) wird das meta-Array diese Werte enthalten:
- [url] => die relative URL zum herunterladen
- [alt] => den alt-Text
- [caption] => die Beschreibung in der meta.txt-Datei
- [size] => die Größe in Byte
- [sizetext] => die Größe in lesbarer Form (z.B. 230.0 kB)
- [icon] => das Icon (Gesetzt wird der Standard vom System selber, basierend auf den Mime-Typen.)
- Wenn es sich um ein Bild handelt, wird das meta-Array diese Werte enthalten:
- [src] => den Dateinamen des Bildes in angepasster Größe (falls es im Katalog selbst so benutzt wird)
- [alt] => Den alt-Text
- [lb] => die einzigartige REL=lightbox-ID damit die Slimbox angesteuert werden kann
- [w] => die Breite des Bildes
- [h] => die Höhe des Bildes
- [wh] => Bild width/height in einem String
- [ref] => beinhaltet referenzierende Tabellen
- [parentJumpTo] => die ID des referenzierenden Katalogs (kann in Inserttags genutzt werden)
- [parentLink] => Der komplette Link mit dem Standard Text "View item details"
- [parentUrl] => Die relative URL zu der Detail-/Leser-Seite
Beispiele
Einfache Überprüfung ob Inhalt vorhanden ist
Es gibt immer wieder einzelne Felder die nur optional zu befüllen sind. Wenn man die Ausgabe von einem Div nur machen möchte wenn auch Inhalte vorhanden sind, kann man das einfach mit einer if-Abfrage erledigen:
<?php if($entry['data']['immo_bildergalerie']['value']):?> <div class="immo_galerie"><?php echo $entry['data']['immo_bildergalerie']['value']; ?></div> <?php endif;?>
In dem Beispiel wird die Bildergalerie mit dem umschließenden div nur dann ausgegeben wenn auch mindestens ein Bild vorhanden ist.
Wie man in eigenen Templates beim Katalog Thumbnails generieren kann
Thumbnails werden in Contao mit der Methode Controller::getImage() generiert. Wichtig dabei ist, dass nicht der ganze Code des Bildes zurückgegeben wird, sondern lediglich die URL zum Thumbnail.
Die Methode sieht wie folgt aus:
getImage($image, $width, $height, $mode='', $target=null)
Die Parameter erklären sich wie folgt:
- $image (String) zwingend
- erwartet eine relative URL zum Bild, dass verkleinert werden soll (z.B. 'tl_files/meine_bilder/mein_bild.jpg')
- $width (Integer) bedingt optional (Achtung: mind. eine Angabe zu Breite oder Höhe ist zwingend!)
- erwartet eine Zahl, die die Breite in Pixel angibt (z.B. 230)
- $height (Integer) bedingt optional (Achtung: mind. eine Angabe zu Breite oder Höhe ist zwingend!)
- erwartet eine Zahl, die die Breite in Pixel angibt (z.B. 230)
- $mode (String) optional (weitergehende Informationen auf dem offiziellen Contao-Blog)
- erwartet einen Angabe darüber, wie das Bild behandelt werden soll. Möglich sind:
- '' (Exaktes Format) - default
- 'proportional' (Proportional)
- 'box' (An Rahmen anpassen)
- erwartet einen Angabe darüber, wie das Bild behandelt werden soll. Möglich sind:
- $target (String) optional
- erwartet eine relative URL zu einem Bild, dass ersetzt werden soll (z.B. 'tl_files/meine_bilder/mein_zu_ersetzendes_bild.jpg')
Ein Beispiel für ein Template mit einem Thumbnail von 430px Breite und 300px Höhe, das proportional geparst werden soll, könnte also so aussehen:
<img src="<?php echo $this->getImage('tl_files/meine_bilder/mein_bild.jpg',430,300,'proportional'); ?>" alt="Mein alt-Text für mein Bild" />
Fortlaufende Nummerierung der einzelnen Einträge in einer Liste
Die Paginierung wurde berücksichtigt:
<?php $perpage=3 $index=0 foreach ($this->entries as $entry): <$index++ if (isset($_GET['page'])): $number = $index + ($perpage * ($_GET['page'] - 1)) else: $number = $index endif; ... endforeach; ?>
Wobei $perpage die Anzahl der Items enhält, die pro Seite ausgegeben werden.
Kategorien einmalig ausgeben und die Items darunter
Beispiel anhand eines modifizierten catalog_simple.tpl:
<?php if (count($this->entries)): $lastcat=''; ?> <div class="layout_simple"> <?php foreach ($this->entries as $entry): if ($lastcat!=$entry[data]['Kategorie']['value']): $lastcat=$entry[data]['Kategorie']['value']; ?> <div class="cat"><?php echo $entry[data]['Kategorie']['value']; ?></div> <?php endif; ?> <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> <?php foreach ($entry['data'] as $field=>$data): if ($field=='Kategorie') continue; if (!in_array($field, array('catalog_name','parentJumpTo'))): ?> <div class="field <?php echo $field; ?>"> <div class="label"><?php echo $data['label']; ?></div> <div class="value"><?php echo $data['value']; ?></div> </div> <?php endif; endforeach; if ($entry['showLink'] && $entry['link']): ?> <div class="link"><?php echo $entry['link']; ?></div> <?php endif; if ($entry['linkEdit']): ?> <div class="linkEdit"><?php echo $entry['linkEdit']; ?></div> <?php endif; ?> </div> <?php endforeach; ?> </div> <?php else: if ($this->condition): ?> <div class="condition"><?php echo $this->condition; ?></div> <?php else: ?> <p class="info">There are no entries matching your search.</p> <?php endif; endif; ?>
Fortlaufende Nummern für die Zellen im Katalog
Am Beispiel von einem simpletable.tpl
<table class="layout_simpletable" summary="Catalog Items" cellspacing="0" cellpadding="0"> <thead class="header"> <tr> <?php list($field, $heading) = each($this->entries); $i = 0; foreach ($heading['data'] as $field=>$data): $i++; if (!in_array($field, array('catalog_name','parentJumpTo'))): ?> <th class="header<?php echo $i; ?>"><?php echo $data['label']; ?></th> <?php endif; endforeach; ?> </tr> </thead> <tbody class="body<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> <?php foreach ($this->entries as $entry): $n++ ?> <tr class="item<?php echo $n; ?><?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> <?php foreach ($entry['data'] as $field=>$data): $k++; if (!in_array($field, array('catalog_name','parentJumpTo'))): ?> <td class="field <?php echo $field; ?><?php echo $k; ?>"> <?php if (strlen($data['value'])): if ($entry['url'] && $field == 'title'): ?><a href="<?php echo $entry['url']; ?>"> <?php endif; echo $data['value']; if ($entry['url'] && $field == 'title'): ?></a> <?php endif; endif; ?> </td> <?php endif; endforeach; ?> </tr> <?php endforeach; ?> </tbody> </table>
Eine Bildergalerie erstellen, wo nur das 1. Bild ausgegeben wird und die anderen in der Lightbox vorhanden sind
HTML: Die Ausgabe sollte ungefähr so aussehen:
<a href="tl_files/image01.jpg" title="bla" rel="lightbox[lightbox_1]"><img src="tl_files/image01.jpg" alt="bla" /></a> <a href="tl_files/image02.jpg" title="bla" rel="lightbox[lightbox_1]"></a>
Das 1. Bild mit Vorschaubild und die anderen Bilder nur als Link, damit diese ausgegeben werden, aber erst mal nix zu sehen ist.
Es gibt da ja im Grunde 2 Herangehensweisen: 1. Im Backend gibt man 1 Bild an und dann noch mehrere Bilder als Galerie (so hat man die volle Kontrolle darüber welches das Vorschaubild ist) 2. Man gibt nur eine Bildergalerie an.
Template (Grundüberlegung): 1. Grundüberlegung der Ausgabe allgemein:
<?php if($entry['data']['einzelbild']['meta']):?> <div class="bilder"> <strong><?php echo $entry['data']['einzelbild']['value']; ?></strong> <?php if($entry['data']['bildergalerie']['value']):?><?php echo $entry['data']['bildergalerie']['value']; ?><?php endif;?> </div> <?php endif;?>
2. Grundüberlegung der Ausgabe allgemein:
<?php if($entry['data']['bildergalerie']['value']):?> <div class="bilder"> <?php echo $entry['data']['bildergalerie']['value']; ?> </div> <?php endif;?>
Damit hat man einfach nur die normale Galerie. Das wäre für diesem Fall ja nicht passend; sei an dieser Stelle jedoch noch mal dokumentiert sein.
Um das jetzt zu verbinden, gibt es verschiedene Vorgehensweisen: 1.
<?php if($entry['data']['einzelbild']['meta']):?> <div class="bilder"> <strong><?php echo $entry['data']['einzelbild']['value']; ?> <a href="<?php echo $entry['data']['einzelbild']['files']['0'];?>" title="bla" rel="lightbox[lightbox_1]"><img src="<?php echo $entry['data']['einzelbild']['meta']['0']['src'];?>" alt="bla" /></a> </strong> <?php if($entry['data']['bildergalerie']['value']):?> <?php foreach ($entry['bildergalerie']['value'] as $field=>$data): ?> <a href="<?php echo $entry['bildergalerie']['value']['meta'][$field]['src'] ?>" title="bla" rel="lightbox[lightbox_1]" ></a> <?php endforeach; ?> <?php endif;?> </div> <?php endif;?>
2. Für das 1. Bild (in Array ja die 0 eine andere Ausgabe machen):
<?php if($entry['data']['bildergalerie']['value']):?> <?php foreach ($entry['bildergalerie']['value'] as $field=>$data): ?> <?php if(($entry['bildergalerie']['value']['meta'][$field])=='0'):?> <a href="<?php echo $entry['data']['einzelbild']['files']['0'];?>" title="bla" rel="lightbox[lightbox_1]"><img src="<?php echo $entry['bildergalerie']['value']['meta'][$field]['src'] ?>" alt="bla" /></a> <?php else;?> <a rel="lightbox[lightbox_1]" href="<?php echo $entry['bildergalerie']['value']['meta'][$field]['src'] ?>" title="bla"></a> <?php endif;?> <?php endforeach; ?> <?php endif;?>
Referenzen ohne des Referenzmodul
Will man referenzierte Werte aus einem weiteren Katalog darstellen, ohne das Referenzmodul zu benutzen, kann man auch die Templates der anderen Module anpassen. Referenzfelder sind immer innerhalb des Arrays [ref], hier ein Beispiel aus einem Kontakte-Katalog mit referenzierter Firma:
[data] => Array ( [name] => Array ( [label] => Vorname [type] => text [raw] => Bubble [value] => Bubble ) [firma] => Array ( [label] => Firma [type] => select [raw] => 9 [value] => Rainbow Islands [ref] => Array ( [1] => Array ( [id] => 9 [pid] => 3 [sorting] => 8 [tstamp] => 1329215904 [firmenname] => Rainbow Islands [bereich] => 8 [status] => 2 [webseite] => bubblebobble.islands [land] => 15 [info] => Jump 'n' run! [parentJumpTo] => 0 [parentLink] => View the item details [parentUrl] => kontakte-reader/items/9 ) ) )
Dem Kontakt ist über ein Auswahlfeld eine Firma aus einem weiteren Katalog zugeordnet. In dem Firmenkatalog findet man einfache Textfelder (firmenname, webseite, info) und Werte, die selbst wiederum aus einer Taxonomie oder einem anderen Katalog gewählt wurden und deshalb nur mit ihrer id angezeigt werden (bereich, status, land). Um die einfach bezogenen Werte einzubinden, reicht eine zusätzliche Abfrage des 'ref'-Arrays. Um die weiter referenzierten Werte auszugeben, muss man allerdings eine Datenbank-Abfrage starten.
Die beiden Optionen als Beispiel:
zusätzliche Schleife über das 'ref'-Array:
<?php if (count($this->entries)): ?> <div class="layout_full"> <?php foreach ($this->entries as $entry): ?> <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> <?php if($entry['linkEdit']): ?><?php echo $entry['linkEdit']; ?><?php endif; ?> <?php foreach ($entry['data'] as $field=>$data): ?> <?php if (strlen($data['raw']) && !in_array($field, array('catalog_name','parentJumpTo'))): ?> <div class="field <?php echo $field; ?>"> <div class="label"><?php echo $data['label']; ?></div> <div class="value"><?php echo $data['value']; ?></div> <!-- zusätzliche Abfrage--> <?php if (array_key_exists('ref', $data)): ?> <?php foreach ($data['ref'] as $ref): ?> <div class="label">Web</div> <div class="value"><?php echo $ref['webseite']; ?></div> <div class="label">Info</div> <div class="value"><?php echo $ref['info']; ?></div> <?php endforeach; ?> <?php endif; ?> <!-- zusätzliche Abfrage--> </div> <?php endif; ?> <?php endforeach; ?> </div> <?php endforeach; ?> </div> <?php else: ?> <p class="info"><?php echo $this->noItemsMsg; ?></p> <?php endif; ?>
Datenbankabfrage:
<?php if (count($this->entries)): ?> <div class="layout_full"> <?php foreach ($this->entries as $entry): ?> <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>"> <?php if($entry['linkEdit']): ?><?php echo $entry['linkEdit']; ?><?php endif; ?> <?php foreach ($entry['data'] as $field=>$data): ?> <?php if (strlen($data['raw']) && !in_array($field, array('catalog_name','parentJumpTo'))): ?> <div class="field <?php echo $field; ?>"> <div class="label"><?php echo $data['label']; ?></div> <div class="value"><?php echo $data['value']; ?></div> <!-- DB-Abfrage--> <?php if (array_key_exists('ref', $data)): ?> <?php foreach ($data['ref'] as $ref): ?> <div class="label">Status</div> <div class="value"> <?php $this->import('Database'); $objData = $this->Database->prepare("SELECT name FROM tl_taxonomy WHERE id=?")->execute($ref['status']); echo $objData->name; ?> </div> <div class="label">Land</div> <div class="value"> <?php $this->import('Database'); $objData = $this->Database->prepare("SELECT name FROM tl_taxonomy WHERE id=?")->execute($ref['land']); echo $objData->name; ?> </div> <?php endforeach; ?> <?php endif; ?> <!-- DB-Abfrage--> </div> <?php endif; ?> <?php endforeach; ?> </div> <?php endforeach; ?> </div> <?php else: ?> <p class="info"><?php echo $this->noItemsMsg; ?></p> <?php endif; ?>
Beides kann man dann natürlich auch kombinieren. Weitere Beispiele gibt's auch im Forum: [1]
Alle Werte ausgeben und nur einen anpassen (als Beispiel Bilder mit eigener Beschreibung)
Hier ein Auszug wie bei dem Feld beispiel_bild der gewünschte Code ausgegeben wird und ansonsten die Werte einfach normal vom Catalog ausgegeben werden.
<?php foreach ($entry['data'] as $field=>$data): ?> <div class="field <?php echo $field; ?>"> <?php if($field=='beispiel_bild'):?> {{image::<?php echo $data['files']['0']; ?>?width=<?php echo $data['meta']['0']['w']; ?>&height=<?php echo $data['meta']['0']['h']; ?>&alt=<?php echo $data['value']; ?>&mode=crop&rel=lightbox}} <?php elseif(!in_array($field, array('catalog_name','parentJumpTo'))):?> <div class="label"><?php echo $data['label']; ?></div> <div class="value"><?php echo $data['value']; ?></div> <?php endif; ?> </div> <?php endforeach; ?>
Wert nur ausgeben, wenn Mitglied in einer bestimmten Gruppe ist
<?php $this->import('FrontendUser', 'User'); if (in_array(2, $this->User->groups)): ?> <span>Meine Ausgabe</span> <?php endif; ?>
Zunächst müssen die Werte vom Frontend-User importiert werden. Danach kann man abfragen, ob die ID (in diesem Fall die 2) in dem Array vorkommt und dann eine Ausgabe machen. So kann man mit einem Template die Ausgabe für mehrere Gruppen individualisieren.
Alle Werte ausgeben und nur einen anpassen und als Bild ausgeben (Taxonomie mit verlinkten Icons)
Ähnlich wie im obigen Beispiel wird hier eine Spalte so angepasst, dass die Taxonomie IDs gegen Icons getauscht werden (auch ideal für Immobilien, Ferienwohnungen).
Zunächst wird abgefragt, welches Katalogfeld seperat behandelt wird <?php if($field=='tags'): ?>. Zwischen den Kommentaren werden zunächst zum einfacheren Vorgehen die (verlinkten) Icons in eine Variable gespeichert ($icons) und darunter mittels foreach das Puffer-Array angesprochen und ausgegeben. Dadurch lassen sich auch Tageinträge größer eins verarbeiten:
<?php foreach ($entry['data'] as $field=>$data): ?> <td class="field <?php echo $field; ?>"> <?php if($field=='tags'): ?> <!------------------ ANFANG ------------------> <?php $icons=array( // Schema: 'id' => 'zu generierender html code', '2' => '<a href="#" title="eins"><img src="tl_files/eins.gif" alt="eins" /></a>', '3' => '<a href="#" title="eins"><img src="tl_files/zwei.gif" alt="zwei" /></a>', '4' => '<a href="#" title="eins"><img src="tl_files/drei.gif" alt="drei" /></a>' ); foreach($data['ref'] as $info) echo $icons[$info['id']]; ?> <!------------------ ENDE ------------------> <?php elseif(!in_array($field, array('catalog_name','parentJumpTo'))): ?> <div class="value"><?php echo $data['value']; ?></div> <?php endif; ?> </td> <?php endforeach; ?>
Zeilenumbrüche in Texten von textarea Feldern als HTML Umbrüche im Template ausgeben
Ist ein Feld vom Typ textarea, kann man dort Zeilenumbrüche eingeben und speichern. Diese werden im Frontend aber nicht angezeigt. Mit folgendem Befehl werden die Umbrüche in HTML umgewandelt und damit im Frontend sichtbar. Den Code einfach vor der Ausgabe des description Feldes einfügen.
// replace new line feed \n (0x0A) in description field by HTML line break <br/> $entry['data']['description']['value'] = str_replace("\xa", "<br/>", $entry['data']['description']['value']);
Zeichenanzahl von Texten begrenzen
Zu lange Textpassagen lassen sich mit folgendem Code ganz einfach auf die gewünschte Länge begrenzen.
<?php if(strlen($entry['data']['description']['value']) >= 20) { $entry['data']['description']['value'] = wordwrap($entry['data']['description']['value'], 20); //Zeilenumbruch einfügen spätestens nach 20 Zeichen $entry['data']['description']['value'] = substr($entry['data']['description']['value'], 0, strpos($entry['data']['description']['value'], "\n")).'...'; //bei Zeilenumbruch Text abschneiden } echo $entry['data']['description']['value']; ?>
Oder man benutzt die Methoden String::wordWrap(), String::substr(), String::substrHtml() aus Contao.
Links zu weiteren Beispielen
Im englischen Catalog-Wiki: http://code.google.com/p/typolight-catalog/wiki/EN_CatalogTemplatesTutorial
Im Forum: Zwei Kataloge im Template verbinden