-
Notifications
You must be signed in to change notification settings - Fork 11
Eigene Synchronisationen
Es gibt zwei Varianten, das AddOn mit eigenen Synchronisationen zu erweitern. Beide Varianten lassen sich über PlugIns oder andere AddOns nutzen.
Die Variante 1 eignet sich, um eine einzelne DB-Tabelle im Dateisystem (ähnlich wie bei den Templates/Modulen/Actions) abzubilden. Jeder Datensatz wird durch einen Ordner repräsentiert, welcher für festgelegte Spalten jeweils eine Datei enthält. Weitere Spalten können gemeinsam in einer YAML-Datei (metadata.yml
) gespeichert werden.
Es wird ein neues Objekt der Klasse rex_developer_synchronizer_default
erstellt und mittels rex_developer_manager::register()
registriert.
Beispiel:
<?php
$synchronizer = new rex_developer_synchronizer_default(
'my_table', // Basis-Ordner, in den synchronisiert werden soll
'rex_my_table', // DB-Tabellenname
array('column1' => 'column1.php', 'column2' => 'column2.php'), // Zuordnung DB-Column => Datei
array('status' => 'boolean', 'comment' => 'string') // Optional: Metadaten (DB-Column => Typ)
);
rex_developer_manager::register($synchronizer);
Es wird standardmäßig davon ausgegangen, dass die Tabelle die Spalten id
, name
, updatedate
, updateuser
, createdate
und createuser
hat. Zwingend benötigt werden eine ID- und Namensspalte, sowie eine Spalte mit dem Zeitstempel der letzten Änderung. Die Spalten können mit diesen Funktionen konfiguriert werden:
<?php
$synchronizer->setIdColumn('my_id'); // Setzt den Namen der ID-Spalte
$synchronizer->setNameColumn('title'); // Setzt den Namen der Namensspalte
$synchronizer->setUpdatedColumn('updated'); // Setzt den Namen der Zeitstempelspalte
$synchronizer->setCommonCreateUpdateColumns(false); // Deaktiviert die üblichen "update*"- und "create*"-Spalten
Des Weiteren können zwei Callback-Funktionen gesetzt werden, die nach dem Hinzufügen bzw. Ändern eines Datensatzes (über das Dateisystem ausgelöst) aufgerufen werden. Das kann zum Beispiel verwendet werden, um Cache-Dateien zu löschen.
<?php
$synchronizer->setEditedCallback(function (rex_developer_synchronizer_item $item) {
$id = $item->getId();
// ...
});
// setAddedCallback analog
Die Variante 2 ist deutlich flexibler, mit ihr lassen sich beliebige Dinge mit dem Dateisystem synchronisieren.
Es wird eine Unterklasse von rex_developer_synchronizer
erstellt. Ein Objekt dieser Klasse wird mittels rex_developer_manager::register()
registriert.
Unterklasse:
<?php
class rex_developer_synchronizer_example extends rex_developer_synchronizer
{
public function __construct()
{
parent::__construct(
'example', // Basis-Ordner, in den synchronisiert werden soll
array('file1.php', 'file2.php') // Dateien, die synchronisiert werden
);
}
protected function getItems()
{
// Die Funktion muss ein Array von Objekten der Klasse rex_developer_synchronizer_item liefern
// Für jedes Objekt wird ein Unterordner im Basisordner angelegt, bzw. ggf. aktualisiert.
$items = array();
$item = new rex_developer_synchronizer_item(1, 'object1', 1357347625);
$item->setFile('file1.php', 'content of file 1');
$item->setFile('file2.php', 'content of file 2');
$items[] = $item;
return $items;
}
protected function addItem(rex_developer_synchronizer_item $item)
{
// Die Funktion wird aufgerufen, wenn über das Dateisystem ein neues Objekt (Ordner) erzeugt wurde
// Die Daten können hier dann zum Beispiel in die DB geschrieben werden
// Die Funktion muss die neu erstellte ID zurückliefern
return $id;
}
protected function editItem(rex_developer_synchronizer_item $item)
{
// Die Funktion wird aufgerufen, wenn über das Dateisystem ein Objekt verändert wurde
// Die Daten können hier dann zum Beispiel in die DB geschrieben werden
}
}
Registrierung:
<?php
rex_developer_manager::register(new rex_developer_synchronizer_example);