12.05.2016  Linktip 

Formulare

Der Dienst Formular(-framework) ermöglicht die Eingabe von Daten in ein frei erstellbares Formular. Aus der Eingabe eines Formulars können Einträge generiert werden, die durch den Formularbesitzer akzeptiert werden müssen.

Vorgehensweise und Funktionalität

  1. Registrieren eines Light Weight Benutzers
  2. Erzeugen eines Eintrags der Kategorie Formular
  3. Erstellen einer Formular-Maske (HTML)
  4. Erstellen einer Vorschrift für die Abbildung (XSLT) der erfassten Daten auf das Importformat (XML) von WebGenesis®
  5. Hochladen der Formular-Maske und der Abbildungsvorschrift als Alternative Darstellung
  6. Ausfüllen des angezeigten Formulars
  7. Abschicken des ausgefüllten Formulars
  8. Akzeptieren des untergeordneten Eintrags (bewirkt die automatische Verschiebung in einen Zieleintrag)
  9. Auflistung aller von einem Light Weight Benutzer gemachten Einträge
  10. Nachbearbeitung eines Eintrags


Formular Eintrag erzeugen

Ein neues Formular Formular kann wie gewohnt über das Menü Neu erzeugt werden (siehe Einträge erstellen). Die Metadaten eines Formulars entsprechen denen eines Standardeintrags.



Formular-Maske erstellen

Für die Erstellung der Formular-Maske wird HTML verwendet. Alle HTML-Tags, die innerhalb des <FORM>-Tags erlaubt sind, können verwendet werden. Alle Eingabetypen (<INPUT TYPE="typ">, <TEXTAREA> und <SELECT>) außer file (mit Ausnahme der Spezialattribute contents und docs) werden unterstützt. Die Formular-Maske enthält nur den Ausschnitt des HTML-Codes innerhalb des <FORM>-Tags.

Folgende Bezeichner dürfen nicht als Parameternamen verwendet werden:
  • class
  • id
  • command
  • reedit
Folgende Parameter müssen in jeder Formular-Maske angegeben werden:
categoryOfEntry ID der Kategorie, die der erzeugte Eintrag besitzen soll (z.B. Dokument, Verzeichnis, Adressbuch, ...).
destination ID eines existierenden Verzeichnisses, in das die neu erzeugten Einträge nach dem Akzeptieren verschoben werden. Der Besitzer des Formluars muss das Zugriffsrecht Hinzufügen auf dem Zieleintrag besitzen.
debug
(optional)
Wird dieser Parameter auf true gesetzt, wird kein Eintrag erzeugt, sondern der aus dem Formular erzeugte XML-Code und der XML-Code nach der Transformation engezeigt. Dieser Parameter sollte zur Fehlersuche im Formular bzw. der XSL-Transformation benutzt werden. Zur schnelleren Fehlersuche in der XSL-Transformation sollte man direkt den XSLT-Interpreter verwenden. Dieser kann mit folgender Befehlszeile gestartet werden:

java org.apache.xalan.xslt.Process -in <xmlSource>
-xsl <stylesheet> -out <outputfile>


Folgende Parameter dienen dem Upload von Dateien zu den Inhalten oder zum Layout des generierten Eintrags und eignen sich nur für diesen Zweck.
content Kann nur für input="file" verwendet werden. Eine Datei, die für dieses Feld ausgewählt wird, wird in die Inhalte des neuen Eintrags abgelegt. Handelt es sich um eine ZIP-Datei, wird diese automatisch ausgepackt.
keepContentFiles Kann nur für input="checkbox" verwendet werden. Handelt es sich um die Bearbeitung eines bereits existierenden Eintrags und ist die Checkbox markiert, werden bereits vorhandene Inhalte in den neuen Eintrag übernommen. Werden gleichnamige Dateien über den content-Parameter hochgeladen, werden die Dateien aus dem alten Eintrag überschrieben. Handelt es sich um einen neuen Eintrag, wird dieser Parameter ignoriert.
docs Kann nur für input="file" verwendet werden. Eine Datei, die für dieses Feld ausgewählt wird, wird in das Layout (alternative Darstellung) des neuen Eintrags abgelegt. Handelt es sich um eine ZIP-Datei, wird diese automatisch ausgepackt.
keepLayoutFiles Kann nur für input="checkbox" verwendet werden. Handelt es sich um die Bearbeitung eines bereits existierenden Eintrags und ist die Checkbox markiert, werden bereits vorhandene Layout-Dateien in den neuen Eintrag übernommen. Werden gleichnamige Dateien über den layout-Parameter hochgeladen, werden die Dateien aus dem alten Eintrag überschrieben. Handelt es sich um einen neuen Eintrag, wird dieser Parameter ignoriert.

Es muss eine Javascript-Funktion validateForm für die Plausibilitäts-Prüfung der Formularfelder enthalten sein, z.B.:

function validateForm (form)
{
if (! mustNotBeNull (form.strasse, 'Strasse')) return false;
return true;
}

Es muss ein <input type="submit"> implementiert sein, damit ein ausgefülltes Formular abgeschickt werden kann.

Beispiel für einfaches Formular könnte folgendermaßen aussehen:

<input type="hidden" name="categoryOfEntry" value="2">
<input type="hidden" name="destination" value="128">

<script type="text/javascript">
function validateForm (form)
{
if (! mustNotBeNull (vorname, 'Vorname')) return false;
if (! mustNotBeNull (nachname, 'Nachname')) return false;
return true;
}
</script>

Vorname: <input type="TEXT" name="vorname" size="20"><br>
Nachname: <input type="TEXT" name="nachname" size="40"><br>
<br>
<input type="submit" value="Abschicken">

so sieht's aus



Erstellen einer Abbildungsvorschrift

Das System generiert aus den Parametern und eingegebenen Werten einer Formular-Maske ein XML-Dokument, dessen oberster Knoten den Namen form trägt. Dieser besitzt als Unterknoten die HTML-Paramter mit ihren Werten. Aus obigem Beispiel könnte sich folgendes XML-Dokument ergeben:

<form>
<vorname>Peter</vorname>
<nachname>Meier</nachname>
</form>

so sieht's aus

Die Aufgabe der zu erstellenden Transformation ist es nun, dieses XML-Dokument in ein gültiges WebGenesis®-XML-Dokument abzubilden. Eine Transformation für obiges Beispiel könnte folgendermaßen aussehen:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<xsl:output indent="yes"
cdata-section-elements="nachname vorname"/>

<xsl:strip-space elements="*"/>

xsl:template match="form">
<xsl:element name="genesis">
<xsl:attribute name="version">1.0</xsl:attribute>
<xsl:attribute name="xmlns:xsi">
http://www.w3.org/2001/XMLSchema-instance</xsl:attribute>
<xsl:attribute
name="xsi:noNamespaceSchemaLocation">ISCore.xsd</xsl:attribute>
<xsl:element name="entry">
<xsl:attribute name="type">ISCore.Model.Entry /xsl:attribute>
<xsl:attribute name="key">1</xsl:attribute>
<xsl:element name="id">1</xsl:element>
<xsl:element name="name">
<xsl:apply-templates select="nachname"/>
</xsl:element>
<xsl:element name="title">
<xsl:value-of select="vorname"/>
<xsl:value-of select="nachname"/>
</xsl:element>
<xsl:element name="category">
<xsl:attribute name="type">
ISCore.Model.Category
</xsl:attribute>
<xsl:attribute name="key">
<xsl:value-of select="categoryOfEntry"/>
</xsl:attribute>
</xsl:element>
</xsl:element>
<xsl:element name="entryDetails">
<xsl:attribute name="type">
ISCore.Model.EntryDetails
</xsl:attribute>
<xsl:attribute name="key">1</xsl:attribute>
<xsl:element name="id">1</xsl:element>
<xsl:element name="Abstract">
<p><b>Vorname:</b>
<xsl:apply-templates select="vorname"/>
<p><b>Nachname:</b>
<xsl:apply-templates select="nachname"/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

Es wird im Wesentlichen der genesis-Tag erzeugt. Dieser enthält die Daten für einen Eintrag mit der ID 1. Es könnten natürlich auch mehrere (hierarchische) Einträge erzeugt werden. Im Wesentlichen sind für Formulare nur die Abschnitte Name, Titel und der Abstrakt eines Eintrags anzupassen. Im Abstrakt können die im Formular eingegeben Werte beliebig angeordnet werden. Soll hier HTML-Code verwendet werden, müssen alle HTML-Tags mit Hilfe von &lt; bzw. &gt; geschrieben werden.

Zur Fehlersuche kann in den Metadaten des Formulars der Parameter Debug verwendet werden. Wird dieser Parameter selektiert, wird kein Eintrag erzeugt, sondern der aus dem Formular erzeugte XML-Code und der XML-Code nach der Transformation angezeigt. Zur schnelleren Fehlersuche in der XSL-Transformation sollte man direkt den XSLT-Interpreter verwenden. Dieser kann mit folgender Befehlszeile gestartet werden:

java org.apache.xalan.xslt.Process -in <xmlSource> -xsl <stylesheet> -out <outputfile>
Hinweis: Die Erstellung von Formular-Masken wird durch das Werkzeug FormBuilder unterstützt. Mit Hilfe von FormBuilder können WebGenesis®-konforme Formulare interaktiv über Dialog-Steuerung erstellt werden. Dabei kann bei Standard-Formularen auf Programmierung (HTML, Javascript) gänzlich verzichtet werden.


Einbringen eines Formulars

Zur Verwendung eines Formulars muss die Formular-Maske (HTML) und die zugehörige Vorschrift für die Abbildung der erfassten Daten (XSLT) in die alternative Darstellung hochgeladen werden. Die HTML-Datei muss zusätzlich als Hauptseite eingestellt werden. Die Datei mit der Transformation kann einen beliebigen Namen haben, muss aber die Endung .xsl besitzen.



Erfassung eines Formulars

Das Abschicken eines Formulars bewirkt, die Übertragung der eingegebenen Daten zum Server, deren Aufbereitung als XML-Dokument inklusive anschließender Transformation in das WebGenesis®-Importformat und schließlich den Import der Daten als Untereintrag/Untereinträge des Formulars.

Wurde in den Formulareintrag ein XML-Schema (Endung .xsd) bzw. ein XForms-Dokument (Endung .xml) eingestellt, werden die eingegebenen Daten automatisch gegen dieses Schema geprüft.



Akzeptieren von Einträgen

Erfasste Untereinträge eines Formulars sind nur sichtbar für angemeldete Benutzer, die das Zugriffsrecht Hinzufu¨gen auf dem Formular besitzen.

Vor jedem Untereintrag befindet sich ein Akzeptieren-Knopf (in Form eines Häkchens). Wenn dieser Schalter betätigt wird, wird der Untereintrag zum Zieleintrag (Parameter destination der Formular-Maske) verschoben (vorausgesetzt, der Benutzer besitzt Schreibrechte für den Zieleintrag.



Auflistung aller Einträge eines Light Weight Benutzers

Befindet sich ein Light Weight Benutzers in einem Formular, kann er sich durch Eingabe seiner E-Mail-Adresse und seines Passworts alle Einträge anzeigen lassen, die er mit diesem Formular erstellt hat. Er besitzt die Möglichkeit jeden Eintrag zur Nachbearbeitung anzuwählen. Außerdem kann man sich eine Vorschau auf nicht freigegebene Einträge anzeigen lassen.

Den Aufruf dieser Funktionalität kann man ins Formular aufnehmen, indem man zwei Eingabefelder mit den Namen email für die E-Mail-Adresse und Passwort für das Passwort einbaut. Folgender Tag dient dann zum Aufruf der Funktion:

<a href="" onclick="javascript:suggest();return false;">
Hinweis: Den Javascript-Aufruf könnte man theoretisch direkt in den href schreiben. Dies funktioniert aber seltsamerweise nicht mit Netscape.


Nachbearbeitung eines Eintrags

Es erscheint wieder das Eingabeformular mit allen Eingaben, die der Benutzer gemacht hatte. Schickt er das Formular ab, wird der bisherige Eintrag gelöscht und ein neuer erzeugt. Dieser neue Eintrag wird wieder zum Akzeptieren vorgelegt, ist also vorerst nicht sichtbar.

Um die Daten in das Formular eintragen zu können, kann auf das Objekt formData zurückgegriffen werden. Unser Beispiel sähe dann folgendermaßen aus:

Vorname: <input type="TEXT" name="vorname"
value="[IS formData.get("vorname")]" size="20"><br>
Nachname: <input type="TEXT" name="nachname"
value="[IS formData.get("nachname")]" size="40"><br>

Das Objekt formData bietet außer der get-Funktion auch noch eine Funktion getAll. Diese liefert einen Vektor mit allen Werten zu einem Tag-Namen. Diese Funktion muss z.B. bei <select>-Tags mit Mehrfachauswahl verwendet werden.

Zum Setzen von Werten in List-/Comboboxen muss Javascript verwendet werden. Dies kann folgendermaßen aussehen:

<form>
<select name="essen">
<option value="1">Wurst</option>
<option value="2" >K&auml;se</option>
</select>
</form>
<script>
var form = document.forms[0];
for (i = 0; i < document.forms[0].essen.length; i++)
{
if (form.ort.options[i].value ==
[IS formData.get("essen")])
form.essen.selectedIndex = i;
}
</script>

so sieht's aus

Bei Multiselect kann man auf folgenden Trick zurückgreifen:

<script>
var form = document.forms[0];
for (i = 0; i < form.essen.length; i++)
{
[IS FOREACH values IN formData.getAll("essen")]
if (form.guetesiegel.options[i].text == '[IS values]')
form.essen.options[i].selected = true;
[IS /FOREACH]
}
</script>


Konfiguration

Der System Administrator kann eine der Nutzergruppen zur Light Weight Nutzer-Gruppe konfigurieren.



Beispiel: Terminformular