2.6 Eine globale Aktion für unsere Liste
In diesem Text wollen wir eine globale Aktion erstellen, also eine Aktion, die sich auf mehrere Datensätze auswirkt. Ein Beispiel für eine solche Aktion könnte das Löschen von veralteten Daten sein. Wenn Nutzer sich registieren können und den Account dann aktiveren müssen, will man in der Regel irgendwann alle Benutzer löschen, die den Account nicht aktiviert haben.
Damit der Text übersichtlich bleibt, werden wir eine Funktion erstellen, die die Sichtbarkeit aller unserer Datensätze auf nicht sichtbar setzt.
(Bitte auch in diesem Artikel wieder den Vendor-Namespace (oder entsprechenden Ordner)
durch Euren eignen ersetzen und nicht Ctocb
verwenden! Danke!)
Erweiterung des DCA
Wie eigentlich immer beginnen wir mit dem 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' => [
'all' => [
'label' => &$GLOBALS['TL_LANG']['MSC']['all'],
'href' => 'act=select',
'class' => 'header_edit_all',
'attributes' => 'onclick="Backend.getScrollOffset();" accesskey="e"'
],
'hideall' => [
'label' => &$GLOBALS['TL_LANG'][$table]['hideall'],
'icon' => 'visible.svg',
'href' => 'key=hideall',
'showInHeader' => true
]
],
'operations' => [
// ...
]
],
// Palettes
'palettes' => [
'default' => '{title_legend},title;{publish_legend},published;'
],
// Fields
'fields' => [
'id' => [
'sql' => 'int(10) unsigned NOT NULL auto_increment'
],
'tstamp' => [
'sql' => "int(10) unsigned NOT NULL default '0'"
],
'title' => [
'label' => &$GLOBALS['TL_LANG'][$table]['title'],
'exclude' => true,
'inputType' => 'text',
'eval' => ['mandatory' => true, 'maxlength' => 255, 'tl_class' => 'w50'],
'sql' => "varchar(255) NOT NULL default ''"
],
'content' => [
'label' => &$GLOBALS['TL_LANG'][$table]['content'],
'exclude' => true,
'inputType' => 'textarea',
'eval' => ['mandatory'=>true, 'tl_class' => 'clr long', 'rte'=>'tinyMCE'],
'sql' => "text NULL"
],
'published' => [
'label' => &$GLOBALS['TL_LANG'][$table]['published'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => ['doNotCopy'=>true],
'sql' => "char(1) NOT NULL default ''"
]
]
];
Hier ist im Bereich list
> global_operations
die Definition hideall
hinzugekommen. Es wird hier kein
button_callback
angegeben, sondern ein key
(wie im Text "Einen Button für eine eigene Liste"). Dem Key werden wir
in der config.php
eine Klasse zuordnen. Der Abschnitt operations
bleibt im Vergleich zum letzten Text unverändert.
Zur besseren Übersicht habe ich ihn hier ausgeklammert.
Zuordnung der Klasse zur Aktion
Wie gesagt, geschieht dies in der Datei /src/Ctocb/Example/Resources/contao/config/config.php
:
<?php declare(strict_types=1);
$GLOBALS['BE_MOD']['module_test_group'] = [
'module_test_table' => [
'tables' => ['tl_testtable'],
'resettime' => [\Ctocb\Example\Classes\Contao\Operations\TlTesttable::class, 'resetTime'],
'hideall' => [\Ctocb\Example\Classes\Contao\Operations\TlTesttable::class, 'hideAll'] // neu
]
];
Sprachdatei
Auch die globale Aktion soll einen sinnvollen Namen bekommen, weshalb wir die Sprachdatei
(/src/Ctocb/Example/Resources/contao/languages/de/tl_testtable.php
) erweitern.
<?php declare(strict_types=1);
$table = 'tl_testtable';
// Fields
// ...
// Legends
// ...
// Operations
// ...
// Global Operations
$GLOBALS['TL_LANG'][$table]['hideall'] = 'Alle ausblenden';
// Buttons
// ...
Operation anlegen
Den Aufruf der Operaltion erstellen wir in der Klasse /src/Ctocb/Example/Classes/Contao/Operations/TlTesttable
:
<?php declare(strict_types=1);
namespace Ctocb\Example\Classes\Contao\Operations;
use Contao\Controller;
use Contao\System;
use Ctocb\Example\Classes\Helper\ToggleHelper;
class TlTesttable
{
private string $table = 'tl_testtable';
public function toggleIcon($row, $href, $label, $title, $icon, $attributes): string {
$helper = new ToggleHelper($this->table);
return $helper->toggleIcon($row, $href, $label, $title, $icon, $attributes);
}
public function hideAll(): void {
$query = System::getContainer()->get('database_connection')?->createQueryBuilder();
$query?->update($this->table)->set('published', '0')->executeStatement();
Controller::redirect('/contao?do=module_test_table');
}
}
Es wurde die Methode hideAll
ergänzt. Sie setzt den Wert für alle Datensätze der Tabelle tl_testtable
auf '0'
,
dies sorgt dafür, dass kein Datensätz mehr angezeigt wird.
Fazit
Auch wenn dies nicht sehr sinnvoll ist, zeigt es schön das Vorgehen, bei globalen Aktionen. Lasst einfach ein bisschen Eure Fantasie spielen, dann fallen Euch bestimmt sinnvollere Einsatzzwecke ein.