[2472 Aufrufe]

4.2 Globale Callbacks

Die globalen Callbacks werden bei Operationen aufgerufen, die sich auf die ganze Tabelle beziehen. Sie werden immer dann verwendet, wenn man die Tabelle als Ganzes betrachtet.

In diesen Beispielen werden die Callbacks immer in der Datei /src/Ctocb/Example/Resources/config/services.yml registriert und die Klasse für die Verarbeitung ist hier immer /src/Ctocb/Example/Classes/Contao/Callbacks/TlTest.php. Wer nicht weiß was hier gemeint ist, sollte sich den Text " "Grundlagen der Callbacks"" noch einmal ansehen.

(Bitte auch in diesem Artikel wieder den Vendor-Namespace (und/oder entsprechenden Ordner) durch Euren eignen ersetzen und nicht Ctocb verwenden! Danke!)

Callback: config.onload

Der onload_callback wird beim Laden der Daten einer Tabelle ausgeführt. Dies betrifft sowohl die Listenansicht, als auch die Bearbeitungsmaske im Backend. Zusätzlich wird er im Frontend in den Modulen "Personal data", "Registration", "Password" und "Change Password" aufgerufen. Man kann mit ihm z. B. das DCA zur Laufzeit manipulieren oder Berechtigungen prüfen.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.onload, table: tl_test, method: myCallback, priority: 1024 }

Die Klasse für die Bearbeitung des Callbacks kann ungefähr so aussehen. Die Methode gibt keinen Wert zurück.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

class TlTest
{
    public function myCallback($dc = null): void
    {
        // do something ...
    }
}

Es ist zu beachten, dass der onload_callback auch im Frontend aufgerufen wird, dort aber kein Data Container Objekt übergibt. Außerdem übergeben mache Erweiterungen andere Objekte, wie z. B. der MultiColumnWizard. Ich habe deshalb hier keinen TypHint verwendet und ein = null hinzugefügt. Dieses Vorgehen kann im Zweifelsfall bei allen Callbacks angewendet werden. Es sollte aber sehr genau geprüft werden, ob es wirklich nötig ist. Es ist immer besser einen TypeHint zu verwenden!

Callback: config.oncreate

Der oncreate_callback wird aufgerufen, wenn ein neuer Datensatz angelegt wird.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.oncreate, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks gibt keinen Wert zurück.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

use Contao\DataContainer;

class TlTest
{
    public function myCallback(string $table, int $id, array $fields, DataContainer $dc): void
    {
        // do something ...
    }
}

Der Parameter $table enthält den Namen der Tabelle, $id die Id des neu angelegten Datensatzes, $fields enthält die Daten des neuen Datensatzes. Hier ist zu beachten, dass der Datensatz beim Aufruf der Bearbeitungsmaske angelegt wird und somit nur $fields['tstamp'] = 0 in den Daten enthalten ist. Der Callback wird beim Speichern nicht erneut aufgerufen, hierzu ist der config.onsubmit-Callback zu verwenden. Der letzte Parameter enthält wieder das Data Container Objekt.

Callback: config.onbeforesubmit

Der onbeforesubmit-Callback wird aufgerufen, wenn ein Formular im Backend abgesendet, aber bevor die Daten in der Datenbank gespeichert wurden.

Dieser Callback steht ab Contao 5.0 zur Verfügung.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.onbeforesubmit, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks muss ein Array zurückgeben.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

use Contao\DataContainer;

class TlTest
{
    public function myCallback(array $values, DataContainer $dc): void
    {
        // do something ...
        return $values
    }
}

Der Parameter $value enthält die Werte des Formulars und $dc das Data Cantainer Objekt. Die Methode muss das Array mit den Werten zurückgeben.

Callback: config.onsubmit

Der onsubmit-Callback wird nach dem Speichern eines Datensatzes in der Datenbank aufgerufen.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.onsubmit, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks gibt keinen Wert zurück.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

use Contao\DataContainer;

class TlTest
{
    public function myCallback(DataContainer $dc): void
    {
        // do something ...
    }
}

Auch hier ist zu beachten, dass der Callback ebenfalls im Frontend im Modul "Personal data" aufgerufen wird. Dort sind die Parameter allerdings vom Typ \Contao\FrontendUser und \Contao\ModulePersonalData. Dies ist sehr unschön und muss im Quelltext entsprechend abgefangen werden.

Die Daten können im Backend über das Data Container Objekt bezogen werden: $dc->activeRecord. Wenn Sie verändert werden, müssen sie manuell gespeichert werden.

Callback: config.ondelete

Der ondelete-Callback wird beim Löschen eines Datensätzes aufgerufen.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.ondelete, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks gibt keinen Wert zurück.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

use Contao\DataContainer;

class TlTest
{
    public function myCallback(DataContainer $dc, int $undoId): void
    {
        // do something ...
    }
}

Es ist zu beachten, dass andere Parameter übermittelt werden, wenn der Daten Container vom Typ DC_Folder ist. Dann wird als erster Parameter ein String mit dem Pfad der Datei und als Zweites das Data Container Objekt übergeben.

Callback: config.oncut

Der oncut-Callback wird ausgeführt, nach dem ein Datensatz an eine neue Position verschoben wurde.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.oncut, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks gibt keinen Wert zurück.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

use Contao\DataContainer;

class TlTest
{
    public function myCallback(DataContainer $dc): void
    {
        // do something ...
    }
}

Der Parameter $dc enthält das Data Container Objekt.

Callback: config.oncopy

Der oncopy-Callback wird aufgerufen, nach dem ein Datensatz kopiert wurde.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.oncopy, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks gibt keinen Wert zurück.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

use Contao\DataContainer;

class TlTest
{
    public function myCallback(int $insertId, DataContainer $dc): void
    {
        // do something ...
    }
}

Der Parameter $insertId enthält die Id des neuen Datensatzes und $dc das Data Container Objekt.

Callback: config.oncreate_version

Der oncreate_version-Callback wird ausgeführt, nach dem eine alte Version eines Datensatzes in die Tabelle tl_version eingefügt wurde.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: cconfig.oncreate_version, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks gibt keinen Wert zurück.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

class TlTest
{
    public function myCallback(sttring $table, int $parentId, int $version, array $record): void
    {
        // do something ...
    }
}

$table enthält den Namen der Tabelle, aus der der Datensatz stammt. $parentId enthält die Id des original Datensatzes. Im Parameter $version steht die Nummer der Version. Der Parameter wird bei jeder neuen Version um eins erhöht. Die Daten stehen im Parameter $record.

Callback: config.onrestore_version

Der onrestore_version-Callback wird aufgerufen, wenn eine alte Version wiederhergestellt wird.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.onrestore_version, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks gibt keinen Wert zurück.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

class TlTest
{
    public function myCallback(string $table, int $parentId, int $version, array $record): void
    {
        // do nothing, use onundo_callback instead!
    }
}

$table enthält den Namen der Tabelle, aus der der Datensatz stammt. $parentId enthält die Id des original Datensatzes. Im Parameter $version steht die Nummer der Version. Die Daten stehen im Parameter $record.

Callback: config.onundo

Der onundo-Callback wird aufgerufen, wenn ein gelöschter Datensatz wiederhergestellt wird.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.onundo, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks gibt keinen Wert zurück.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

use Contao\DataContainer;

class TlTest
{
    public function myCallback(string $table, array $record, DataContainer $dc): void
    {
        // do something ...
    }
}

Der Parameter $table enthält den Namen der Tabelle, aus der der Datensatz stammt. In $record sind die Daten enthalten und $dc ist das Data Container Objekt.

Callback: config.oninvalidate_cache_tags

Mit dem oninvalidate_cache_tags-Callback kann man Cache Tags invalidieren.

Dieser Callback steht ab Contao 4.7 zur Verfügung.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.oninvalidate_cache_tags, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks muss ein Array zurückgeben.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

use Contao\DataContainer;

class TlTest
{
    public function myCallback(DataContainer $dc, array $tags): array
    {
        // do something ...
        return $tags;
    }
}

Im Parameter $dc ist wieder das Data Container Objekt und in $tags sind die Tags, die invalidiert werden sollen. Das Array kann um eigene Tags ergänzt werden, oder man kann welche entfernen. Der Callback muss das Array mit den Tags zurückgeben.

Callback: config.onshow

Man kann mit dem onshow-Callback das Modalfenster bearbeiten, dass beim Klick auf das in den Listen im Backend erscheint.

Dieser Callback steht ab Contao 4.7 zur Verfügung.

services:
    Ctocb\Example\Classes\Contao\Callbacks\TlTest:
        public: true
        tags:
            - { name: contao.callback, target: config.onshow, table: tl_test, method: myCallback, priority: 1024 }

Die Methode für die Verarbeitung des Callbacks muss ein Array zurückgeben.

<?php declare(strict_types=1);

namespace Ctocb\Example\Classes\Contao\Callbacks;

use Contao\DataContainer;

class TlTest
{
    public function myCallback(array $modalData, array $record, DataContainer $dc): array
    {
        // do something ...
        return $modalData;
    }
}

Der Parameter $modalData enthält das Array mit den Daten für das Modalfenster. $record enthält die Daten aus der Tabelle, die zu dem Datensatz gehören. $dc ist wie immer das Data Container Objekt.