database.xml
Mit der database.xml können Sie eigene Datenbank Tabellen erstellen lassen. Es ermöglicht Ihnen komplett eigenständige Tabellen oder auch projektabhängige Tabellen zu erstellen. QUIQQER übernimmt für Sie das Anlegen (bei einer Installation / Update) und Löschen der Tabellen (bei einer Deinstallation).
Das Anlegen geht denkbar einfach; legen Sie im root Verzeichnis Ihres Pakets eine database.xml an und definieren Sie hier Ihre Tabellen. Bei einem Update oder bei der Installation wird diese database.xml automatisch von QUIQQER eingelesen.
Sämtliche Einstellung für neue oder bestehende Tabellen können hier vorgenommen werden. Diese werden bei einem Quiqqer setup automatisch durchgeführt.
Aufbau
<?xml version="1.0" encoding="UTF-8"?>
<database>
<global>
<table name="table_name" no-site-reference="1" engine="MYISAM">
<field type="varchar(255)">groups</field>
<field type="varchar(255) COMMENT 'Dies ist ein Kommentar'">var</field>
<field type="varchar(20)">datatype</field>
<field type="varchar(200)">datadefine</field>
<field type="text">de</field>
<field type="text">de_edit</field>
<field type="text">en</field>
<field type="text">en_edit</field>
<!-- NULL explicitly allowed -->
<field type="TEXT" null="1">changes</field>
<primary>field1,field2</primary>
<index>groups</index>
<comment>Table Comment - max 1024 chars</comment>
</table>
</global>
<projects>
<!--
automatic site connect,
site id is automatically added and at an update the attributes automaticly updated / inserted
-->
<table name="project_extra_table_name">
<field type="text">emotion_image</field>
<field type="int(12)">release_until</field>
<field type="bigint(20) COMMENT 'Dies ist ein Kommentar'">emotion_folder</field>
<comment>Table Comment - max 1024 chars</comment>
</table>
<!--
data table only for certain sites
specific the site types in site-types="" attribute ... you can use shell wild cards
-->
<table name="project_extra_table_name" site-types="quiqqer/*,my/plugin:types*">
<field type="text">emotion_image</field>
<field type="int(12) COMMENT 'Dies ist ein Kommentar'">release_until</field>
<field type="bigint(20)">emotion_folder</field>
<comment>Table Comment - max 1024 chars</comment>
</table>
<!-- no automatic site relationship, update, insert -->
<table name="project_extra_table_name" no-auto-update="1" no-site-reference="1">
<field type="text">emotion_image</field>
<field type="int(12) COMMENT 'Dies ist ein Kommentar'">release_until</field>
<field type="bigint(20)">emotion_folder</field>
<comment>Table Comment - max 1024 chars</comment>
</table>
</projects>
</database>
-
<database>
beginnt das Datenbank-XML -
<global>
Legt eine globale Tabelle an (diese Tabelle wird einmal angelegt) -
<projects>
Legt eine Projekttabelle an. Für jedes Projekt mit dem Projektnamen wird diese Tabelle angelegt -
<table>
der Tabellen Bereich, gibt die Struktur der Tabelle vor -
<field>
ein Tabellenfeld -
<index>
ein Index festlegen -
<primary>
ein Primary Key festlegen (bei mehreren Feldern = kommasepariert)
<table name="NAME_DER_TABELLE">
Ein <table>
Node legt die Struktur einer neuen Tabelle fest, die im System erstellt werden soll. Alle <field>
Nodes unter dem <table>
Node legen die Struktur der Tabelle fest.
Das <table>
Node kann nur unter <global>
oder <projects>
sein.
Mit dem name Attribute wird der Name der Tabelle festgelegt.
Zusätzlich kann per engine
Attribute die Tabellen Engine festgelegt werden. Das engine
Attribute ist optional und der Standardwert ist MYISAM
.
Folgende Werte sind möglich:
InnoDB
, MYISAM
, Memory
, Merge
, Archive
, Federated
, NDB
, CSV
, Blackhole
, Example
<global>
und <projects>
<global>
und <projects>
legen fest, für welchen Bereich die Tabelle zuständig ist. Mit <global>
wird definiert, dass die Tabelle wirklich nur einmal existieren darf. Diese Tabelle steht für sich und muss wirklich auch nur einmal erstellt werden. Die Beziehungen zu anderen Tabellen oder Objekten macht das Plugin / Paket für sich selbst.
<projects>
hingegen legt fest, dass diese Tabellen mit einem Projekt in Beziehung stehen.
Für jedes Projekt welches in QUIQQER angelegt wird oder angelegt ist, werden diese Tabellen angelegt.
Eine Tabelle, die in <projects>
definiert ist, erhält automatisch ein id Feld für die Seiten Beziehungen.
Jeder Eintrag in dieser Tabelle ist also ein Eintrag für eine einzelne Seite. Tabellen, die in <projects>
definiert sind, werden auch für die jeweilige Sprache des Projektes angelegt.
Beispiel:
<projects>
<table name="awesome" type="site">
<field type="text">field_text</field>
<field type="int(12)">field_int</field>
</table>
</projects>
Mit dieser Definition wird nun jeweils für jedes Projekt und jeder Projekt-Sprache eine Tabelle awesome angelegt.
Sind in QUIQQER nun 2 Projekte angelegt mit jeweils der Sprache de
und en
, werden also folgende Tabellen angelegt:
projects1_de_awesome
projects1_en_awesome
projects2_de_awesome
projects2_en_awesome
<field>
Das <field>
Node besitzt ein type Attribut, dieses Attribut setzt den Typ der Tabellenspalten. Der Typ der Tabellenspalten kann jeden Typ besitzen, den es in einer Datenbank gibt, zusätzlich setzt er auch die Größe der Spalte. Sie verwenden dieses Attribut gleich wie bei einem normalen Tabellen CREATE
Ein varchar(200) wäre also eine Tabellenspalte mit dem Typ varchar für 200 Zeichen pro Spalte. Ein type="text" würde somit eine Textspalte erzeugen.
Hinter dem Datentyp kann auch noch ein Kommentar für die Spalte spezifiziert werden mittels COMMENT 'Dies ist ein Kommentar'
.
Der Inhalt des <field>
Nodes gibt den Namen der Tabellenspalten an.
Beispiele
<field type="text">en_edit</field>
Legt eine Spalte mit dem Namen en_edit an und diese Spalte ist vom Typ text.
<field type="varchar(20) COMMENT 'Article ID'">id</field>
Legt eine Spalte vom Typ varchar
der Länge 20
mit dem Namen id
und dem Kommentar Article ID
an.
<primary>
Das <primary>
Node legt ein oder mehrere Felder als Primary Keys an.
Beispiele
<primary>field_name</primary>
<primary>field_name,1field_name2</primary>
<unique>
Das <unique>
Node legt ein oder mehrere Felder als UNIQUE Felder an.
Beispiele
<unique>field_name</unique>
<unique>field_name,1field_name2</unique>
<index>
Das <index>
Node bestimmt, dass das angegebene Feld indexiert wird.
Beispiel
<index>field_name</index>
<comment>
Mit dem <comment>
Node ist es möglich Datenbank Kommentare für die Tabellen festzulegen. Ein <comment>
ist optional und muss nicht angegeben werden. Ein <comment>
dient rein zur Orientierung und zur Verständlichkeit für andere Entwickler.
PHP Methode ausführen
Über <global>
kann ein execute attribute gesetzt werden. In diesem Attribut kann eine PHP Methode deklariert werden, welche bei dem Setup ausgeführt werden soll.
Beispiel
<?xml version="1.0" encoding="UTF-8"?>
<database>
<global execute="\\QUI\\Countries\\Setup::setup"></global>
</database>
Projekt Tabellen und Site Objekt
Wenn in einem Plugin eine Projekttabelle angelegt wird, sind die Daten direkt in dem Siteobjekt vorhanden. Das Attribut setzt sich wie folgt zusammen: Packet.Packet.Tabelle.Attribute
Nehmen wir an, Sie legen eine Tabelle namens Liste im Plugin firma/plugin an.
<table name="liste">
<field type="text">erstes_feld</field>
<field type="text">zweites_feld</field>
</table>
Das Siteobjekt besitzt dadurch zwei weitere Eigenschaften.
$Site->getAttribute( 'firma.plugin.liste.erstes_feld' );
$Site->getAttribute( 'firma.plugin.liste.zweites_feld' );
no-auto-update="1"
In manchen Fällen ist es nötig, dass Daten nicht automatisiert in das Site-Objekt gespeichert werden. Wenn Sie während des Speicherns (->save()) kein automatisiertes Füllen der extra Projekt Tabellen möchten, setzen Sie no-auto-update auf "1"
<table name="project_extra_table_name" no-auto-update="1">
no-site-reference="1"
Möchten Sie eine Tabelle für jedes Projekt und jede Sprache anlegen, jedoch keine ID Beziehung haben, können Sie no-site-reference auf "1" stellen. Dies veranlasst das System keine ID Spalte für die Tabelle anzulegen.
WICHTIG: Lassen Sie das no-site-reference-Attribut weg, können keine eigenen Primärschlüssel für die Tabelle definiert werden. Der einzige Primärschlüssel ist dann id und bezieht sich immer auf die ID der Seiten-Tabelle des jeweiligen Projekts.
<table name="project_extra_table_name" no-site-reference="1">
site-types=""
Möchten Sie eine Tabelle nur für bestimmte Seitentypen nutzen, können Sie mit dem site-types Attribut die Seiten festlegen, zu welchen die Tabelle zugeordnet werden soll. Im site-types Attribut können Sie mehrere Seitentypen (durch Komma getrennt) angeben oder sogenannte Wildcards nutzen.
Als Wildcards können Sie alle gängigen Shell Patterns verwenden.
Beispiele
<!-- Alle Seitentypen die mit quiqqer/ anfangen -->
<table name="project_extra_table_name" site-types="quiqqer/*">
<!-- Nur für blog/entry und blog/list -->
<table name="project_extra_table_name" site-types="quiqqer/blog:blog/entry,quiqqer/blog:blog/list">
<!-- Nur für alle news Seitentypen -->
<table name="project_extra_table_name" site-types="quiqqer/news:news/*">
no-project-lang=""
Möchten Sie eine Tabelle nur für das Projekt verwendet und nicht für jede Projektsprache können Sie das Attribut no-project-lang verwenden?
Dieses Attribut bestimmt, das QUIQQER die Projekttabelle nur für das Projekt anlegt.
Das folgende Beispiel legt nur eine Tabelle meta für alle Projekte an.
projects1_meta projects2_meta
<?xml version="1.0" encoding="UTF-8"?>
<database>
<projects>
<table name="meta" no-project-lang="1">
<field type="bigint(20)">id</field>
<field type="varchar(2)">lang</field>
<field type="text">link</field>
</table>
</projects>
</database>
** Achtung: **
Wenn Sie no-project-lang="1"
nutzen, werden keine Site Beziehungen aufgebaut, möchten Sie Site Daten trotzdem speichern müssen Sie dies über die Site Events erledigen und dies in der events.xml definieren.
Damit Sie im PHP Code den Tabellennamen auflösen können, helfen Ihnen folgende Methoden:
<?php
// Mit Projektsprache
$table = \QUI::getDBProjectTableName( 'mete', $Project );
// ohne Projektsprache
$table = \QUI::getDBProjectTableName( 'meta', $Project, false );
// Reine Tabelle
$table = \QUI::getDBTableName( 'meta' );
?>
Diese Methoden sollten unbedingt verwendet werden, da diese Methoden Pre- und Suffixe der Tabellen beachten.