ZMSSQLDB_config

ZMSSqldb-Konfiguration: die Verbindung zur Datenbank wird über die Auswahlliste der in der Hierarchie verfügbaren Zope-Datenbank-Connection-Objekt hergestellt. Die maximale Anzahl der Datensätze (max. Rows) dient bei großen Datenmengen dazu, den (ungefilterten) Datenstrom zwischen ZMS/Zope einzuschränken. Die Darstellung der Tabellen im ZMI (Re-Modellierung des Datenbankmodells) wird gesteuert über eine XML-basierten Konfigurationstext, die man hier frei editieren kann (XML- Struktur siehe weiter unten).

Die Re-Modellierung des SQL-Datenmodells in ZMS erfolgt python-typisch in Form einer Liste. Diese Liste repräsentiert das Datenmodell der gesamten Datenbank bzw. derjenigen Daten, für die das ZMSSqldb-Objekt ein Interface generieren soll. Im XML-Code schachtelt das primäre list-Element eine Reihe von item-Elementen, die Tabellen der Datenbank repräsentieren. Eine einzelne Tabelle ist wiederum besteht aus einer Liste von Datenfeldern, deren Detail-Definition schliesslich ebenso eine Liste von Elementen (items) ist. Die Datenfeld-Beschreibung wird modelliert als dictionary (Schlüssel/Wert-Paare); jeder Eintrag (item) der Tabellenbeschreibung besteht also aus einem Schlüssel (key-Attribut) und einen Wert (Inhalt des item-Elements).

Root              : <list>
Start Tabelle     :   <item>
                        <dictionary>
Tabellen-Details  :       <item key="id">person</item>
                          ...
Start Spalten     :       <item key="columns">
                            <list>
Start Spalte                   <item> 
                                 <dictionary>
                                   <item key="id">lastChangeDateTime</item>
                                   <item key="type">date</item>
                                   <item key="label">Zuletzt geändert</item>
                                   <item key="auto">update</item>
                                   <item key="hide" type="int">1</item>
                                 </dictionary>
Ende Spalte       :            </item>
                               ...
Ende Spalten      :         </list>
                          </item>
                        </dictionary>
Ende Tabelle      :   </item>
Weitere Tabelle   :   <item>
                      ...   
                      </item>
Ende Root         : </list>

Eine Tabelle wird anhand von fünf Eigenschaften (je als items) spezifiziert:

  1. id: Tabellenname [muss identisch zum Name in der Datenbank sein]
  2. label (Feldbezeichner) [string]
  3. type (Deklaration desTabellentyps, z.B. intersection für n:m-Relationen)
  4. interface (Java-Script-Element für clientseitige Eingabe-Validierung)
  5. columns (Spalten des Daten-Tabelle)

Die Spalten der Tabelle (columns-item) werden wiederum über eine Listen-Struktur dargestellt; jedes Element der Tabelle (Spalte) wird item-Element repräsentiert, das die Spalten-Eigenschaften (Datentypen) in Form von Schlüssel-Wert-Paaren enthält. Für die Beschreibung der Datenfelder einer Spalte stehen folgende Elemente zur Verfügung:

  1. id: Spaltenname [muss identisch zum string der DB-Tabellen-ID sein]
  2. label: Feldbezeichner für ZMS-Interface [string]
  3. type: Daten- bzw. Formularelement-Typ [string | text | date | int ]
  4. hide: verhindert Anzeige im Übersichts-Grid [int: 0|1]*
  5. auto: automatischer, DB-generierter Wert [int: 0|1]*
  6. mandatory: Pflichtfeld (Kennzeichnung) [int: 0|1]*
  7. pk: primary key, Feld ist Primärschlüssel [int: 0|1]*
  8. password: maskiert Inhalt des Eingabefeldes [int: 0|1]*
  9. index: Position des Elements in der Darstellung-Reihenfolge [int]*
  10. checkbox: Darstellung einer Checkbx [int: 0|1]*

Elemente zur Beschreibung von wählbaren Wertevorgaben bzw. Bezugstabellen:

  1. fk: foreign key, Fremdschlüssel; Element bescheibt Referenz-Tabelle, indem es eine Container für die relevanten Elemente der Bezugstabelle auflistet (tablename, fieldname, displayfield) [list]
  2. multiselect: Mehrfachauswahl, schachtelt fk-Element für die Konstruktion einer intersection-basierten Mehrfachauswahl (s.u.) [dictionary]
  3. options: Einfachauswahl, schachtelt Liste von Options-Werten [dictionary]
  4. displayfield (Feldname, der statt des fk-Feldes angezeigt wird) [string]
  5. multimultiselect (Container für Auswahlkombinationen, s.u.)
  6. tables: Container für eine Liste von Tabellenreferenzen, die für die Kombination von Auswahlfeldern, multimultiselect herangezogen werden

* HINWEIS: für diejenigen items, die Zahlenwerte (0|1) als Inhalt haben (z.B. hide oder index) ist die Datentyp-Angabe per XML-Attribute (type=“int“) erforderlich.

Damit eine Tabelle per ZMI überhaupt editierbar ist, muss zumindest ein Element mit eindeutigem Primärschlüssel (pk) definiert sein. Beispielsweise sieht eine einfache Tabelle „persons“ aus ID (primary key), Name und Vorname in ihrer XML-Modellierung folgendermaßen aus:

<list>
<!-- ########################################
     ### persons
     ######################################## -->
 <item>
  <dictionary>
   <item key="id">persons</item>
   <item key="label">Personen</item>
   <item key="columns">
    <list>
     <item>
        <dictionary>
           <item key="id">id</item>
           <item key="label">ID</item>
           <item key="pk" type="int">1</item>
       </dictionary>
     </item>
     <item>
       <dictionary>
           <item key="id">name</item>
           <item key="label">Name</item>
       </dictionary>
     </item>
     <item>
       <dictionary>
           <item key="id">vorname</item>
           <item key="label">Vorname</item>
       </dictionary>
     </item>
    </list>
   </item>
  </dictionary>
 </item>
</list>

Die Darstellung des Konfigurations-Codes in Form der Eingabe-Maske übernimmt die Produkt-Methode \zms\dtml\zmssqldb\input_form.dtml. Das Masken-Element wird in der Regel automatisch gewählt (z.B. Datum-Selektor für DATE-Felder). Bei Bedarf lässt sich mit dem type-Element ein Feldtyp explizit deklarieren, z.B. text-Feld bei varchar(255).

<item>
  <dictionary>
    <item key="id">comments</item>
    <item key="label">Comments</item>
    <item key="hide" type="int">1</item>
    <item key="type">text</item>
  </dictionary>
</item>