[3036 Aufrufe]

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:

Eigener Button