Anleitung
1. Arten der Darstellung und Konfiguration
Es gibt bei bncms 3 Möglichkeiten das CRUD zu konfigurieren und darzustellen. CRUD heisst Create Read Update Delete und bezeichnet die Darstellung und Bearbeitung von Datenbankinhalten. CRUD ist die Kernkompetenz von bncms.
-
Darstellung im Adminbereich durch GrundkonfigurationDarstellung der Tabellen / Formulare im Adminbereich unter Daten und Konfigration im Adminbereich unter Konfigration (Grundkonfiguration).
-
Darstellung im Frontend durch GrundkonfigurationDarstellung der Tabellen / Formulare im Frontendbereich und Konfigration im Adminbereich (Grundkonfiguration)
-
Darstellung im Frontend durch manuelle Konfiguration Darstellung der Tabellen / Formulare im Frontendbereich und Konfigration im Quellcode (manuelle Konfiguration). Geschieht durch ein Array das bei den Funktionsaufrufen mitgegeben wird.
Die Grundidee von bncms ist es, dass man Datentabellen im Backend und Frontend äusserst einfach durch einmalige Konfiguration zugänglich machen kann. Dies durch Konfiguration über eine Benutzeroberfläche folgend Grundkonfiguration genannt. Die Tabellen, ihre Felder und Relationen können so zentral konfiguriert werden und die Darstellungen in Front- und Backend greifen dann immer wieder auf diese Einstellungen zurück.
Wenn man zum Beispiel ein Formular im Frontend darstellen möchte und gleichzeitig die dazugehörenden Daten im Adminbereich zugänglich machen will (das ist ja eine immer wiederkehrende Aufgabenstellung), benötigt dies mit herkömmlichen Mitteln mehrfache Konfigurationen, einerseits für das Frontend und andererseits für die Darstellung im Adminbereich (für jede weitere Darstellung der Tabelle würden zusätzliche Konfigurationen notwendig). Mit bncms kann man eine Datenbanktabelle einmalig zentralisiert konfigurieren und immer wenn dann mit der Tabelle im Frontend oder Backend gearbeitet wird wird auf diese Konfiguration zurückgegriffen.
Man muss nur den entsprechenden Befehl displayTable() für die Tabellendarstellung oder displayRow() für das Formular ausführen. Wenn Änderungen an der Konfiguration vorgenommen werden müssen kann das über die manuelle Konfiguration (aManualFieldProperties-Array) geschehen.
Ausserdem wird es möglich, da die Konfigruation vollständig über eine Benutzeroberfläche ablaufen kann, dass man CRUD ganz ohne Kenntnisse von Programmierung durchführen kann eben wie beschreiben in 1.2 Darstellung im Adminbereich durch Grundkonfiguration.
Unter 1.2 bis 1.4 werden die drei Arten erklärt.
1.1 Installation des Skripts
- Hochladen des Skripts
- Eintragen des Datenbanklogins in die Datei inc/configuration/db-settings.inc.php
- Eintragen der Pfad-Konstanten in die Dateien bncms/start.inc.php für das Frontend und bncms/admin/start.inc.php. Das Frontend liegt meist auf der Grundebene und der Adminbereich im Ordner /bncms/admin.
- Login unter bncms/admin mit admin/admin
- Klick auf "Konfiguration".
- Neue Tabellen hinzufügen durch Klick auf "Neue Tabelle"
- Falls die Tabellen bereits in der Datenbank angelegt sind können die Felder importiert werden durch Klick auf "Struktur runterladen". Ansonsten Felder von Hand anlegen durch Ausklappen der Tabellennamen und dann auf "Feld erstellen". Danach muss die "Struktur hochgeladen" werden, immer wenn Änderungen an der MySQL Struktur vorgenommen wurden.
- Bei den Feldern die Typen wählen. Nto1 für n zu 1 Relationen. Tinymce für Wysiwyg-Editor (HTML Editor), Textarea, Datum für Unixtimestamp und Kalender, Passwort, Nummer, Bild für Bildupload usw.
- Den Feldern auch die Sichtbarkeit und Editierbarkeit der Benutzer zuweisen (unchangeable, hidden)
- Eventuell Tabellen n zu m Relationen zuweisen durch Klick auf "n zu m Relation erstellen".
- Danach "Struktur hochladen" um die Änderungen abzuspeichern und eventuelle Änderungen an der Datenbank vorzunehmen. (n zu m Tabellen erstellen, Felder und Tabellen in MySQL erstellen usw)
- Sichtbarkeit der Relationen konfigurieren unter "Konfiguration > Relationen-Sichtbarkeit". Dies ist notwendig damit die relationierten Daten angezeigt werden, sie erscheinen als Ordnersymbol bei den Einträgen. Am besten Sie aktivieren einmal alle für ihren Benutzer um zu sehen wie es funktioniert.
- Dann können die Daten betrachtet und bearbeitet werden unter "Daten".
- Redakteur Logins erstellen und ihnen Felder und Tabellen zuweisen.
1.1 Darstellung im Adminbereich durch Grundkonfiguration
Bei dieser Vorgehensweise gibt man Tabellen im Adminbereich von bncms unter Daten aus und man konfiguriert sie auch über den Adminbereich unter Konfiguration. Es ist dazu kein Funktionsaufruf oder Eingreifen in den Code nötig und auch kein FTP-Zugriff.
1.1.1 Grundkonfiguration einer einfachen Tabelle Beispiel Kontaktanfragen
So konfiguriert man eine Tabelle im
Adminbereich:
- Unter "Konfiguration" auf "Neue Tabelle". Name "contact" und sichtbar für Admin auswählen.
- Danach auf "Struktur runterladen" klicken um die Felder zu importieren, falls die Tabelle schon in der Datenbank existiert. Ansonsten erstellen der Felder title, text, name, email, date durch Feld hinzufügen und danach "Struktur hochladen" und "Querystack ausführen" um die Felder und Tabelle in der Datenbank zu erstellen.
- Dann sollte man den Feldern noch Typen zuweisen, für text würde ich Textarea wählen und für date den Typ Date. Bei den anderen ist Textfield (Standart) in Ordnung.
- Bei den Feldern id und date müssen bei hidden webuser gewählt werden, sonst werden sie im Frontend angezeigt.
- Bei den Feldern name, email, text und title müssen required gewählt werden und es kann eine min_length gewählt werden. Das ist für die Validierung, damit sie nicht leer abgeschickt werden können.
- Dann kann man die Tabelle ihm
Backend bearbeiten unter "Daten".
1.2 Darstellung im Frontend durch Grundkonfiguration
Diese Vorgehensweise bedeutet, dass man Tabellen im Adminbereich konfiguriert und im Frontend ausgibt mit displayTable oder displayRow. Die Tabelle muss beim Funktionsaufruf mit der ID angesprochen sonst nimmt es nicht die Konfiguration vom Backend. Dann können die Tabellen-, Feld- und Relationseigenschaften überschreiben werden mit dem aManualFieldProperties-Array.
1.2.1 Nötige Inkludierungen für Verwendung im Frontend
In die Datei project_config.php, die auf der Grundebene des Projekts liegt, kommt folgendes
<?
define(RELATIVEPATHAPP,"");
define(APPNAME,"bncms");
define(ADMINMAIL, "email@adresse.ch");
define(SALT, "SALT WERT VERGEBEN");
?>
Vor jeder anderen Ausgabe in den Dateien in welchen mit bncms gearbeitet werden soll kommt folgendes
<? include("bncms/start.inc.php"); ?>
In den HTML-Kopfbereich der Dateien in welchen mit bncms gearbeitet werden soll kommt folgendes
<script type="text/javascript" src="bncms/jquery.js"></script>
<script type="text/javascript" src="bncms/lib/jquery-visible-master/jquery.visible.js"></script>
<script>RELATIVEPATH = "<?= RELATIVEPATH?>";</script>
<script type="text/javascript" src="bncms/frontend.inc.js"></script>
<link rel="stylesheet" href="bncms/lib/jquery-ui/jquery-ui.min.css">
<script src="bncms/lib/jquery-ui/jquery-ui.min.js"></script>
<link rel="stylesheet" href="bncms/frontend.css">
1.2.1 Generierung eines einfachen Formulars: Beispiel Kontaktformular
Meist schreiben Formulare nur in eine Tabelle. Dieser Fall ist standardmässig vorbereitet und man kann das gesamte Formular samt Validierung, Speicherung und Sicherheit mit nur einem Funktionsaufruf ausgeben. Falls in mehrere Tabellen gespeichert werden soll kann das einfach in die After-Funktion reingeschrieben werden mit simplen MySQL-Anfragen, dabei muss allerdings auf korrektes escapen mit mysql_real_escape_string geachtet werden.
In den Körper kommt dies
<h3>Kontaktformular</h3><br>
<?
if ($_POST[after] == "after_contact") {
mail("", $_POST[title], $_POST[text]);
echo "<script> alert('Nachricht gesendet.');</script>";
}
$q = "CREATE TABLE IF NOT EXISTS `contact` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(25) NOT NULL default '',
`email` varchar(50) NOT NULL default '',
`title` varchar(50) NOT NULL default '',
`text` text NOT NULL default '',
`date` int(30) NOT NULL default '0',
PRIMARY KEY (`id`)
)";
q($q);
displayRow(
'',
'id',
'NUMMER_DER_TABELLE_IM_ADMINBEREICH',
"<input type=hidden name=after
value='after_contact'><input type=hidden name=date value='".time()."'>",
"",
$a
);
?>
Jetzt muss die Tabelle konfiguriert werden im Adminbereich (Grundkonfiguration). Wie das geschieht ist unter 1.1.1 beschrieben.
1.2.2 Generierung einer read-only Tabelle: Beispiel Kontaktanfragen
Jetzt gebe ich die Tabelle einfach aus in die mit dem vorherigen Kontakformular rein geschrieben wird. Dazu brauche ich eigentlich nur diesen einfachen Befehl. Die Konfiguration von project_config.php und den Code im Kopfbereich sowie die Inkludierung der start.inc.php ist gleich wie im Formular-Beispiel. Die Nummer der Tabelle contact im Backend ist 4, es wird als alt-Text der Tabellentitel in der "Daten"-Ansicht angezeigt.
<h3>Kontaktanfragen</h3><br>
<?php
displayTable(4,"id");
?>
Kontaktanfragen
1.2.3 Überschreiben von Feldeigenschaften:
Jetzt ist es so, dass das Datum im
Adminbereich für die Frontendbenutzer (webuser) versteckt wurde (hidden). Das ist damit die Benutzer das Datum im Formular nicht eingeben können, sondern das Datum soll für den Benutzer unsichtbar generiert werden. Das haben wir über das versteckte Feld date gemacht, das geschieht über den Code <input type=hidden name=date value='".time()."'>. Es ginge zwecks Sicherheit auch in der After-Funktion after_contact. Wir wollen jetzt das Datum Feld aber in der tabellarischen Ansicht anzeigen lassen, deswegen gibt es das Array aManualFieldProperties. Damit kann man die Feldeigenschaften manuell bei der Generierung überschreiben. Es ist der 21. Parameter. Der Schlüssel der ersten Ebene ist der Name der Tabelle oder die Nummer der Tabelle mit. Der zweite Schlüssel ist entweder "table" für Tabelleneigenschaften, "fields" für die Feldeigenschaften. Der dritte Schlüssel ist der Name des Feldes. Der vierte Schlüssel ist die Eigenschaft. In dem Fall hidden. Der Wert ist "no".
<?
$a = array();
$a["4"]["fields"]["date"]["hidden"] = "no";
displayTable(
4,
"id",
"",
"",
"",
"",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"no",
"",
"",
"",//20
$a
);
?>
1.2.4 Überschreiben der Tabelleneigenschaften: Editors, Addors und Deletors
Im Adminbereich kann man den Tabellen zuweisen welche Benutzer sie sehen, bearbeiten, hinzufügen und löschen können. Der webuser, das sind die Frontendbenutzer, ist bei allen nicht aktiviert. Das heisst, wenn displayTable ausgeführt wird, ist die Tabelle read-only. Wir können diese Werte auch über aManualFieldProperties überschreiben.
<?
$a = array();
$a["4"]["fields"]["date"]["hidden"] = "no";
$a["4"]["table"]["editors"] = array("webuser");
$a["4"]["table"]["deletors"] = array("webuser");
$a["4"]["table"]["addors"] = array("webuser");
displayTable(
4,
"id",
"",
"",
"",
"",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"no",
"",
"",
"",//20
$a,
"",
"",
""
);
?>
1.2.5 Anzeigen relationierter Daten: showRelations
Um zu zeigen wie das funktioniert habe ich im Adminbereich unter "Konfiguration" eine Tabelle spam_not_spam erstellt und in dieser Tabelle habe ich ein Feld name angelegt. Ich habe in der Tabelle zwei Einträge erstellt, der erste mit Namen Spam und der zweite mit dem Namen Kein Spam. Dann habe ich in der contact Tabelle ein Feld erstellt spam_id und den Typ nto1 gegeben (nto1TargetTable: spam_not_spam, nto1TargetField: id, nto1DisplayType: dropdown, nto1DropdownTitleField: name). Unter Konfiguration > Relationen-Sichtbarkeit habe ich in contacts und spam_not_spam alle Einträge von admin und webuser aktiviert. Ich habe in der displayTable Anfrage den 17. Parameter showRelations aktiviert durch "yes".
<?
$a = array();
$a["4"]["fields"]["date"]["hidden"] = "no";
$a["4"]["fields"]["spam_id"]["hidden"] = "no";
$a["4"]["table"]["editors"] = array("webuser");
$a["4"]["table"]["deletors"] = array("webuser");
$a["4"]["table"]["addors"] = array("webuser");
displayTable(
4,
"id",
"",
"",
"",
"yes",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",//20
$a
);
?>
Dies die Ansicht von der Seite von contact her. Wir können es aber auch von der spam_not_spam Seite aus anzeigen lassen. Die Nummer der Tabelle ist 9, das aManualFieldProperties Array brauchts nicht mehr. Wenn wir jetzt auf die Ordnersymbole klicken bei den Feldern Spam und Nicht Spam kriegen wir eine Auflistungen aller Spam Nachrichten, bzw. aller nicht Spam Nachrichten.
<?
displayTable(
9,
"id",
"",
"",
"",
"yes",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"yes"
);
?>
1.2.6 Umwandlung von Feldinhalten: sUserFunction
In der Spalte spam_id wird jetzt in der Tabelle einfach die ID angezeigt von den Einträgen in der spam_not_spam Tabelle. Das ist natürlich nicht besonders schön und wir möchten dort, dass es gleich übersetzt wird in das Namensfeld. Ausserdem wird bei n zu 1 Relationen wenn das Feld nto1DropdownTitleField gewählt wird das Suchfeld für die Spalte oben gleich umgewandelt in ein ajax autocomplete Feld das dem nto1DropdownTitleField zugeordnet ist. Wenn wir also dort "S" eingeben können wir wählen Spam und Nicht Spam. Die Umwandlung geschieht über eine Benutzerfunktion. Es ist der 22. Parameter mit dem Namen sUserFunction. Wir schreiben dort rein userFuncContact.
<?
$a = array();
$a["4"]["fields"]["date"]["hidden"] = "no";
$a["4"]["fields"]["spam_id"]["hidden"] = "no";
displayTable(
4,
"id",
"",
"",
"",
"yes",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",//20
$a,
"userFuncContact"
);
?>
In der Datei project_config.php erstellen wir dann die Funktion userFuncContact. Die Funktion durchläuft alle Felder eines Eintrags und macht das mit allen Einträgen. In der Variable $field steht jeweils der Inhalt des aktuellen Feldes, in der $key steht der Schlüssel / Spaltenname des aktuellen Feldes und in der $row ist ein Array mit allen Feldern und Spalten des aktuellen Eintrags. Dies ist wichtig, da oft Inhalte von anderen Spalten des Eintrags verwendet werden müssen zur Generierung des aktuellen Feldes. Wenn wir jetzt nur das spam_id Feld überschreiben wollen, müssen wir erst die Bedingung if ($key == 'spam_id') formulieren. Dann machen wir eine einfache MySQL-Anfrage um den aktuellen Wert von Spam / Nicht Spam aus der Datenbank zu holen. So ist es schöner gelöst, wir hätten auch einfach 1 = Spam, 2 = Nicht Spam schreiben können aber wenn jetzt die Namen angepasst werden in der Spam Tabelle, werden sie auch automatisch hier übernommen. Dann überschreiben wir den Wert von $field mit dem Namen und geben das $field zurück mit return. Das ist wichtig und muss in jeder Benutzerfunktion ausgeführt werden ansonsten werden alle Felder leer.
function userFuncContact ($field, $key, $row) {
if ($key == "spam_id") {
$q = "SELECT * FROM spam_not_spam WHERE id = '$field'";
$a = q($q);
$field = $a[name];
}
return $field;
}
1.2.7 Manuelle Feldeigenschaften des Bearbeitungs-Formulars
Wenn wir auf hinzufügen oder bearbeiten klicken in der Tabelle wird im erscheinenden Formular das Datum Feld angezeigt. In der Grundkonfiguration im Adminbereich haben wir es für den webuser versteckt, dann wollten wir die Fuktionalität der Tabelle zeigen und haben es daher manuell wieder aktiviert in der tabellarischen Ansicht. Wenn wir aber den Eintrag jetzt bearbeiten über das Bleistift in der Tabelle wollen wir das Datum doch wieder anzeigen lassen aber es soll nicht bearbeitbar sein. Dazu gibt es einen zusätzlichen Schlüssel in aManualFieldProperties, er wird eingefügt nach dem ersten Schlüssel (Tabellenname oder ID) und heisst "bncms_edit_form". Damit können wir die Form spezifischen Tabellen und Feld-Eigenschaften überschreiben. Es wendet also erst die Grundkonfiguration an, dann die Manuellen Feldeigenschaften der Tabelle und dann die Eigenschaften von bncms_edit_form.
<?
$a = array();
$a["4"]["fields"]["date"]["hidden"] = "no";
$a["4"]["fields"]["spam_id"]["hidden"] = "no";
$a["4"]["table"]["editors"] = array("webuser");
$a["4"]["table"]["deletors"] = array("webuser");
$a["4"]["table"]["addors"] = array("webuser");
$a["4"]["bncms_edit_form"]["fields"]["date"]["unchangeable"] = "yes";
displayTable(
4,
"id",
"",
"",
"",
"",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",//20
$a,
"userFuncContact"
);
?>
1.3 Darstellung im Frontend durch manuelle Konfiguration
1.3.1 Darstellung einer Tabelle aus der Datenbank
Wir wollen eine Tabelle, die bereits in der Datenbank vorhanden ist, im Frontend anzeigen. Wir nehmen die Tabelle orders. Eigentlich brauchen wir dazu erstmal nur den Befehl displayTable('orders','id'). Dann sehen wir wie die Tabelle in Rohforum aussieht ohne jede Konfiguration. Wenn wir eine Tabelle mit dem Namen ansprechen verzichten wir auf jede Grundkonfiguration aus dem Adminbereich. Wenn wir die Grundkonfiguraiton verwenden wollen müssen wir die Tabelle über die ID ansprechen.
<?
displayTable("orders","id");
?>
1.3.2 Typen und Titel per manueller Konfiguration zuweisen
Jetzt wollen wir per manueller Konfiguration erstmal die Titel der Felder umwandeln auf Deutsch über die Titel-Eigentschaft und wir weisen den Feldern die entsprechenden Typen zu. Das id-Feld kriegt den number-Typ, title textfield, address_id nto1, state textfield, price price, user_id nto1 und date erhält den date-Typ.
<?
$a = array(
"orders" => array(
"fields"=> array(
"id" => array(
"type"=>"number",
"title"=>"ID"
),
"title" => array(
"type"=>"textfield",
"title"=>"Titel"
),
"address_id" => array(
"type"=>"number",
"title"=>"Adresse"
),
"state" => array(
"type"=>"textfield",
"title"=>"Status"
),
"price" => array(
"type"=>"price",
"title"=>"Preis"
),
"user_id" => array(
"type"=>"nto1",
"title"=>"Benutzer",
"nto1TargetTable"=>"users",
"nto1TargetField"=>"id",
"nto1DropdownTitleField"=>"name",
"nto1DisplayType"=>"radio",
"relationId"=>3
),
"date" => array(
"type"=>"date",
"title"=>"Datum"
)
)
)
);
displayTable(
"orders",
"id",
"",
"",
"",
"",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",//20
serialize($a),
"",
"",
""
);
?>
1.3.2 Tabelle bearbeitbar machen (bearbeiten, löschen, erstellen)
Jetzt machen wir die Tabelle bearbeitbar. Wir müssen einen Schlüssel table erstellen für die Tabelleneigenschaften und müssen die Schlüssel editors für die Benutzer die bearbeiten können, deletors für die löschen können und addors für die hinzufügen können erstellen. Als Wert muss ein Array eingefügt werden mit den Benutzernamen. Da es im Frontend dargestellt werden soll müssen wir den Benutzer webuser hinzufügen. Das Array ist eigentlich gedacht für die Benutzernamen im Adminbereich, im Frontend gibt es nur den Webuser, die Adminbenutzer existieren im Frontend nicht.
<?
$a = array(
"orders" => array(
"table"=> array(
"editors"=> array( "webuser"),
"deletors"=> array( "webuser"),
"addors"=> array( "webuser")
),
"fields"=> array(
"id" => array(
"type"=>"number",
"title"=>"ID"
),
"title" => array(
"type"=>"textfield",
"title"=>"Titel"
),
"address_id" => array(
"type"=>"number",
"title"=>"Adresse"
),
"state" => array(
"type"=>"textfield",
"title"=>"Status"
),
"price" => array(
"type"=>"price",
"title"=>"Preis"
),
"user_id" => array(
"type"=>"nto1",
"title"=>"Benutzer",
"nto1TargetTable"=>"users",
"nto1TargetField"=>"id",
"nto1DropdownTitleField"=>"name",
"nto1DisplayType"=>"radio",
"relationId"=>3
),
"date" => array(
"type"=>"date",
"title"=>"Datum"
)
)
)
);
displayTable(
"orders",
"id",
"",
"",
"",
"",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",//20
serialize($a),
"",
"",
""
);
?>
1.3.2 Relationen konfigurieren
Jetzt zeige ich wie die Verbindungen zu den anderen Tabellen konfiguriert werden. Es gibt bei orders 2 ausgehende n zu 1 Relationen zu im Feld address_id zu der Tabelle address und im Feld user_id zur Tabelle user. Desweiteren gibt es eine n zu m Relation zu Produkten, n zu m heisst sie weil viele Bestellungen viele Produkte haben können. Bei n zu 1 Bestellungen können viele Bestellungen nur einen Benutzer oder nur eine Adresse haben. Ausserdem gibt es noch eine eingehende n zu 1 Relation zu Bestellungen von einer anderen Tabelle.
1.3.2 n zu 1 Relationen konfigurieren
Address_id und user_id werden jetzt als n zu 1 konfiguriert. Wir können dazu die Eigenschaften die auch über den Adminbereich zugewiesen werden können ins Array eintragen. Es sind die folgenden: type (nto1), nto1TargetTable(Namen der Zieltabelle als Klartext), nto1TargetField (das Zielfeld welches die verweisende Nummer), nto1DropdownTitleField (das Feld mit dem Titel in der Zieltabelle in welchen die Nummer umgewandelt werden soll), nto1DisplayType (wie die Auswahl der Einträge dargestellt werden soll), relationId (die Nummer der Relation im Manuellen Konfiguationsarray). Zudem muss die Relation selbst in das Konfigurationsarray eingetragen werden. Dort können wir die Sichtbarkeit und Titel der Relation bestimmen. Das sind die Eigenschaften die im Adminbereich unter Konfiguration > Relationen Sichtbarkeit festgelegt werden können. Der Schlüssel ist bncms_relation_visibility und die Id der Relation ist der erste Schlüssel in dem Array.
<?
$a = array(
"bncms_relation_visibility" => array(
1 => array(
"path" => "orders-1",
"icon" => "../file/relation-icons/800918Jellyfishs.jpg",
"title" => "Adresse der Bestellung",
"users" => array("webuser"),
"showWithEditIcons" => "Beide"
)
),
"orders" => array(
"table"=> array(
"editors"=> array( "webuser"),
"deletors"=> array( "webuser"),
"addors"=> array( "webuser")
),
"fields"=> array(
"id" => array(
"type"=>"number",
"title"=>"ID"
),
"title" => array(
"type"=>"textfield",
"title"=>"Titel"
),
"address_id" => array(
"type"=>"number",
"title"=>"Adresse"
),
"state" => array(
"type"=>"textfield",
"title"=>"Status"
),
"price" => array(
"type"=>"price",
"title"=>"Preis"
),
"user_id" => array(
"type"=>"nto1",
"title"=>"Benutzer",
"nto1TargetTable"=>"users",
"nto1TargetField"=>"id",
"nto1DropdownTitleField"=>"name",
"nto1DisplayType"=>"radio",
"relationId"=>3
),
"date" => array(
"type"=>"date",
"title"=>"Datum"
)
)
)
);
displayTable(
"orders",
"id",
"",
"",
"",
"",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",//20
serialize($a),
"",
"",
""
);
?>

Jetzt kann man beim Ordnersymbol die Relationen ausklappen und kriegt die "Adresse der Bestellung" angezeigt. Zudem wird im Feld Adresse in der Bestellungen-Tabelle die ID die gerade umgewandelt in den Nachnamen in der Adressentabelle, das ist eben die Funktionalität von nto1DropdownTitleField.
1.3.2.1 Anpassen der Eigenschaften der relationierten Tabelle
Jetzt wollen wir die Feldtypen und Titel in der relationierten Tabelle Adresse anpassen. Wir können es gleichartig einfach ins Array eintragen. Müssen dazu den Schlüssel address erschaffen.
<?
$a = array(
"address" => array(
"table"=> array(
"editors"=> array( "webuser"),
"deletors"=> array( "webuser"),
"addors"=> array( "webuser")
),
"fields"=> array(
"id" => array(
"type"=>"number",
"title"=>"ID"
),
"firstname" => array(
"type"=>"textfield",
"title"=>"Vorname"
),
"lastname" => array(
"type"=>"textfield",
"title"=>"Nachname"
),
"address" => array(
"type"=>"textfield",
"title"=>"Addresse"
),
"zip" => array(
"type"=>"number",
"title"=>"PLZ"
),
"city" => array(
"type"=>"textfield",
"title"=>"Stadt"
),
"country" => array(
"type"=>"textfield",
"title"=>"Land"
),
"state" => array(
"type"=>"textfield",
"title"=>"Bezirk"
),
"user_id" => array(
"type"=>"nto1",
"title"=>"Benutzer",
"nto1TargetTable"=>"users",
"nto1TargetField"=>"id",
"nto1DropdownTitleField"=>"name",
"nto1DisplayType"=>"radio",
"relationId"=>3
)
)
),
"bncms_relation_visibility" => array(
1 => array(
"path" => "orders-1",
"icon" => "../file/relation-icons/800918Jellyfishs.jpg",
"title" => "Adresse der Bestellung",
"users" => array("webuser"),
"showWithEditIcons" => "Beide"
)
),
"orders" => array(
"table"=> array(
"editors"=> array( "webuser"),
"deletors"=> array( "webuser"),
"addors"=> array( "webuser")
),
"fields"=> array(
"id" => array(
"type"=>"number",
"title"=>"ID"
),
"title" => array(
"type"=>"textfield",
"title"=>"Titel"
),
"address_id" => array(
"type"=>"number",
"title"=>"Adresse"
),
"state" => array(
"type"=>"textfield",
"title"=>"Status"
),
"price" => array(
"type"=>"price",
"title"=>"Preis"
),
"user_id" => array(
"type"=>"nto1",
"title"=>"Benutzer",
"nto1TargetTable"=>"users",
"nto1TargetField"=>"id",
"nto1DropdownTitleField"=>"name",
"nto1DisplayType"=>"radio",
"relationId"=>3
),
"date" => array(
"type"=>"date",
"title"=>"Datum"
)
)
)
);
displayTable(
"orders",
"id",
"",
"",
"",
"",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",//20
serialize($a),
"",
"",
""
);
?>
1.3.3 Relationen Hierarchie
Jetzt konfigurieren wir noch die Zuordnung von user_id (und geben der Relation die Nummer 2) und zwar tun wir es auch gleich noch in der relationierten Tabelle Adresse, dort gibt es ja auch das Feld user_id weil die Adressen darüber auch dem Benutzer zugeordnet sind, (und geben dieser Relation die Nummer 3) und erstellen so eine erste Hierachie von Relationen.
<?
"address" => array(
"fields"=> array(
"id" => array(
"type"=>"number",
"title"=>"ID"
),
"firstname" => array(
"type"=>"textfield",
"title"=>"Vorname"
),
"lastname" => array(
"type"=>"textfield",
"title"=>"Nachname"
),
"address" => array(
"type"=>"textfield",
"title"=>"Addresse"
),
"zip" => array(
"type"=>"number",
"title"=>"PLZ"
),
"city" => array(
"type"=>"textfield",
"title"=>"Stadt"
),
"country" => array(
"type"=>"textfield",
"title"=>"Land"
),
"state" => array(
"type"=>"textfield",
"title"=>"Bezirk"
),
"user_id" => array(
"type"=>"nto1",
"title"=>"Benutzer",
"nto1TargetTable"=>"users",
"nto1TargetField"=>"id",
"nto1DropdownTitleField"=>"name",
"nto1DisplayType"=>"dropdown",
"relationId"=>3
)
)
),
"bncms_relation_visibility" => array(
1 => array(
"path" => "orders-1",
"title" => "Adresse der Bestellung",
"users" => array("webuser"),
"showWithEditIcons" => "Normal"
),
2 => array(
"path" => "orders-2",
"title" => "Benutzer der Bestellung",
"users" => array("webuser"),
"showWithEditIcons" => "Normal"
),
3 => array(
"path" => "orders-1-3",
"title" => "Benutzer der Adresse",
"users" => array("webuser"),
"showWithEditIcons" => "Normal"
)
),
"orders" => array(
"table"=> array(
"editors"=> array( "webuser"),
"deletors"=> array( "webuser"),
"addors"=> array( "webuser")
),
"fields"=> array(
"id" => array(
"type"=>"number",
"title"=>"ID"
),
"title" => array(
"type"=>"textfield",
"title"=>"Titel"
),
"address_id"=> array(
"type"=>"nto1",
"title"=>"Adresse",
"nto1TargetTable"=>"address",
"nto1TargetField"=>"id",
"nto1DropdownTitleField"=>"lastname",
"nto1DisplayType"=>"dropdown",
"relationId"=>1
),
"state" => array(
"type"=>"textfield",
"title"=>"Status"
),
"price" => array(
"type"=>"price",
"title"=>"Preis"
),
"user_id" => array(
"type"=>"nto1",
"title"=>"Benutzer",
"nto1TargetTable"=>"address",
"nto1TargetField"=>"id",
"nto1DropdownTitleField"=>"lastname",
"nto1DisplayType"=>"dropdown",
"relationId"=>2
),
"date" => array(
"type"=>"date",
"title"=>"Datum"
)
)
)
);
displayTable(
"orders",
"id",
"",
"",
"",
"",
"",
"",
"",
"",//10
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",//20
serialize($a),
"",
"",
""
);
?>
1.3.3.1 Die path Variable im bncms_relation_visibility-Array
Die path Variable legt fest in welcher Reihenfolge die Relationen angezeigt werden sollen. Der erste Eintrag ist die Nummer oder der Name der Starttabelle. Bei manueller Konfiguration ist es der Name bei der Grundkonfiguration die Nummer. Dann ausgehend von der Starttabelle folgen die Relationen die sichtbar sind für den Benutzer. Es geht eben um das Festlegen der Sichtbarkeit der Relationen für diesen Benutzer. In diesem Beispiel ist die Starttabelle ja die Bestellungen. Deswegen steht dort zuerst orders. Dann bei der Relation 1 soll es ja die Adresse der Bestellung anzeigen. Deswegen steht dann in der path-Variable orders-1. Klarer wie es funktioniert wird es bei der Relation 3. Das ist ja der Benutzer der Adresse. Also es startet mit der orders Tabelle, dann zeigt es die Adresse an und dann kann man in der Adressen Tabelle den Benutzer der Adresse ausklappen. Also kommt erst die erste Relation zum tragen, und dann die dritte und es steht dann in der path-Variable orders-1-3.
2 Beschreibung der Tabellen-, Feld- und Relationseigenschaften
2.1 Tabelleneigenschaften
Die Tabelleneigenschaften werden erreicht im Administrationsbereich unter Konfiguration > Tabellenname > Tabelle ändern und sie können manuell überschrieben werden im aManualFieldProperties-Array mit folgendem Syntax: $a[Tabellename oder ID]['table'][Eigenschaftsname] = 'Wert';
2.1.1 MySQL Tabellenname (name)
Name der Tabelle in der Datenbank. SQL-Bezeichnung der Tabelle. Feld ist obligatorisch. Eigenschaftsname: name. Beispiel: contacts
2.1.2 Angezeigter Name (title)
Titel der Tabelle. Name der unter Daten angezeigt wird wenn die Tabelle verwendet wird. Wenn leer wird der MySQL Tabellenname angezeigt. Eigenschaftsname: title. Beispiel: Kontaktanfragen.
2.1.3 Spaltenname der primären ID (columnNameOfId)
Name des Feldes der primären ID in der SQL Tabelle (primary id). Tabellen die in bncms verwendet werden müssen zwingendermassen mit einer primären ID ausgestattet sein. Feld ist obligatorisch. Eigenschaftsname: columnNameOfId. Beispiel: id.
2.1.4 MySQL-Bedingung (condition)
MySQL Bedingung mit der die Tabelle ausgestattet werden kann. Wird bei Anfragen an die WHERE-Klausel angehängt. Eigenschaftsname: condition. Beispiel: name = 'test'.
2.1.5 Sortierungsschlüssel (orderkey)
Stelle in der Reihenfolge wo die Tabelle im Adminbereich angezeigt wird. Eigenschaftsname: orderkey. Beispiel: 1.00.
2.1.6 Farbe interaktives Frontend (color)
Keine Funktion. Eigenschaftsname: color.
2.1.7 Einträge pro Seite (entries_per_page)
Anzahl der Einträge, die auf einer Seite der Tabelle angezeigt werden. Standartwert: 10. Beispiel: 50.
2.1.8 Standartsortierung (sort_order)
Name des Feldes nach welchem sortiert werden soll. Eigenschaftsname: sort_order. Standartwert: id. Beispiel: name.
2.1.9 Standartsortierung Aufsteigend / Absteigend: (sort_order_ascdesc)
Ob die Standartsortierung aufsteigend oder absteigend erfolgen soll. Eigenschaftsname: sort_order_ascdesc. Standartwert: Aufsteigend. Beispiel: Absteigend.
2.1.10 Export als XLS (export_xls)
Ob option zum Export als XLS angezeigt werden soll. Eigenschaftsname: export_xls. Mögliche Werte: Off, On. Standartwert: off. Beispiel: on.
2.1.11 Export als CSV (export_csv)
Ob option zum Export als CSV angezeigt werden soll. Eigenschaftsname: export_csv. Mögliche Werte: Off, On. Standartwert: off. Beispiel: on.
2.1.12 Sichtbar für die Benutzer (users)
Array, das die Benutzer enthält, die die Tabelle sehen können. Webuser ist der Name der Benutzer des Frontends. Eigenschaftsname: users. Beispiel: array('admin').
2.1.13 Editieren können die Benutzer (editors)
Array, das die Benutzer enthält, die Einträge in der Tabelle bearbeiten können. Webuser ist der Name der Benutzer des Frontends. Eigenschaftsname: deletors. Beispiel: array('admin').
2.1.14 Löschen können die Benutzer (deletors)
Array, das die Benutzer enthält, die Einträge in der Tabelle löschen können. Webuser ist der Name der Benutzer des Frontends. Eigenschaftsname: deletors. Beispiel: array('admin').
2.1.15 Hinzufügen können die Benutzer (addors)
Array, das die Benutzer enthält, die Einträge in der Tabelle hinzufügen können. Webuser ist der Name der Benutzer des Frontends. Eigenschaftsname: addors. Beispiel: array('admin').
2.1.16 Aktualisieren Button anzeigen (actualize)
Zeigt Button an mit welchem die Tabelle neu per Ajax geladen werden kann. Eigenschaftsname: actualize. Mögliche Werte: Off, On. Standartwert: off. Beispiel: on.
2.2 Feldeigenschaften
Die Feldeigenschaften werden erreicht im Administrationsbereich unter Konfiguration > Tabellenname > Feld ändern und sie können manuell überschrieben werden im aManualFieldProperties-Array mit folgendem Syntax: $a[Tabellename oder ID]['fields'][Feldname][Eigenschaftsname] = 'Wert';
2.2.1 name
Name des Feldes in der Datenbank. SQL-Bezeichnung des Felds. Feld ist obligatorisch. Beispiel: id
2.2.2 title
Titel des Felds. Name der unter Daten angezeigt wird wenn das Feld angezeigt wird. Wenn leer wird der name angezeigt. Beispiel: Identifikationsnummer
2.2.3 type
HTML-Typ des Felds. HTML-Umwandlungsart des Felds in Formularen / Tabellen. Beispiele: Bei price wird das Feld mit zwei Kommastellen angezeigt, bei date als HTML-Kalender, bei number als input mit type=number, bei tinymce als WYSIWYG-Editor.
2.2.3.1 -> Table
Nur verfügbar beim nto1-Typ. SQL-Tabellenname auf die die n zu 1 Relation verweist. Beispiel: address
2.2.3.2 -> Field
Nur verfügbar beim nto1-Typ. SQL-Feldname auf das die n zu 1 Relation verweist. Ist wohl meist die Identifikationsnummer aber kann auch ein anderes Feld sein. Beispiel: id
2.2.3.3 nto1DisplayType
Nur verfügbar beim nto1-Typ. Art wie die Relation dargestellt werden soll in den Formularen. Wenn Tabelle gewählt wurde wird zur Auswahl des verbundenen Eintrags im Formular eine Tabelle angeboten mit einer Radiobox zur Auswahl. Bei Dropdown wird eine Auswahlbox angezeigt mit bei nto1DropdownTitleField gewählten Einträgen. Mögliche Werte: radio, dropdown.
2.2.3.4 nto1DropdownTitleField
Nur verfügbar beim nto1-Typ. Titel des Eintrag der angezeigt wird anstatt der Verweis-Nummer. Bei n zu 1 Relationen steht ja normalerweise in der verweisenden Tabelle einfach eine Nummern in der SQL-Tabelle. Zwecks Benutzerfreundlichkeit wird die Nummer umgewandelt in das hier gewählte Feld in der Zieltabelle. Hauptidentifikationsfeld für Zieltabellen-Objekt, meist Titel, Name oder Label. Verwendet für die Dropdown Auswahl oder für die Suche in verweisenden Tabellen. Dieses Feld muss zwingend gewählt werden sonst funktioniert die Suche nicht. Beispiel: Bei einer Benutzer-Tabelle auf die verwiesenwird würde als nto1DropdownTitleField wohl meist das Benutzernamen-Feld (zB. name) gewählt.
2.2.4 mysql_order
Position des Feldes in der SQL-Tabelle. Änderungen ändert die Reihenfolge nicht nur in bncms sondern auch in SQL. Beispiel: 1.00.
2.2.5 unchangeable
Benutzernamen welche das Feld nur sehen können aber nicht bearbeiten. Beispiel: webuser.
2.2.6 hidden
Benutzernamen welche das Feld nicht sehen können. Beispiel: webuser.
2.2.7 mysql_type_bez
SQL-Typ des Feldes. Beispiele: varchar, int.
2.2.8 length_values
Länge oder Werte des Feldes. Wird zusammengesetzt mit mysql_type_bez beispielsweise so int(10), set('on','off',''). Beispiele: 10, int.
2.2.9 validation_required
Ob das Feld in Formularen im Frontend obligatorisch ist. Im Backend keine Wirkung. Mögliche Werte: on, off.
2.2.10 validation_unique
Ob das Feld in Formularen im Frontend nur einmal in der Datenbank vorkommen darf für Beispielsweise Email-Felder oder Benutzernamen-Felder. Im Backend keine Wirkung. Mögliche Werte: on, off.
2.2.11 validation_min_length
Mindestlänge des Feldes in Formularen im Frontend. Im Backend keine Wirkung. Beispiel: 10.
2.3 Relationseigenschaften
Die Relationseigenschaften von n zu 1 Relationen wird vorgenommen in den Feldeigenschaften durch Auswahl von nto1 bei type (2.2.3). Die Relationseigenschaften von n zu m Relationen werden konfiguriert unter Konfiguration > Tabellenname > n zu m Relationen Tabellenname > n zu m Relation bearbeiten / erstellen.
Veröffentlicht als open source.
Entwickelt von Damian Hunziker, First Good Company, hu100 at ok.de
git-Repository auf github