Das sd:ro-value -Element ermöglicht es, eine einzelne Zelle einer bearbeiteten Zeile mit einem festen Wert (read-only) zu belegen, um bsp. zu erkennen, daß die letzte Bearbeitung dieses Datensatzes über diese Ausgabeseite (und nicht über die interne Maske) erfolgt ist. Dies ermöglicht später bsp. das leichte Auffinden aller über diese Ausgabeseite hinzugefügten neuen Datensätze. Der hier definierte Wert wird erst nach dem Verarbeiten aller Eingabeparameter der Zelle zugewiesen und wird nicht in die Html-Version übertragen, sondern ausschließlich intern verarbeitet.
Falls das sd:main -Attribut mit dem Namen einer Tabelle belegt ist, kann das Eingabeformular dazu verwendet werden, einen Haupt- sowie einen ersten Detaildatensatz zu diesem Hauptdatensatz gleichzeitig zu speichern. In diesem Fall müssen zusätzliche sd:input-text -Eingabefelder definiert werden, die mit dem sd:is-main -Attributwert 'true' der Haupttabelle zugeordnet werden. Ferner muß die Detailtabelle eine Spalte namens 'Haupttabelle' + 'Id' besitzen. Dann wird zunächst die Hauptzeile gespeichert, die Verweisspalte der Detailtabelle mit der neuen Id belegt und anschließend die Detailzeile gespeichert.
Eine Sonderfunktion nimmt das sd:cached-id -Attribut ein. Wird ihm ein Name zugewiesen, so wird beim Speichern dieses Datensatzes die neue Zeilen-Id unter diesem Namen mit vorgestelltem '$' im Laufzeitcache für den aktuellen Nutzer zwischengespeichert. Anschließend kann dieser Name (mit '$') verwendet werden, um im sd:ro-value -Element anderer Ausgabeseiten die bereits gespeicherte Id einzutragen. Damit kann auf einer einführenden Seite durch den Klick eines Nutzers zunächst ein Hauptdatensatz erzeugt (Bsp.: Pizza-Bestellung) und dieser gecacht werden. Auf den folgenden Seiten werden die Details dieser Bestellung vom Nutzer ausgewählt und die zugeordneten Detaildatensätze mit der Haupt-Id der Bestellung gespeichert. Zum Schluß kann nochmals der Hauptdatensatz gespeichert und mittels des sd:ro-value -Elements ein Flag gesetzt werden, so daß die Bestellung erfolgreich abgesandt worden ist.
search button auto manualDie Werte 'search' und 'button' erzeugen automatisiert ein Suchfeld und die beiden Buttons zum Vorwärts- und Zurückblättern, 'auto' erstellt sämtliche Objekte automatisch, 'manual' verzichtet auf jede manuelle Erstellung. Jede automatisierte Erstellung belegt Platz unmittelbar hinter dem Eingabefeld. Zusätzlich zur manuellen Erstellung können sd:rel-steps -Container für jede Spalte mit Relationen genutzt werden.
Bei komplexeren Designs dürfte 'manual' sowie die manuelle Erstellung dieser Objekte die richtige Wahl sein.
Die Standardvariante geht davon aus, daß die Detailtabelle eine Spalte HaupttabelleId hat, die genutzt wird, um die ID des Hauptdatensatzes zu speichern. Ist dieser Name bereits belegt oder unpassend, so kann der Hauptspaltenname beliebig genannt und über dieses Attribut übergeben werden.
Das ist nützlich, falls Relationen mit zusätzlichen Parametern, aber ohne direkte Detailspaltenfilter deklariert sind, um das Neuladen der Relation und die Berücksichtigung der geänderten Parameter zu erzwingen.
true falseFalls 'true', so wird ein Speichern- oder Löschbefehl nur dann ausgeführt, wenn der zu bearbeitende Datensatz im Laufzeitcache des aktuellen Nutzers existiert, also auch angezeigt wird. Dieses Attribut verhindert das Speichern / Löschen beliebiger Datensätze über die Id und sollte in jenen Fällen verwendet werden, in welchen anonyme Nutzer im Rahmen einer Bestellung ihre Bestelldetails angezeigt bekommen und einzelne Bestelldetails speichern / löschen dürfen. Da nur die Bestelldetails angezeigt werden, die zur Haupt-Id gehören und da die Haupt-Id aus dem Servercache geholt wird, kann auf diese Weise kein fremder Detaildatensatz gespeichert oder gelöscht werden.
Dateiname.html?action=objektname-d-myId'nur ausgeführt, falls der übergebene Name gleich diesem Attributwert ist. Die ID der zu löschenden Zeile wird in diesem Fall aus dem Laufzeitcache des ausführenden Nutzers ausgelesen. Dies verhindert Löschversuche durch die Übergabe einer Zahl, falls anonyme Nutzer Datensätze hinzufügen und löschen dürfen. Falls nur authentifizierte Nutzer Daten bearbeiten dürfen, ist diese Technik nicht notwendig, da nun der Datenbankserver die Berechtigung für den aktuellen Benutzer überprüft.
Bsp.: Interne Mitarbeiter können alle Datensätze bearbeiten. Externe Firmennutzer bilden eine eigene Gruppe, so daß mehrere externe Mitarbeiter dieselbe Menge an Daten bearbeiten kann. Zusätzlich sollen regionsbezogene Mitarbeiter nur die Datensätze ihrer Region lesen können.
Hier ist die Gruppenspalte _Group bereits belegt, ein regionsbezogener Mitarbeiter soll Datensätze verschiedenster Gruppen seiner Region lesen können.
Ein Eintrag 'RegionenSpalte|$RID' überprüft, ob der Datensatz-Wert für 'Regionenspalte' gleich dem für diesen Nutzer gecachten Wert $RID ist und läßt nur bei Übereinstimmung die Anzeige zu.
Ein Eintrag 'RegionenSpalte|^$RID' läßt die Anzeige zu, falls $RID leer oder gleich dem Wert der Regionenspalte ist.
Bei internen Mitarbeitern bleibt $RID leer, damit können diese sämtliche Datensätze lesen. Für regionsbezogene Mitarbeiter wird hier die RegionenId gecacht - sie sehen nur die Datensätze ihrer Region.
Format: Spaltenname|$Cachewert.
1 2 8und Bitkombinationen (= Summen) dieser. Ist das 1-Bit gesetzt, so wird beim Speichern immer ein neuer Datensatz erzeugt. Ein Wert 2 zeigt an, daß mit der Eingabemaske ausschließlich ein vorhandener Datensatz editiert werden kann. 3 (= 1 | 2) läßt sowohl die Neuerstellung als auch das Editieren zu und wird als Standardeinstellung genutzt, falls das Attribut fehlt.
Interessant ist das 8-Bit in Kombination mit 1 (= 9) bzw. 1|2 (= 11). Damit wird gefordert, daß beim Neuerstellen eines Datensatzes noch kein Datensatz existiert, der diesem Owner gehört. Dies ist praktisch, falls eine Maske angeboten wird, die mittels des sd:choose-null -Elements ermittelt, ob es von diesem Nutzer bereits einen Datensatz gibt und den Speichern-Button entweder zum Erstellen eines neuen Datensatzes oder zum Speichern des bearbeiteten Datensatzes ausgibt. In diesem Fall kann ein böswilliger Nutzer die Eingabemaske durch eine passende Url auch erneut aufrufen. Das Speichern des so generierten zweiten Datensatzes wird durch das 8-Bit jedoch abgeblockt.
Dieses Attribut ist bsp. nützlich, falls ein Datensatz zum Editieren angeboten wird, dessen ID bei einem früheren Aufruf erzeugt und gecacht worden ist. Das Attribut verhindert, daß die Seite isoliert aufgerufen und anstelle einer Bearbeitung ein neuer Datensatz erzeugt wird.
<table> <sd:input-table sd:name='sample-input' sd:table='Artikel'> <tr> <td> <sd:label sd:col='ArtikelId' /> </td> <td> <sd:input-text sd:col='ArtikelId' /> </td> </tr> <tr> <td> <sd:label sd:col='A_Name' /> </td> <td> <sd:input-text sd:col='A_Name' /> </td> </tr> <tr> <td> <sd:label sd:col='A_Preis' /> </td> <td> <sd:input-text sd:col='A_Preis' /> </td> </tr> </sd:input-table> </table>Der folgende Code verwendet ebenfalls eine Blindtabelle zur Positionierung, nutzt jedoch die dynamische Erstellung. Mit diesem Code können Url-Überschreibungen (/sample-input/table/Vertreter) genutzt werden, so daß - ohne weitere Anpassungen - eine Eingabemaske für eine andere Tabelle zur Verfügung steht. Es wird ein sehr kompakter Code generiert:
<table> <sd:input-table sd:name='sample-input' sd:table='Artikel' sd:rel-format='auto'> <sd:input-cell-set> <sd:normal> <tr> <td> <sd:label /> </td> <td> <sd:input-text /> </td> </tr> </sd:normal> </sd:input-cell-set> </sd:input-table> </table>Hier wird das sd:input-table-Element nur einmal ausgeführt. Das sd:input-cell-set -Element wird jedoch für jede Spalte einmal aufgerufen. Eine Belegung mit expliziten Spaltennamen ist hier nicht notwendig. Falls zwischen ungeraden und geraden Spalten unterschieden werden soll, kann zusätzlich ein sd:alternate -Element eingefügt werden.