2.4 Einen Button für eine eigene Liste
In diesem Text wollen wir unserer Liste eine Aktion für die Datensätze hinzufügen. Als Ausgangslage dient wieder das
DCA unserer Tabelle tl_testtable
.
(Bitte auch in diesem Artikel wieder den Vendor-Namespace (oder entsprechenden Ordner)
durch Euren eignen ersetzen und nicht Ctocb
verwenden! Danke!)
Erweiterung des DCA
Ein Button kann natürlich beliebige Funktionen ausführen, aber wir wollen einen Wert in unserer Tabelle verändern.
Immer wenn wir ihn drücken, soll das Aktualisierungsdatum (Feld tstamp
) auf die aktuelle Zeit gesetzt werden. In der
Praxis ist eine solche Funktion vermutlich nicht sehr sinnvoll, aber es wird uns als Grundlage dienen, um die
Toogle-Funktion (grüne Auge) von Contao für unsere eigenen Daten nachzubauen.
Hier das entsprechende DCA (/src/Ctocb/Example/Resources/contao/dca/tl_testtable.php
):
<?php declare(strict_types=1);
$table = 'tl_testtable';
$GLOBALS['TL_DCA'][$table] = [
// Config
'config' => [
// ...
],
// List
'list' => [
'sorting' => [
// ...
],
'label' => [
// ...
],
'global_operations' => [
// ...
],
'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'
],
'resettime' => [
'label' => &$GLOBALS['TL_LANG'][$table]['resettime'],
'href' => 'key=resettime',
'icon' => 'news.svg'
]
]
],
// Palettes
'palettes' => [
'default' => '{title_legend},title,content;'
],
// Fields
'fields' => [
'id' => [
'sql' => 'int(10) unsigned NOT NULL auto_increment'
],
'tstamp' => [
'sql' => "int(10) unsigned NOT NULL default '0'"
],
'title' => [
'exclude' => true,
'inputType' => 'text',
'eval' => ['mandatory' => true, 'maxlength' => 255, 'tl_class' => 'w50'],
'sql' => "varchar(255) NOT NULL default ''"
],
'content' => [
'exclude' => true,
'inputType' => 'textarea',
'eval' => ['mandatory'=>true, 'tl_class' => 'clr long', 'rte'=>'tinyMCE'],
'sql' => "text NULL"
]
]
];
Wir haben hier ab Zeile 43 erstellen wir unseren Button und sagen Contao in Zeile 45, dass beim Klick key=resettime
an die URL angehängt werden soll.
config.php
Nun legen wir in der Datei /src/Ctocb/Example/Resources/contao/config/config.php
fest, welche Klasse und welche
Methode aufgerufen werden sollen, wenn unser Button geklickt wird.
Wir verwenden hier den Key, den wir im DCA festgelegt haben (resettime
).
<?php declare(strict_types=1);
$GLOBALS['BE_MOD']['module_test_group'] = [
'module_test_table' => [
'tables' => ['tl_testtable'],
'resettime' => [\Ctocb\Example\Classes\Contao\TlTesttable\TlTesttable::class, 'resetTime']
]
];
Aktion implementieren
Jetzt müssen wir noch in unserer Klasse (/src/Ctocb/Example/Classes/Contao/Operations/TlTesttable.php
) die Methode
resetTime
anlegen.
<?php declare(strict_types=1);
namespace Ctocb\Example\Classes\Contao\Operations;
use Contao\Controller;
use Contao\DataContainer;
use Contao\Message;
use Contao\System;
class TlTesttable
{
public function resetTime(DataContainer $dc): void
{
$id = $dc->id;
$query = System::getContainer()->get('database_connection')?->createQueryBuilder();
if (null !== $query && !empty($id)) {
$query->update('tl_testtable')->set('tstamp', \time())->where("id = $id")->executeStatement();
Message::addInfo("Zeit des Datensatzes mit der Id [$id] auf " . \date('d.m.Y H:i:s') . ' gesetzt');
Controller::redirect('/contao?do=module_test_table');
}
}
}
In Zeile 18 schreiben wir das aktuelle Datum in die Datenbank. In Zeile 19 erstellen wir noch einen Hinweis und in Zeile 20 leiten wir zurück zur Liste, da sonst eine leere Seite angezeigt würde.
Sprachdatei
Nun erstellen wir noch den Eintrag für die Beschriftung unseres Buttons in der Sprachdatei
(/src/Ctocb/Example/Resources/contao/languages/de/tl_testtable.php
).
<?php declare(strict_types=1);
$table = 'tl_testtable';
// ...
// Operations
$GLOBALS['TL_LANG'][$table]['resettime'] = 'Bearbeitungszeit zurücksetzen';
Fertig
Das war schon die ganze Magie. Mit dem neuen Button sieht es jetzt so aus: