[1873 Aufrufe]

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.

Globale_Aktion