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.
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.
<?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',
)
);
}
?>
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.
Dieses Beispiel speichert alle Extrafelder in eine Tabelle ab. Die Bedeutung der Felder im einzelnen:
<?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.
<?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
));
}
}
?>
|
Tel: +49 (0)6261 / 6743-0 Fax: +49 (0)6261 / 6743-29 E-Mail: info@egotec.com |
EGOTEC GmbH Hauptstraße 130 D-74821 Mosbach |
| Erstellt mit EGOTEC® Internet: www.egotec.com © EGOTEC GmbH | |