Catalog Templates anpassen

Aus Contao Community Documentation

betrifft
TYPOlight Version ab 2.8
Contao Version ab 2.9
Extensions Catalog ab 2.0beta1

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 ein paar Fallbeispiele vorgestellt, welche 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

  • wie ein Katalog erstellt wird sollte von anderen Tutorials klar sein. Es sollte also ein Katalog vorhanden sein mit Inhalten.
  • der Umgang mit Contao sollte bekannt sein
  • wie man Templates bearbeitet sollte in Grundzügen bekannt sein.

Grundlagen

Alles ein Array das entries Array

Um sich die Ausgabe von dem Array anzuschauen braucht man nur diese Zeile in das Template bringen:

<?php print_r($this->entries); ?>

Wenn man sich das Ergebniss 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 Immoblilien 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 stehten 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 in dem Array data Um an die einzelnen Werte zu kommen, braucht man nur die Arrays von dem Wert durchzugehen bis nach oben.

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, welches sich in dem Array 'immo_titel' befindet und das ist in dem Array 'data'. So einfach bekommt man einzelne Werte ausgegeben.

Die Bestandteile der meta-Arrays

Die Arrays in so einer Ausgabe sind immer gleich aufgebaut. Je nach Feldtyp etwas anders.

Die 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 Listen spezifisch)
  • url -> enthält nur die URL von dem Link. Damit kann man seine eigenen Links bauen.
  • data -> Hier sind alle Felder drin.

Die allgemeinen Parameter

Jedes Feld hat immer diese 4 Parameter:

   * [label] => Enthält das Label welches im Katalog vergeben wurde
   * [type] => Enthält den Feldtyp. Zum Beispiel: text, file, select, tags
   * [raw] => Enthält die Original Daten direkt aus der Datenbank. Hiermit kann man immer komplett eigene Ausgaben gestalten.
   * [value] => Enthält die vorformatierten Daten: Datei-Bild Feld => Bild Lightbox, Datei-download => den download Link, Text Feld => der Formatierte String (numeric, date, etc.) 

Die speziellen Parameter

Dateien

  • [files] => Beinhaltet ein Array -> [0] .. [xxx] mit den Dateinamen
  • [meta] => Beinhaltet die meta-Angaben, wie oben genannt

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 von dem Bild in angepasster größe (wenn das benutzt wird im Katalog selber)
  • [alt] => Den alt-Text
  • [lb] => die einzigartige REL=lightbox ID damit die Slimbox angesteuert werden kann
  • [w] => Bild width
  • [h] => Bild height
  • [wh] => Bild width/height in einem String


Bei einer referenzierenden Tabelle können noch folgende Inhalte vorhanden sein:

  • [parentJumpTo] => die ID von dem referenzierenden Katalog (kann in Inserttags genutzt werden)
  • [parentLink] => Der komplette Link mit einem Standard Text "View item details"
  • [parentUrl] => Die relative URL zu der Detail (Leser) Seite

Beispiel Anpassungen

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 TYPOlight-Blog)
    • erwartet einen Angabe darüber, wie das Bild behandelt werden soll. Möglich sind:
      • '' (Exaktes Format) - default
      • 'proportional' (Proportional)
      • 'box' (An Rahmen anpassen)
  • $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 ?>
<?php $index=0 ?>
<?php foreach ($this->entries as $entry): ?>
  <?php $index++ ?>
  <?php if (isset($_GET['page'])): ?>
    <?php $number = $index + ($perpage * ($_GET['page'] - 1)) ?>
  <?php else: ?>
    <?php $number = $index ?>
  <?php endif; ?>
  ...
<?php 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)): ?>
<?php $lastcat=''; ?>
<div class="layout_simple">
<?php foreach ($this->entries as $entry): ?>
<?php if ($lastcat!=$entry[data]['Kategorie']['value']): ?>
<?php $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): ?>
<?php if ($field=='Kategorie') continue; ?>
<?php 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; ?>
<?php endforeach; ?>

<?php if ($entry['showLink'] && $entry['link']): ?>
<div class="link"><?php echo $entry['link']; ?></div>
<?php endif; ?>
<?php if ($entry['linkEdit']): ?>
<div class="linkEdit"><?php echo $entry['linkEdit']; ?></div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
<?php else: ?>
<?php 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; ?>

<?php 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); ?>
<?php $i = 0; ?>
<?php foreach ($heading['data'] as $field=>$data): ?>
<?php  $i++; ?>
<?php if (!in_array($field, array('catalog_name','parentJumpTo'))): ?>
<th class="header<?php echo $i; ?>"><?php echo $data['label']; ?></th>
<?php endif; ?>
<?php endforeach; ?>
</tr>
</thead>
<tbody class="body<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>">
<?php foreach ($this->entries as $entry): ?>
<?php $n++ ?>
<tr class="item<?php echo $n; ?><?php echo $entry['class'] ? '  '.$entry['class'] : ''; ?>">
<?php foreach ($entry['data'] as $field=>$data): ?>
<?php  $k++; ?>
<?php if (!in_array($field, array('catalog_name','parentJumpTo'))): ?>
<td class="field <?php echo $field; ?><?php echo $k; ?>">
<?php if (strlen($data['value'])): ?>
<?php if ($entry['url'] && $field == 'title'): ?><a href="<?php echo $entry['url']; ?>">
<?php endif; ?>
<?php echo $data['value']; ?>
<?php if ($entry['url'] && $field == 'title'): ?></a>
<?php endif; ?>
<?php endif; ?>
</td>
<?php endif; ?>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>


Eine Bildergalerie erstellen, wo nur das 1. Bild ausgegeben wird und die anderen in der Lightbox vorhanden sind

Achtung.png Achtung: diese beiden Herangehensweisen sind noch ungetestet.


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;?>

2 Katalog referenzieren

Hier im Forum ist die Herangehensweise beschrieben, wie man das machen kann ohne mit Referenzen aus catalog 2 zu arbeiten: [1]

Hier noch ein kurzes Beispiel wie das gehen kann:

In dem Catalog Leser von einem Autoren sollen die Bücher dargestellt werden (diese sind mit dem Feldtyp Tags referenziert). Die Bücher sind in dem Fall innerhalb des Array 'ref':

<?php foreach ($data['ref'] as $id=>$ref): ?>
		
		<div class="row_<?php echo $id; ?> buch <?php if($ref['bilder_buch']) echo "buch_mitbild";?>">
....
<?php endforeach; ?>

Weitere Beispiele finden sich im engl. Wiki vom Catalog

[2]


--MacKP 21:44, 21. Mai 2010 (UTC)

Ansichten
Meine Werkzeuge

Contao Community Documentation

God: "what is your job?"
me: "i am a software developer ... i develop websites with Contao 3"
God: "sounds cool, what are you working on today? Web sockets? Ajax? HTML5 video streaming?"
me: "no, i am trying to send an email ...."

Leo Unglaub
Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge