Skip to content

Eigene Synchronisationen

gharlan edited this page Jan 5, 2013 · 3 revisions

Es gibt zwei Varianten, das AddOn mit eigenen Synchronisationen zu erweitern. Beide Varianten lassen sich über PlugIns oder andere AddOns nutzen.

Variante 1 (einfacher)

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

Variante 2 (flexibler)

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);
Clone this wiki locally