Anlegen von zusätzlichen Tabellen, um Extrafelder durchsuchbar zu machen.

Das EGOTEC CMS erlaubt das erstellen beliebig vieler Attribute pro Seite resp. Seitentyp. Die Speicherung dieser Extrafelder wird in einem Tabellenfeld vorgenommen. Die Tabellenstruktur wird nicht geändert. Es ist daher ganz einfach möglich, für einen Seitentyp neue Extrafelder zu definieren. Hierfür ist nicht einmal PHP notwendig, es genügt die Definition des Extrafelds auf einem Reiter im Adminbereich. Allerdings kann nach diesen Extrafeldern nicht gesucht und nicht sortiert werden. Um dies zu ermöglichen gibt es zwei Hooks im EGOTEC CMS.

Tabellen für Extrafelder erzeugen

Legen Sie in Ihrem Mandanten das Skript create_table.php an. Dieses Skript muss mindestens Die Methode site_create_table_misc beinhalten. Diese Methode wird beim Einspielen einer Datensicherung aufgerufen. Wenn Sie also nachträglich die Tabellenstruktur ändern möchten, so legen Sie eine Datensicherung an und spielen diese wieder ein, danach ist die neue Struktur, die Sie im Skript create_table.php festgelegt haben, vorhanden.

Beispiel (site/demo/admin/create_table.php)

<?php /** * Die zusätzliche Tabelle demo_de_extra für die schnelle Suche in Extrafeldern erzeugen. */ function site_create_table_misc(Site $site, $params) {    $db = new_db_connection();    $db->createTable(       $site->pageTable.'_extra',       array(          'page_id'   => 'bigint',          'extra_key'   => 'varchar(255)/*bin*/',          'extra_int'   => 'bigint',          'extra_varchar'   => 'varchar(255)',          'extra_text'   => 'text',          'PRIMARY KEY'   => 'page_id,extra_key',          'KEY extra_int'   => 'extra_int',          'KEY extra_varchar'   => 'extra_varchar(16)',       )    );    $db->createTable('timestamp',array(          'timestamp_id'         => 'bigint',          'page_id'      => 'bigint',          'start_date'      => 'bigint',          'end_date'         => 'bigint',          'userid'      => 'varchar(32)',          'PRIMARY KEY' => 'timestamp_id',          'KEY page_id' => 'page_id',          'KEY start_date' => 'start_date',          'KEY end_date' => 'end_date',          'KEY userid' => 'userid'    ));    $db->createTable(       $site->pageTable.'_buchungen',       array(          'page_id'   => 'bigint',          'type'   => 'varchar(255)',          'begin'   => 'bigint',          'ende'   => 'bigint',       )    ); } ?>
wb_incandescent
Ab Version 5.0.6 kann in site/_global/admin/create_table.php ein globales Skript hinterlegt werden, dass für jeden Mandanten vor dem Mandantenskript aufgerufen wird.
Die Methode muss dann allerdings site_create_table_global(Site $site, $params) heißen.

Daten in die Tabellen speichern

Pro Mandant oder auch pro Seitentyp kann das Skript update.php angelegt werden. Das Skript liegt entweder im Adminverzeichnis des Mandanten (site/demo/admin/update.php) oder im Adminverzeichnis des Seitentyps (site/demo/page/admin/update.php). Die Methode die aufgerufen wird heißt site_update_misc resp. site_update_page_misc.

Beispiel site/demo/admin/update.php

Dieses Beispiel speichert alle Extrafelder in eine Tabelle ab. Die Bedeutung der Felder im einzelnen:

  • page_id
    die Seitenid
  • extra_key
    der Name des Extrafeldes
  • extra_int
    der Wert des Extrafeldes als Zahl
  • extra_varchar
    extra_text
    der Wert des Extrafeldes als Text
<?php /** * Die zusätzliche Tabelle demo_de_extra für die schnelle Suche in Extrafeldern füllen. */ function site_update_misc(Page $page) {    $db = new_db_connection();    if ($page->extra)    {       $extraTable = $page->getSite()->pageTable.'_extra';       $db->delete(array( // Zuerst werden die alten Einträge gelöscht.          'table'   => $extraTable,          'where'   => 'page_id='.$page->field['id']       ));       $set = array(          'page_id'   => $page->field['id']       );       foreach ($page->extra as $key => $value)       {          if (strlen($key)>255)          {             continue;          }          $set['extra_key'] = $key;          if (is_array($value) || is_object($value))          { // Es können nur Ganzzahlen und Zeichenketten abgespeichert werden.             $value = serialize($value);          }          $set['extra_int'] = (integer)$value;          $set['extra_varchar'] = mb_substr($value, 0, 255);          $set['extra_text'] = $value;          $db->insert(array(             'table'   => $extraTable,             'set'   => $set          ));       }    } } ?>

Mit diesem Skript werden immer alle Extrafelder in der Tabelle demo_de_extra gespeichert. Performanter ist das folgende Skript, dass die Extradaten direkt in einzelne Felder einer Tabelle speichert.

Beispiel site/demo/ressource/belegung/update.php

<?php /* ################################################### * ## Beim Speichern auch die Tabelle            ## * ## <mandant>_<sprache>_buchungen aktualisieren   ## * ################################################### */ function site_update_ressource_belegung_misc(Page $page) {    // alte Einträge löschen    $db->delete(array(        'table'   => $extraTable,        'where'   => 'page_id='.$page->field['id']    ));    if ($page->field['deleted'] != 1)    {       $set = array(          'page_id'   => $page->field['id'],          'type' => $page->field['type'],          'begin' => $page->extra['begin'],          'ende' => $page->extra['ende']       );       $db->insert(array(          'table'   => $extraTable,          'set'   => $set       ));    } } ?></mandant>
wb_incandescent
Ab Version 5.0.6 kann in site/_global/admin/update.php ein globales Skript hinterlegt werden, dass für jeden Mandanten vor dem Mandantenskript aufgerufen wird.
Die Methode muss dann allerdings site_update_global(Site $site, $params) heißen.