[4707 Aufrufe]

3.3 Der Abschnitt: List

Im Abschnitt list legen wir fest, wie unsere Daten im Backend angezeigt werden sollen. Dies klingt erst einmal simpel, aufgrund der vielen Möglichkeiten kann dies aber sehr komplex werden. Wie immer gehen wir die wichtigesten Dinge Schritt für Schritt durch. Es ist nicht schlimm, wenn Ihr nicht alles sofort versteht. Gerade den Tabellenbeziehungen werde ich später noch einen eigenen Text widmen. Ich werde die Einstellungen dieser Darstellungsformen aber auch hier vorstellen. Eine Beschreibung aller Einstellungen ist im Handbuch zu finden.

Beispielkonfiguration

Hier eine Minimalkonfiguration des Abschnitts list, die ich sehr häufig verwende:

<?php declare(strict_types=1);

$GLOBALS['TL_DCA']['tl_testtable'] = [
    // Config ...
    'list' => [
         'sorting' => [
            'mode'              => \Contao\DataContainer::MODE_SORTED,
            'flag'              => \Contao\DataContainer::SORT_INITIAL_LETTER_ASC,
            'fields'            => ['title'],
            'panelLayout'       => 'sort,filter;search,limit'
        ],
        'label' => [
            'fields'            => ['title'],
            'format'            => '%s'
        ],
        'global_operations' => [
            'all' => [
                'label'             => &$GLOBALS['TL_LANG']['MSC']['all'],
                'href'              => 'act=select',
                'class'             => 'header_edit_all',
                'attributes'        => 'onclick="Backend.getScrollOffset();" accesskey="e"'
            ]
        ],
        'operations' => [
            'edit' => [
                'label'             => &$GLOBALS['TL_LANG'][$table]['edit'],
                'href'              => 'act=edit',
                'icon'              => 'edit.svg'
            ],
            'copy' => [
                'label'             => &$GLOBALS['TL_LANG'][$table]['copy'],
                'href'              => 'act=copy',
                'icon'              => 'copy.svg'
            ],
            'delete' => [
                'label'             => &$GLOBALS['TL_LANG'][$table]['delete'],
                'href'              => 'act=delete',
                'icon'              => 'delete.svg',
                'attributes'        => 'onclick="if(!confirm(\'' . ($GLOBALS['TL_LANG']['MSC']['deleteConfirm'] ?? '') . '\'))return false;Backend.getScrollOffset()"'
            ],
            'show' => [
                'label'             => &$GLOBALS['TL_LANG'][$table]['show'],
                'href'              => 'act=show',
                'icon'              => 'show.svg'
            ]
        ]
    ],
    // ...
];

Wie man sieht, ist dieser Abschnitt etwas umfangreicher. Er umfasst die Bereiche sorting, label, global_operations und operations.

Der Abschnitt: sorting

Option: mode

Variablentyp: integer
Beispiel: \Contao\DataContainer::MODE_SORTED

Das Feld mode legt die Art fest, wie die Datensätze im Backend sortiert werden sollen. Es gibt folgende Werte:

Wert Konstante Bedeutung
0 \Contao\DataContainer::MODE_UNSORTED Datensätze werden nicht sortiert.
1 \Contao\DataContainer::MODE_SORTED Datensätze werden nach festen Felder sortiert. (Diese werden in der Option fields angegeben.)
2 \Contao\DataContainer::MODE_SORTABLE Datensätze werden nach dynamischen Felder sortiert. (Nutzer kann im Backend die Sortierung ändern).
3 \Contao\DataContainer::MODE_SORTED_PARENT Datensätze werden anhand der Eltertabelle sortiert.
4 \Contao\DataContainer::MODE_PARENT Datensätze werden nach Elterdatensätzen sortiert (wie bei den Inhaltselementen).
5 \Contao\DataContainer::MODE_TREE Datensätze werden als Baum angezeigt (wie bei der Seitenstruktur).
6 \Contao\DataContainer::MODE_TREE_EXTENDED Datensätze werden in einer erweiterten Baumstruktur angezeigt (wie bei den Artikeln).

Es kann etwas verwirrend sein, das sorting > mode eigentlich die Art der Anzeigt und sorting > flag die Art der Sortierung festlegt (s. nächste Option).

Option: flag

Variablentyp: integer
Beispiel: \Contao\DataContainer::SORT_INITIAL_LETTER_ASC

Mit der Option flag legt man die Sortierreihenfolge fest. Die Angaben bezeiehn sich auf die in der Option fields angegebenen Felder. Es gibt folgende Werte:

Wert Konstante Bedeutung
1 \Contao\DataContainer::SORT_INITIAL_LETTER_ASC Datensätze werden nach dem ersten Buchstaben aufsteigend sortiert.
2 \Contao\DataContainer::SORT_INITIAL_LETTER_DESC Datensätze werden nach dem ersten Buchstaben absteigend sortiert.
3 \Contao\DataContainer::SORT_INITIAL_LETTERS_ASC Datensätze werden nach den ersten zwei Buchstaben aufsteigend sortiert.
4 \Contao\DataContainer::SORT_INITIAL_LETTERS_DESC Datensätze werden nach den ersten zwei Buchstaben absteigend sortiert.
5 \Contao\DataContainer::SORT_DAY_ASC Datensätze werden nach Tag aufsteigend sortiert. (Feld muss ein Datum enthalten.)
6 \Contao\DataContainer::SORT_DAY_DESC Datensätze werden nach Tag absteigend sortiert. (Feld muss ein Datum enthalten.)
7 \Contao\DataContainer::SORT_MONTH_ASC Datensätze werden nach Monat aufsteigend sortiert. (Feld muss ein Datum enthalten.)
8 \Contao\DataContainer::SORT_MONTH_DESC Datensätze werden nach Monat absteigend sortiert. (Feld muss ein Datum enthalten.)
9 \Contao\DataContainer::SORT_YEAR_ASC Datensätze werden nach Jahr aufsteigend sortiert. (Feld muss ein Datum enthalten.)
10 \Contao\DataContainer::SORT_YEAR_DESC Datensätze werden nach Jahr absteigend sortiert. (Feld muss ein Datum enthalten.)
11 \Contao\DataContainer::SORT_ASC Datensätze werden aufsteigend.
12 \Contao\DataContainer::SORT_DESC Datensätze werden absteigend.

Will man die Daten nach Datum sortieren und dies auch anzeigen, muss beim entsprecheden Feld ebenfalls ein das Flag gesetzt werden, da sonst der Timestamp statt des formatierten Datums angezeigt wird.

Option: fields

Variablentyp: array
Beispiel: ['title', 'description']

Hier werden die Felder angegeben, nach denen sortiert werden soll.

Option: panelLayout

Variablentyp: string
Beispiel: filter;sort,search,limit

Mit der Option panelLayout kann der Aufbau des Panels im Kopf der Liste beeinflusst werden. Die Werte können wie im Beispiel kombiniret werden. Werden die Felder durch ein Komma getrennt, werden sie in einer Zeile dargestell, ein Semikolon steht für einen Zeilenumbruch.

Es gibt die Werte search für das Suchfeld, sort für die Auswahl der Sortierung, filter für die Filterfelder und limit für die Limitierung der Anzahl der angezeigten Datensätze.

panelLayout

Im Beispiel (filter;sort,search,limit) werden die Felder für die Filter in einer Zeile und das Feld für die Sortierung, die Suche und die Limitierung der angezeigten Datensätze in einer zweiten Zeile dargestellt.

Option: filter

Variablentyp: array
Beispiel: [['title=?', 'Test', ['description=?', 'Auch Test']]

Mit der Option filter können die Datensätze gefiltert werden, sodass nur bestimmte Datensätze angezeigt werden.

Option: headerFields

Variablentyp: array
Beispiel: ['title', 'description']

Mit der Option werden die Felder festgelegt, die im Panel angezeigt werden sollen. Dies greift nur im Mode 4 (\Contao\DataContainer::MODE_PARENT), also wenn Kinddatensätze zu einem Elterndatensatz angezeigt werden. Die Felder beziehen sich auf die Elterntabelle und zeigen die entsprechenden Daten des Elterndatensatzes an.

headerFields

Option: icon

Variablentyp: string
Beispiel: /path/to/my/icon.png

Im Mode 5 (\Contao\DataContainer::MODE_TREE) und 6 (\Contao\DataContainer::MODE_TREE_EXTENDED) kann ein Icon für den obersten Knoten angegeben werdne.

headerFields

Option: root

Variablentyp: array
Beispiel: [1, 2]

Ids der Wurzelseiten. Hab ich ehrlich gesagt noch nie benötigt. Im Handbuch steht; "... This value usually takes care of itself." Ich führes es der Vollständigkeithalber trotzdem hier auf.

Option: rootPaste

Variablentyp: bool
Beispiel: true

Wird rootPaste auf true gesetzt, wird der Einfügen-Button für die Rootebene eingeschaltet.

Option: disableGrouping

Variablentyp: bool
Beispiel: true

Normalerweise werden die Datensätze anhand ihrer Sortierung gruppiert. Wird z. B. nach den ersten beiden Buchstaben des Titels sortiert, werden jeweils alle Titel mit Aa, Ab, ... zusammengefasst und es wird eine Gruppenüberschrift erstellt.

Wird disableGrouping auf true gesetzt, wird dies unterbunden.

disableGrouping

Option: child_record_class

Variablentyp: string
Beispiel: myChildCssClass

Mit der Option child_record_class kann den Kinddatensätzen eine CSS-Klasse zugeordnet werden.

Option: paste_button_callback

Variablentyp: array
Möglicher Werte: [class, method]
Beispiel: [\Ctocb\Example\Classes\Contao\Operations\TlTesttable::class, 'myMethod']

Mit paste_button_callback kann der entsprechende Callback definiert werden. Mit ihm kann ein individueller Einfügen-Button erzeugt werden. Auf die Details der einzelnen Callbacks gehen wir im nächsten Kapitel ein.

Option: child_record_callback

Variablentyp: array
Möglicher Werte: [class, method]
Beispiel: [\Ctocb\Example\Classes\Contao\Operations\TlTesttable::class, 'myMethod']

Mit child_record_callback kann der entsprechende Callback definiert werden. Mit ihm kann ein individuelles Label für die einzelnen Kinddatensätze erzeugt werden. Auf die Details der einzelnen Callbacks gehen wir im nächsten Kapitel ein.

Option: header_callback

Variablentyp: array
Möglicher Werte: [class, method]
Beispiel: [\Ctocb\Example\Classes\Contao\Operations\TlTesttable::class, 'myMethod']

Mit header_callback kann der entsprechende Callback definiert werden. Mit ihm können die Felder im Kopfbereich beim Sorting-Mode 4 individualisiert werden. Auf die Details der einzelnen Callbacks gehen wir im nächsten Kapitel ein.

Der Abschnitt: label

label

In diesem Abschnitt wird die Beschriftung der Datensätze festgelegt.

Option: fields

Variablentyp: array
Beispiel: ['title', 'description']

Hier werden in einem Array die Namen der Felder angegeben, die als Beschriftung verwendet werden sollen.

(Dies kann vom label_callback überschrieben oder geändert werden!)

Option: format

Variablentyp: string
Beispiel: %s <span style="color: #999;">%s</span>

Hier wird das Format für die Ausgabe der Beschrifung festgelegt. Das Format wird mit der PHP-Funktion sprintf verarbeitet. In der Regel wird für jedes Feld in der Option fields ein %s angegeben und zusätzlich Trennzeichen, falls erforderlich. Es kann auch HTML verwendet werden.

Option: showColumns

Variablentyp: bool
Beispiel: true

Mit showColumns wird aus der Liste eine Tabelle. Dies wird z. B. für die Benutzer des Backends verwendet.

showColumns

Option: maxCharacters

Variablentyp: integer
Beispiel: 255

Mit maxCharacters kann die maximale Länge der Beschrieftung angegeben werden.

Option: group_callback

Variablentyp: array
Möglicher Werte: [class, method]
Beispiel: [\Ctocb\Example\Classes\Contao\Operations\TlTesttable::class, 'generateGroup']

In manchen Anzeigeformen werden die Datensätze gruppiert. Mit dem group_callback kann die Beschriftung der Gruppen individualisiert werden.

group_callback

Option: label_callback

Variablentyp: array
Möglicher Werte: [class, method]

Mit dem label_callback kann die Beschriftung der einzelnen Datensätze überarbeitet werden. Wir haben dies im Beitrag "Ein eigenes Icon für eine Backendliste erstellen" benutzt, um der Beschriftung ein Icon hinzuzufügen.

Der Abschnitt: global_operations

global_operations

Hier werden die globalen Optionen erstellt, die oben rechts über der Liste der Datensätze angezeigt werden. Für jede globale Option gibt es folgende Einstellungen.

Option: label

Variablentyp: array
Beispiel: $GLOBALS['TL_LANG']['tl_testtable']['edit']

Hier wird die Übersetzung der Operation angegeben. Es ist fast immer ein Verweis auf ein Spracharray.

Option: href

Variablentyp: string
Beispiel: act=edit, key=hideall

Mit href wird der Link gesetzt, den Contao nutzen soll. Diesem muss dann in der Datei config.php eine Klasse für die Bearbeitung der Anfrage zugewiesen werden (s. Beitrag "Einen Button für eine eigene Liste").

Option: icon

Variablentyp: string
Beispiel: edit.svg, bundles/Ctocbexample/img/edit.png

Mit icon wird der Aktion ein Icon zugweisen. Dies kann ein internes Icon von Contao sein (edit.svg), oder ein eigenes
(bundles/Ctocbexample/img/edit.png). In letzteren Fall wird das Icon unter src/Ctocb/Example/Resources/public/img/edit.png im Verzeichnis der Erweiterung gespeichert und von Contao nach /web/bundles/Ctocbexample/img/edit.png verlinkt.

(Bitte den Vendor-Namespace (oder entsprechenden Ordner) wieder durch Euren eignen ersetzen und nicht Ctocb verwenden!)

Option: attributes

Variablentyp: string
Beispiel: onclick="if(!confirm(\'' . ($GLOBALS['TL_LANG']['MSC']['deleteConfirm'] ?? '') . '\'))return false;Backend.getScrollOffset()"

Mit attributes können zusätzliche Attribute an das Linktag angehängt werden. Dies wird z. B. beim Löschen einzelner Datensätze verwendet, um eine Bestätigung einzufordern.

Option: class

Variablentyp: string
Beispiel: mycssclass

Mit class kann dem Link eine CSS-Klasse mitgegeben werden.

Option: button_callback

Variablentyp: array
Möglicher Werte: [class, method]
Beispiel: [\Ctocb\Example\Classes\Contao\Operations\TlTesttable::class, 'toggleIcon']

Einen button_callback haben wir im Beitrag "Eine Togglefunktion für eine eigene Liste" bereits verwendet, um den Status des Datensatzes in der Liste anzuzeigen. Auch wenn es sich dabei um eine Operation für einen Datensatz gehandelt hat, ist die Funktionsweise ähnlich, nur die Parameter sind etwas anders. Wir werden uns dies im Kapitel über die Callbacks noch genauer ansehen.

Option: route

Variablentyp: string
Beispiel: (Leider habe ich bisher kein Beispiel gefunden.)

Seit Contao 4.7 kann man eine Route setzen, sodass man nicht über die Datei config.php eine Klasse für die Verarbeitung zuweisen muss. Der Weg über die Datei config.php funktionert aber weiterhin. Ich mag es, alle Einstellungen des Moduls dort abzulegen. Es ist aber jedem selbst überlassen, welche Methode man bevorzugt.

Der Abschnitt: operations

Operaions

Hier finden wir die Operationen für die einzelnen Datensätze. In der Regel hat man die Operationen edit, copy, delete und show. Diese sind aus Contao bekannt und finden sich fast überall im Backend. Des Weitern gibt es noch die eigenen Aktionen, wie wir sie im Beitrag "Einen Button für eine eigene Liste" erstellt haben.

Option: label

Variablentyp: array
Beispiel: $GLOBALS['TL_LANG']['tl_testtable']['edit']

Hier wird die Übersetzung der Operation angegeben. Es ist fast immer ein Verweis auf ein Spracharray.

Option: href

Variablentyp: string
Beispiel: act=edit, key=hideall

Mit href wird der Link gesetzt, den Contao nutzen soll. Diesem muss dann in der Datei config.php eine Klasse für die Bearbeitung der Anfrage zugewiesen werden (s. Beitrag "Einen Button für eine eigene Liste").

Option: icon

Variablentyp: string
Beispiel: edit.svg, bundles/Ctocbexample/img/edit.png

Mit icon wird der Aktion ein Icon zugweisen. Dies kann ein internes Icon von Contao sein (edit.svg), oder ein eigenes
(bundles/Ctocbexample/img/edit.png). In letzteren Fall wird das Icon unter src/Ctocb/Example/Resources/public/img/edit.png im Verzeichnis der Erweiterung gespeichert und von Contao nach /web/bundles/Ctocbexample/img/edit.png verlinkt.

(Bitte den Vendor-Namespace (oder entsprechenden Ordner) wieder durch Euren eignen ersetzen und nicht Ctocb verwenden!)

Option: attributes

Variablentyp: string
Beispiel: onclick="if(!confirm(\'' . ($GLOBALS['TL_LANG']['MSC']['deleteConfirm'] ?? '') . '\'))return false;Backend.getScrollOffset()"

Mit attributes können zusätzliche Attribute an das Linktag angehängt werden. Dies wird z. B. beim Löschen verwendet, um eine Bestätigung einzufordern.

Option: button_callback

Variablentyp: array
Beispiel: [\Ctocb\Example\Classes\Contao\Operations\TlTesttable::class, 'toggleIcon']

Den button_callback haben wir im Beitrag "Eine Togglefunktion für eine eigene Liste" bereits verwendet, um den Status des Datensatzes in der Liste anzuzeigen.

Fazit

Dies war ein recht umfangreicher Artikel. Wie wir gesehen haben, bietet das DCA viele verschiedene Möglichkeiten, unsere Daten darzustellen.