Anzeige-Templates
In Anzeige-Templates können Sie beliebig viele sogenannte „UL4-Templates“ anlegen. In diesen Templates können Sie auf die vorhandenen Datensätze zugreifen und mit den Daten arbeiten, sie analysieren und ausgeben. Beispielsweise können die Daten mit Anzeige-Templates nach bestimmten Kriterien ausgewertet und die Ergebnisse in tabellarischer Form dargestellt werden.
Je nach Funktion Ihrer LivingApp sind die Anwendungsmöglichkeiten sehr vielfältig. Anzeige-Templates können sowohl für einfache Ausgaben von Datensätzen dienen, als auch alle möglichen Auswertungen der Daten vornehmen.
Anzeige-Templates sind also für alles nützlich, was mit Datenanalyse, -Übersicht und -Ausgabe zu tun hat.
Erstellung eines Anzeige-Templates
Um ein Anzeige-Template für Ihre LivingApp zu erstellen, wählen Sie im Menü Anzeige-Templates und dann auf Hinzufügen.
und klicken Sie anschließend in der linken Menüleiste auf
Im nun geöffneten Fenster sehen Sie die Eingabeansicht des Anzeige-Templates.

- Identifizierer
Der Identifizierer ist eine eindeutige Kennung für das Template. Er kann verwendet werden, um das Template abzurufen. Der Identifizierer darf nur Buchstaben, Ziffern und
_
enthalten.- Quelltext
Hier erfolgt die Formulierung des Templates.
Wird im Quelltext ein <?whitespace?>
-Tag oder ein <?doc?>
-Tag eingegeben,
dann erscheint unter Templateeigenschaften folgendes:
- Whitespace
Whitespace konfiguriert, wie Einrückungen/Zeilenvorschübe im Template-Quelltext behandelt werden (wird automatisch aus dem
<?whitespace?>
-Tag im Template-Quelltext extrahiert).- Beschreibung
Beschreibung des Templates (aus dem
<?doc?>
-Tag im Template-Quelltext extrahiert)
- Typ
Es muss ein Template-Typ ausgewählt werden.
- Liste
Es kann auf alle Datensätze, die in der Datenquelle konfiguriert sind, zugegriffen werden. Soll das Template eine Auswertung aller Daten beinhalten, so muss dieser Typ gewählt werden.
- Liste Standard
Beschreibung siehe oben unter Liste. Dieses Template wird ausgeliefert, wenn die URL keinen Parameter
template
hat. Darüber können Sie unter Aufruf eines Anzeige-Templates mehr lesen. (Es kann nur ein Anzeige-Template mit dem Typ Liste (Standard) geben.)- Liste (incl. Datenmanagement)
Hier steht der Link zum Anzeige-Template auch im Datenmanagement zur Verfügung (und zwar in der Fußzeile der Liste).
- Detail
Es kann nur auf einen einzelnen Datensatz zugegriffen werden.
- Detail (Ergebnisseite)
Hier wird dieses Anzeige-Template verwendet um den Inhalt der Ergebnisseite beim Abspeichern eines Formulars zu erzeugen. In dem Fall muß das Template nur den Seiteninhalt erzeugen, der Seitenrahmen wird automatisch erzeugt. (Es kann nur ein Anzeige-Template mit dem Typ Detail (Ergebnisseite) geben.)
- Detail (incl. Datenmanagement)
Hier steht der Link zum Anzeige-Template auch im Datenmanagement zur Verfügung (und zwar bei jedem einzelnen Datensatz).
- Support
Ein Support-Template kann für andere Anzeigen verwendet werden, die keine Datensätze benötigen. Z. B. für CSS oder Javascript.
- MIME-Typ
Dateiformat, in welchem das Template ausgegeben wird. Hier kann z. B. das CSS das in einem Listen- oder Detail-Template verwendet wird ausgelagert und anschließend im HTML-Template eingebunden werden.
- Berechtigung für
Hier kann ausgewählt werden, wer das Template aufrufen kann. In der jeweiligen LivingApp können unter
verschiedenen Personen unterschiedliche Rechte zugewiesen werden. Je nachdem, wer welche Rechte hat und für wen das Template freigeschaltet wurde, haben unterschiedliche Personen Zugriff auf das jeweilige Template.- Alle Benutzer
Das Template ist frei zugänglich.
- Eingeloggte Benutzer
Um das Template aufrufen zu können, muss diejenige Person auf LivingApps eingeloggt sein.
- User mit Rechten auf der Applikation
Bei dieser Auswahl kann das Template nur durch Personen aufgerufen werden, die irgendein Recht an der App besitzen. Dies kann sowohl ein Einzelrecht sein, als auch eine Rolle (z. B. Minimal, Standard oder Administrator).
- User mit Datenverarbeitungsrechten auf der Applikation
Bei dieser Auswahl kann das Template nur durch Personen aufgerufen werden, die die Berechtigung haben, in die Datenliste der App zu gelangen.
- User mit Admin-Rechten an der Applikation
Bei dieser Auswahl kann das Template nur durch Personen aufgerufen werden, die Administrationsrechte an der App haben.
Ein Anzeige-Template ist in der Regel aus zwei Teilen aufgebaut. Der erste Teil führt die Datenaufbereitung durch. Hier wird auf die Datensätze zugegriffen und die gewünschte Auswertung berechnet. Der zweite Teil sorgt für die HTML-Ausgabe der ermittelten Daten. Dazu können sämtliche HTML-Elemente verwendet werden. Zur Formatierung kann zudem CSS eingesetzt werden. Hierzu können Sie im Kapitel Formulierung des HTML-Codes mehr lesen.
Formulierung des Templates
Um auf die Daten Ihrer App zugreifen zu können, benötigten Sie die Templatesprache UL4. Die UL4-Dokumentation finden Sie unter https://python.livinglogic.de/UL4.html. Die Ausgabe der Daten erfolgt über die LivingAPI. Im zugehörigen Kapitel sind die Objekte ausführlich beschrieben.
- Durchlaufen von Datensätzen bei Templates vom Typ Liste
Die Datensätze der jeweiligen App sind im Record-Dictionary der App (
app.records
) gespeichert.Damit die Datensätze dem Template zur Verfügung stehen, muss dafür eine Datenquelle angelegt werden. Über die Datenquelle können Sie dann auch z. B. auf App-Parameter zugreifen oder Daten mehrerer Apps ausgeben. Näheres können sie in der Dokumentation der Datenquelle nachlesen.
Wählen sie in der Datenquelle dieselbe App aus, in der das Template erstellt wird, durchlaufen Sie mit folgender
for
-Schleife alle vorhandenen Datensätze.<?for r in app.records.values()?> Anweisungen <?end for?>
Möchten Sie Datensätze aus anderen Apps in Ihrem Template anzeigen, durchlaufen Sie die Datensätze mit folgender
for
-Schleife:<?for r in datasources.beispiel.app.records.values()?> Anweisungen <?end for?>
Wobei
beispiel
für den Identifizierer der Datenquelle steht, die Sie in Ihrem Template angelegt haben.- Ausgabe von Feldwerten
Die Attribute der Datensätze, wie das Erstellungsdatum, die Felder oder Anhänge sind im Record-Objekt gespeichert. Im Field-Objekt befinden sich die Werte des Feldes. Control-Objekte beinhalten die Metadaten eines Feldes einer Applikation. Je nach Feld-Typ ist dies ein spezieller Objekt-Typ (z.B. TextControl für ein normales einzeiliges Text-Feld). Zu den Feldtypen mit Ihren Untertypen können Sie im Kapitel Übersicht der Feldtypen mehr lesen.
Auf die einzelnen Attribute kann per Punktnotation zugegriffen werden. Zur Ausgabe von Daten aus dem Datensatz verwenden Sie die Anweisung
printx
und geben das gewünschte Element des Datensatzes mit Punktnotation an.Der Feldinhalt eines
string/text
-Feldes kann dann beispielsweise innerhalb der obigenfor
-Schleife und verkapselt in einerif
-Anweisung wie folgt ausgegeben werden:<?if r.fields.identifier.value?> <?printx r.fields.identifier.value?> <?end if?>
Wie die Werte anderer Feldtypen ausgegeben werden, können Sie im Kapitel Übersicht der Feldtypen nachlesen.
Desweiteren stehen die Werte auch über „Shortcut“-Attribute zur Verfügung.
record.fields.identifier
steht auch direkt alsrecord.f_identifier
zur Verfügung.record.fields.identifier.value
steht auch direkt alsrecord.v_identifier
zur Verfügung. Wobeiidentifier
jeweils für den Identifizierer des Feldes steht, das sie ausgeben möchten.Auf den Feldwert kann analog mit
<?printx r.fields['identifier'].value?>
zugegriffen werden.Folgender Code durchläuft alle Datensätze und alle Felder und gibt, wenn ein Wert vorhanden ist, dann deren Werte aus:
<?for r in app.records.values()?> <?for f in r.fields.values()?> <?if f.value is not None?> <?printx f.value?> <?end if?> <?end for?> <?end for?>
Prüfung von Feldwerten auf Inhalt
Bevor Sie den Inhalt eines Formularfeldes ausgeben, können Sie prüfen, ob ein
Inhalt eingegeben wurde. Dafür ist die Ausgabe mit einer if
-Bedingung zu
umschließen, die prüft, ob eine Angabe im betrachteten Feld vorhanden ist.
Als „leer“ gelten:
der boolsche Wert False
leere Zeichenketten
leere Listen
leere Dictionaries
numerische Null-Werte
der Wert
None
Es gibt folgende drei Möglichkeiten, den Feld-Wert zu überprüfen. Wobei
identifier
für den Identifizierer des jeweiligen Feldes steht.
Prüfen, ob ein Wert eingegeben wurde:
<?if record.fields.identifier.value?>
Anweisung für den Fall, dass ein Wert vorhanden ist
<?end if?>
Shortcut:
<?if record.v_identifier?>
Anweisung für den Fall, dass ein Wert vorhanden ist
<?end if?>
Besonderheiten:
Bei leeren Listen in multiplelookup
/multipleapplookup
-Feldern wird der
if
-Block in obiger Logik nicht ausgeführt, verhält sich also
korrekt. Die Zahl „0“ in Feldern vom Typ number
ist False
und
wird deshalb nicht ausgeführt.
Prüfen, ob der Wert nicht None
ist:
<?if record.fields.identifier.value is not None?>
Anweisung für den Fall, dass ein Wert vorhanden ist
<?end if?>
Shortcut:
<?if record.v_identifier is not None?>
Anweisung für den Fall, dass ein Wert vorhanden ist
<?end if?>
Besonderheiten:
Bei leeren Listen in multiplelookup
/multipleapplookup
-Feldern wird
der if-Block ausgeführt. Die Zahl „0“ in Feldern vom Typ number
ist
True
und wird ausgeführt.
Methode is_empty()
von Field-Objekt:
<?if not record.fields.identifier.is_empty()?>
Anweisung für den Fall, dass ein Wert vorhanden ist
<?end if?>
Shortcut:
<?if not record.f_identifier.is_empty()?>
Anweisung für den Fall, dass ein Wert vorhanden ist
<?end if?>
Je nach Typ ist das Richtige implementiert.
Bei leeren Listen in multiplelookup
/multipleapplookup
-Feldern wird der
if
-Block nicht ausgeführt. Die Zahl „0“ in Feldern vom Typ
number
ist True
und wird ausgeführt.
Über die Verwendung der Methode is_empty()
können Sie in der
Dokumentation der LivingAPI - Objekt-Typen unter
Field mehr nachlesen.
Whitespace
Befinden sich im Template UL4-Ausdrücke oder werden andere Templates
eingebunden, empfiehlt es sich zur besseren Darstellung, einen
<?whitespace?>
-Tag ins Template einzufügen. Folgende drei Varianten stehen
zur Auswahl:
<?whitespace keep?>
Leerzeichen und Zeilenvorschübe werden 1:1 übernommen.
<?whitespace strip?>
Leerzeichen und Zeilenvorschübe zwischen den Tags werden ignoriert.
<?whitespace smart?>
Bei Zeilen die außer einem
<?print?>
-,<?printx?>
- oder<?render?>
-Tag nur Whitespace beinhalten, wird die Einrückung und der Zeilenvorschub ignoriert. Weiterhin wird die zusätzliche Einrückung ignoriert, die innerhalb eines<?for?>
-,<?if?>
-,<?elif?>
-,<?else?>
- oder<?def?>
-Tags verwendet wird.
Formulierung des HTML-Codes
Abgesehen von Daten der Datensätze können Sie natürlich auch alle anderen
HTML-Elemente in Ihre Auswertung integrieren. Sie können einen gesamten
HTML-Quellcode mit head
- und body
-Bereich als Anzeige-Template eingeben
und an den entsprechenden Stellen UL4 verwenden, um auf Datensätze zuzugreifen,
sie zu verarbeiten und zu analysieren. Mit HTML-Notation werden diese Daten
dann beispielsweise in Tabellen- oder Listenform dargestellt. Außerdem können
Überschriften, Verlinkungen und Bilder in Ihre Auswertung eingefügt werden.
Ihnen stehen alle Möglichkeiten der HTML-Notation zur Verfügung.
Um gewisse Formatierungen festzulegen und um die optische Darstellung der Auswertung ansprechend zu gestalten, kann zudem CSS verwendet werden.
Mehr Informationen zu HTML und CSS sowie ausführliche Anleitungen finden Sie unter https://wiki.selfhtml.org/
CSS-Template
Für das nachfolgende Anwendungsbeispiel wurde ein CSS-Template angelegt und im
Anzeigetemplate teilnehmerliste
eingebunden.
Um ein CSS-Template anzulegen, wählen Sie dafür im Menü Anzeige-Templates. Klicken Sie auf Hinzufügen.
und anschließend in der linken MenüleisteIm nun geöffneten Fenster wurden für das Anwendungsbeispiel folgende Konfigurationen vorgenommen:

Wie das CSS-Template im Anzeigetemplate teilnehmerliste
eingebunden wird,
können Sie im Anwendungsbeispiel nachlesen.
Ergebnisseite
Sie haben die Möglichkeit ein Anzeigetemplate zu erstellen, das dem Teilnehmer/ der Teilnehmerin nach der Eingabe eines Datensatzes oder nach einer Änderung über Formular, als Ergebnisseite angezeigt werden soll. Diese Ergebnisseite könnte folgendermaßen aussehen.

Um eine Ergebnisseite anzulegen, wählen Sie im Menü Anzeige-Templates. Klicken Sie auf Hinzufügen.
und anschließend in der linken MenüleisteIm nun geöffneten Fenster werden folgende Konfigurationen vorgenommen:

Bei Typ muss Detail (Ergebnisseite) gewählt werden.
Wie eine Ergebnisseite aufgerufen wird, können Sie unter Aufruf eines Anzeige-Templates nachlesen.
Aufruf eines Anzeige-Templates
Wenn Sie das Formular einer beliebigen LivingApp öffnen, sehen Sie in der URL
hinter apps/
eine Kombination aus Buchstaben und Zahlen. Dies ist die
App-UUID (Universally Unique Identifier), der eindeutige Identifizierer Ihrer
App. Im Formular steht hinter der UUID /new
, da hier ein neuer Datensatz
angelegt werden kann. An das /new
ist die View-ID angehängt.
Der Link zum Formular der App könnte beispielsweise wie folgt lauten:
https://my.living-apps.de/gateway/apps/563a2616591c6ca7a9800ef2/new?view=584f56445afcda56b7716252
Wobei 563a2616591c6ca7a9800ef2
die App-UUID ist und
584f56445afcda56b7716252
die View-ID. Ein Listen-Template, bei dem bei
Standard das Häkchen gesetzt ist, erreichen Sie, indem Sie
/new?view=584f56445afcda56b7716252
aus der URL löschen und keinen weiteren
Parameter anhängen. Im Beispiel wäre das folgende URL:
https://my.living-apps.de/gateway/apps/563a2616591c6ca7a9800ef2
Haben Sie hingegen bei Ihrem Listen-Template das Häkchen bei Standard
nicht gesetzt, erreichen Sie dieses Template, indem Sie
?template=mein_identifizierer
hinter die App-UUID an die URL anhängen. Heißt
der Template-Identifizierer z. B. uebersicht
, so lautet die Beispiel-URL:
https://my.living-apps.de/gateway/apps/563a2616591c6ca7a9800ef2?template=uebersicht
Wird bei einem Detail-Template bei Ergebnisseite das Häkchen gesetz,
dann wird nach Eingabe oder Änderung eines Datensatzes über Formular, dieses
Template als Ergebnisseite angezeigt. Der Identifizierer wird in dem Fall
automatisch an die URL angehängt. Diese würde dann mit dem
Template-Identifizierer beispiel
wie folgt lauten:
https://my.living-apps.de/gateway/apps/563a2616591c6ca7a9800ef2/566832210d3450b5949b9c00?template=beispiel
Im vorherigen Beispiel wird außerdem sichtbar, dass auf Datensatz-Ebene hinter die App-UUID eine weitere ID (dat_id) gehängt wird, die für jeden Datensatz eindeutig ist.
Sie haben auch die Möglichkeit einen Link zum Aufruf Ihres Anzeige-Templates zu erstellen. Darüber können Sie in der Dokumentation der App-Menüs, Benutzer-Menüs bzw. App-Panels oder Benutzer-Panels mehr lesen.
Anlegen von Datenquellen
Nachdem das Template das erste Mal gespeichert wurde, kann im Tab Datenquellen die Datengrundlage für das Template konfiguriert werden.

Dies ermöglicht es, auf Daten aus mehreren Apps zuzugreifen, die zur Verfügung stehenden Daten im Vorhinein einzuschränken und auf App-Parameter zuzugreifen. Außerdem haben Sie die Möglichkeit bei Sortierung Ihre Daten zu sortieren und bei Felder einzelne Felder Ihrer App aus- oder abzuwählen.
Möchten Sie auf Daten mehrerer unterschiedlicher Apps zugreifen, müssen Sie für
jede App eine Datenquelle anlegen. Sie können im Anzeige-Template auf die
Datenquelle zugreifen mit datasources.beispiel
. Wobei beispiel
für den
Identifizierer der Datenquelle steht. Über die Attribute der Datenquelle können
Sie in der Dokumentation der LivingAPI unter DataSource
mehr lesen.
Klicken Sie auf Hinzufügen um eine Datenquelle anzulegen. Im nun geöffneten Fenster können folgende Konfigurationen vorgenommen werden.

- Identifizierer
Der eindeutige Name dieser Datenquelle. Der Name darf nur Buchstaben, Ziffern und
_
beinhalten. Eine Datenquelle mit dem Namenbeispiel
kann in den Anzeige-Templates mittels des Ausdrucksdatasources.beispiel
angesprochen werden.- App
Hier kann die App ausgewählt werden, deren Datensätze die Datenquelle dem Template zur Verfügung stellen soll. Möchten Sie die Informationen der System-Apps zur Verfügung stellen, müssen Sie hier die entsprechende System-App wählen.
Wird eine App ausgewählt, haben Sie die Moglichkeit bei Kopien einbeziehen das Häkchen zu setzen. Damit wird nicht nur diese App selbst, sondern auch alle ihre Kopien dem Template zur Verfügung gestellt.
- App-Filter
Einen App-Filter können Sie nur dann eingeben, wenn Sie bei App Alle Apps gewählt oder bei einer bestimmten App das Häkchen bei Kopien einbeziehen gesetzt haben.
Diese Bedingung muss eine App
a
erfüllen, um in die Liste der Apps zu kommen, aus der die Datensätze in die Datenquelle aufgenommen werden. Es stehen die Variablena
(zu filternde App),app
(App zu der diese Datenquelle gehört),user
(eingeloggter Benutzer),record
(Detail-Datensatz; nur in Detail-Templates) undparams
(Request-Parameter) zur Verfügung.Mit
a.owner.id == user.id
können Sie sich zum Beispiel nur die Apps anzeigen lassen, bei denen der eingeloggte User der Besitzer ist. Mita.identifier == p.str.app
wird die App angezeigt, deren UUID als Parameter in der URL mitgegeben wird.Ist der Ausdruck nicht vom Typ
BOOL
, wird er mittels der Funktion bool konvertiert. Mehr Informationen zu vSQL-Ausdrücken finden Sie in der Dokumentation zu vSQL.
- Felder/Datensätze
Hier können Sie festlegen, ob Informationen zu den Feldern (
controls
), oder die Datensätze (records
) in die Datenquelle aufgenommen werden sollen.- keine Daten
Es werden keine Informationen zu den Feldern bzw. Datensätze in die Datenquelle aufgenommen, sondern nur die App-Information (Name der App, Beschreibung der App, Icon, …). Dies kann z.B. sinnvoll sein, wenn Sie eine Übersicht über alle Ihre Apps erstellen wollen.
- Felder
Hier werden nur Feldinformationen (Name des Feldes, Feldtyp, App zu der das Feld gehört, Info ob Listenfeld, Reihenfolge der Felder, …) in die Datenquelle aufgenommen. Dies kann z.B. für reine Eingabemasken sinnvoll sein.
- Felder und Datensätze
Zusätzlich zu den Feldinformationen werden hier die Datensätze der App mit in die Datenquelle aufgenommen. Diese ist die übliche Auswahl. Damit können Sie dann die Daten Ihrer App im Anzeigetemplate auswerten oder darstellen.
- Felder
Erscheint bei der Auswahl von Felder oder Felder und Datensätze. Legt fest, welche Felder in die Datenquelle aufgenommen werden.
- keine Felder
Es werden gar keine Felder aufgenommen.
- Prioritätsfelder
Es werden nur die Felder aufgenommen, die in der Datenliste im Datenmanagement ausgewählt sind.
- Alle Felder
Es werden alle Felder aufgenommen.
- Alle Felder und Layoutfelder
Es werden alle Felder aufgenommen. Zusätzlich enthält
View.layout_controls
alle Layout-Felder, wie die „Formatierten Textfelder“, „Dekobilder“ und den „Absenden“-Button.(Damit View-Objekte in die Datenquelle aufgenommen werden, muß der Haken bei Views? gesetzt sein.)
- Anzahl Datensätze
Wird hier das Häkchen gesetzt, wird die Anzahl der Datensätze mit in die Datenquelle aufgenommen (als App-Attribut
recordcount
).- Datensätze
Erscheint bei der Auswahl von Felder und Datensätze. Legt fest, welche Datensätze dem Template in der Liste der Datensätze in die Datenquelle aufgenommen werden.
- Angelegte Datensätze
Es werden nur die vom Benutzer angelegten Datensätze aufgenommen.
- Zugewiesene Datensätze
Es werden nur Datensätze aufgenommen, die dem Benutzer über die Konfiguration Zugewiesene Daten zugewiesen wurden. Ohne diese Konfiguration wird diese Option wie Angelegte Datensätze behandelt.
- Zugewiesene Datensätze bzw. alle Datensätze für Admins
Hat der Benutzer die Rolle Adminstrator oder Datenmanager, so werden alle Datensätze aufgenommen, sonst wird diese Option wie Zugewiesene Datensätze behandelt.
- Alle Datensätze
Es werden alle Datensätze aufgenommen.
- Datensatz-Filter
Diese Bedingung muss ein Datensatz
r
erfüllen, um in die Liste der Datensätze in der Datenquelle aufgenommen zu werden. Es stehen die Variablenr
(zu filternder Datensatz),app
(App zu der dieses Anzeige-Template gehört),user
(eingeloggter Benutzer) undparams
(Request-Parameter) zur Verfügung. Zum Beispiel könnten Sie nur die Daten, die in den letzten 30 Tagen eingegeben wurden anzeigen lassen mitr.createdat >= now() - days(30)
. Folgenden Filter können Sie eingeben, wenn Sie zum Beispiel nur die Daten aus der App „Vorgänge“ anzeigen lassen wollen, bei denen als Vorgangstyp Rechnung in der Auswahl gewählt wurder.v_vorgangstyp == "rechnung"
. Wobeivorgangstyp
für den identifier des Feldes Vorgangstyp steht.Ist der Ausdruck nicht vom Typ
BOOL
, wird er mittels der Funktion bool konvertiert. Mehr Informationen zu vSQL-Ausdrücken finden Sie in der Dokumentation zu vSQL.- Rechte?
Wird hier das Häkchen gesetzt, wird das Attribut
permissions
gefüllt mit allen der App zugeordneten Benutzern und deren Berechtigungen. (Wird noch nicht unterstützt.)- Anhänge?
Wird hier das Häkchen gesetzt, werden auch die Anhänge (
attachments
) der jeweiligen Datensätze mit in die Datenquelle aufgenommen. Bei dem Datensatz der bei einem Detail-Template angezeigt wird, stehen die Anhänge immer zu Verfügung, unabhängig davon, ob das Häkchen bei Anhänge? gesetzt ist oder nicht.- Parameter?
Wird hier das Häkchen gesetzt, dann stehen dem Template die unter App-Parameter (
erstelltenparams
) zur Verfügung.- Views?
Wird hier das Häkchen gesetzt, werden alle Formularvarianten (Formularansichten —
views
) dem Template zur Verfügung gestellt.- Kategorien
Legt fest, welche Informationen zu den App-Kategorien in den App-Objekten zur Verfügung stehen. Zur Demonstration der folgenden Möglichkeiten wird das Beispiel der unter angelegten Kategorien verwendet.
- Keine Kategorien
Es steht keine Information zur Verfügung, d.h. das Attribut
categories
der App-Objekte ist immerNone
.- Kategorien-Pfade
Hier ist das App-Attribut
categories
ein Dictionary mit den Kategorien, zu denen diese App gehört. Die Schlüssel sind der jeweilige Identifizierer der Kategorie und der Wert sind Kategorie-Objekte. Bei diesen verweist dasparent
-Attribut jeweils auf die übergeordnete Kategorie. D.h. über die den Apps zugeordneten Kategorien können über das parent-Attribut die Pfade zu diesen Kategorien im Kategorien-Baum rekonstruiert werden, aber nicht die Bäume selbst. Zum Beispiel , oder .- Kategorien-Bäume
Diese Option funktioniert ähnlich wie Kategorien-Pfade, jedoch enthält das Kategorien-Attribut
children
zusätzlich noch die dieser Kategorie untergeordneten Kategorien als Dictionary. (Bei Kategorien-Pfade istchildren
immerNone
). Zum Beispiel die übergeordnete Kategorie Privat mit den Unterkategorien Familie und Verein.- Kategorien-Bäume mit Apps
Diese Option funktioniert ähnlich wie Kategorien-Bäume, jedoch enthält das Kategorien-Attribut
apps
zusätzlich noch die dieser Kategorie zugeordneten Apps als Dictionary (bei Kategorien-Pfade und Kategorien-Bäume istapps
immerNone
). Zum Beispiel die übergeordnete Kategorie Privat mit der Unterkategorie Familie und deren Apps Haushaltsbuch und Urlaubsplanung, sowie der Unterkategorie Verein und deren Apps Mitglieder und Spenden.

Nach dem Speichern der Datenquelle erscheinen neben Bearbeiten die Tabs Sortierung, Untergeordnete Datensätze und Felder.
Sortierung
Bei Sortierung kann nach einem bestimmten Ausdruck sortiert, die Sortier-Richtung und das Handling von Null-Werten eingestellt werden. Wird hier keine Sortierung festgelegt, so wird die Sortierung, wie sie unter für das Datenmanagement konfiguriert wurde, verwendet.
Klicken Sie auf den Tab Sortierung und dann auf Hinzufügen, um eine Sortierung anzulegen.

Im nun geöffneten Fenster können folgende Konfigurationen vorgenommen werden.

- Reihenfolge
Bei mehrerern Sortierungen werden die Datensätze in dieser Reihenfolge sortiert.
- Ausdruck
Nach dem Wert dieses Ausdrucks werden die Datensätze sortiert. Für die Formulierung wird vSQL verwendet. Es stehen die Variablen
r
(zu sortierender Datensatz),app
(App zu der das zugehörige Anzeige-Template gehört)record
(Detail-Datensatz; nur in Detail-Templates),user
(eingeloggter Benutzer) undparams
(Request-Parameter) zur Verfügung.
Sortier-Richtung
- Aufsteigend
Aufsteigende Sortierung (A-Z)
- Absteigend
Absteigende Sortierung (Z-A)
Nullwerte
- Zuerst
Nullwerte werden zuerst angezeigt.
- Zuletzt
Nullwerte werden zuletzt angezeigt.
Untergeordnete Datensätze
Wenn Sie in einer App eine Auswahl auf eine andere App definieren, dann erzeugen Sie damit eine Eltern-Kind-Beziehung. In unserem Anwendungsfall z. B. greift das Feld Veranstaltung in der App Anmeldung auf die App Veranstaltungen zu. Das heißt die App Veranstaltungen hat eine Eltern-Kind-Beziehung zu der App Anmeldung (eine Veranstaltung kann mehrere Anmeldungen haben). Diese Beziehung können Sie für untergeordnete Datensätze nutzen. So könnten Sie sich z. B. die Teilnehmer zu Ihren Veranstaltungen in einem Template anzeigen lassen. Dafür müssen Sie in der App Veranstaltungen ein Anzeigetemplate und dazu eine Datenquelle anlegen. Für dieses Beispiel wurde folgende Datenquelle konfiguriert.

Nach dem Speichern der Datenquelle klicken Sie auf den Tab Untergeordnete Datensätze und dann auf Hinzufügen.

Im nun geöffneten Fenster werden folgende Konfigurationen vorgenommen.

- Identifizierer
Der eindeutige Identifizierer für diese Konfiguration. Der Identifizierer darf nur Buchstaben, Ziffern und
_
beinhalten. Die Konfiguration mit dem Namenbeispiel
kann in den Anzeige-Templates für einen Datensatzrecord
mittels des Ausdrucksrecord.children.beispiel
angesprochen werden. Zu einem Veranstaltungsdatensatz wäre z. B. bei o.g. Beispiel ein Zugriff auf die zugehörigen Anmeldungen möglich überrecord.children.anmeldungen
.- Ziel
Hier können Sie die App auswählen, deren Datensätze den Datensätzen dieser Datenquelle zugeordnet sind. Angezeigt werden die Apps, die ausgewählt werden können, sowie die Felder worüber die beiden Apps miteinander verknüpft sind. Ist eine App mehrfach mit einer anderen App verbunden, dann können sie über das Feld, das Ihnen bei Ziel mitangezeigt wird, diese beiden Verknüpfungen unterscheiden.
- Filterbedingung
Diese Bedingung muß ein Datensatz
r
erfüllen, um in die Liste der untergeordneten Datensätze aufgenommen zu werden (zusätzlich zu der Bedingung, dass er dem Hauptdatensatz zugeordnet ist). Es stehen die Variablenr
(untergeordneter zu filternder Datensatz),app
(App zu der das zugehörige Anzeige-Template gehört),record
(Detail-Datensatz; nur in Detail-Templates),user
(eingeloggter Benutzer) undparams
(Request-Parameter) zur Verfügung. Ist der Ausdruck nicht vom TypBOOL
, wird er mittels der Funktionbool
konvertiert. Für das Formulieren der Bedingung wird vSQL verwendet.
Felder
Hier haben Sie die Möglichkeit, einzelne Felder Ihrer App aus- oder abzuwählen, welche in die Datenquelle aufgenommen werden sollen. Das ist z. B. sinnvoll, wenn Sie nur wenige von vielen Feldern anzeigen lassen möchten oder wenn Sie entgegen der Angabe in der Datenquelle einzelne Felder mitaufnehmen oder ausschließen möchten.
Durch Klicken auf den Tab Felder gelangen Sie zu folgender Seite.

- Nichts ausgewählt
Das Feld wird entsprechend der Angabe in der Datenquelle behandelt.
- Nein
Das Feld wird nicht mit in die Datenquelle aufgenommen.
- Ja
Das Feld wird mit in die Datenquelle aufgenommen.
In der Übersicht Ihrer Anzeige-Templates können Sie durch Klicken auf den Pfeil neben dem entsprechenden Template einsehen, was in der Datenquelle konfiguriert wurde.

Zugriff auf System-Apps
Über System-Apps können Sie auf Informationen aus dem Living-Apps-System zugreifen, als wären diese Informationen Datensätze einer App (eben einer System-App). Überall wo Sie eine normale App als Datenquelle wählen können ist es auch möglich, statt dessen eine System-App zu wählen. Um auf eine System-App zugreifen zu können, müssen Sie dafür eine Datenquelle anlegen und dort als Quelle bei Apps die entsprechende System-App auswählen. Darüber können Sie in der Dokumentation der Datenquelle mehr lesen.
Folgende System-Apps stehen zur Verfügung.
System-App „Aktivitäten“
Die System-App „Aktivitäten“ ermöglicht den Zugang zu dem im System protokollierten Aktivitäten (siehe Aktivitäten zur Erklärung von Aktivitäten).
Die Sytem-App „Aktivitäten“ hat folgende Felder:
Name |
Identifizierer |
Typ |
---|---|---|
Übergeordnete Aktivität |
|
|
Typ |
|
|
App |
|
|
Datensatz |
|
|
Inhalt |
|
|
Quittiert am |
|
|
Das Feld type
(d.h. der Aktivitäts-Typ) kann folgende Werte haben:
Wert |
Beschreibung |
---|---|
attachment.insert |
Anhang erzeugt |
attachment.update |
Anhang geändert |
attachment.delete |
Anhang gelöscht |
massdata.insert |
Mehrere Datensätze erzeugt |
massdata.update |
Mehrere Datensätze geändert |
massdata.delete |
Mehrere Datensätze gelöscht |
data.insert |
Datensatz erzeugt |
data.update |
Datensatz geändert |
data.delete |
Datensatz gelöscht |
linkaction.execute |
Link-Aktion ausgeführt |
email.send |
Email versendet |
email.fail |
Emailversendung fehlgeschlagen |
task.insert |
Aufgabe erzeugt |
task.done |
Aufgabe erledigt |
task.delete |
Aufgabe gelöscht |
chat |
Chat-Nachricht |
app.chat |
Chat-Nachricht zur App |
data.chat |
Chat-Nachricht zum Datensatz |
So können Sie z. B. in der Datenquelle bei Datensatz-Filter folgende Bedingung angeben:
r.v_type != "data.insert"
Wenn ein Datensatz erzeugt wird, soll keine Aktivität angezeigt werden, ansonsten schon.
Folgende Bedingung zeigt nur die Aktivitäten zu den Chats an und keine anderen:
"chat" in r.v_type
System-App „Apps“
Bei dieser System-App werden die Apps selbst als Datensätze interpretiert. Diese Datensätze haben folgende Felder:
Name |
Identifizierer |
Typ |
---|---|---|
Name |
|
|
Beschreibung |
|
|
Kleines Icon |
|
|
Großes Icon |
|
|
Anzahl unquittierter Aktivitäten |
|
|
Dies ermöglicht es Ihnen z.B. ein Template zu erstellen, das alle ihre Apps anzeigt.
System-App „Controls“
System-App „Emailtemplates“
System-App „Versendungen“
Anwendungsbeispiel
Um die Darstellung eines Anzeige-Templates zu veranschaulichen, wird im
Folgenden auf das Anwendungsbeispiel aus Kapitel 1 zurückgegriffen. Es soll das
Anzeige-Template
Teilnehmerliste
vom Typ Liste erstellt werden, welches als
Übersichtsseite über sämtliche Anmeldungen dient und verschiedene Links und
Parameter einbindet. Die Übersicht soll eine Tabelle anzeigen, mit den Spalten
Kurs
, Teilnehmer
, Anzahl Personen
, E-Mail-Adresse
und
Bearbeiten
. Außerdem soll die Summe der angemeldeten Personen berechnet und
ausgegeben werden.
Zusätzlich wird das Anzeige-Template Ergebnis vom Typ Detail (Ergebnisseite) erstellt, welches die Teilnehmer über eine erfolgreiche Anmeldung informieren soll.
Das zugehörige CSS-Template wird in einem separaten Support-Template ausgelagert und dann eingebunden.

Wählen Sie im Menü Anzeige-Templates. Klicken Sie auf Hinzufügen um ein neues Anzeige-Template anzulegen.
und anschließend in der linken MenüleisteIm nun geöffneten Fenster werden folgende Konfigurationen vorgenommen.

Bei Quelltext wird folgender Code eingegeben.
1<?doc?>
2Teilnehmerliste
3<?end doc?>
4<?code teilnehmerapp = datasources.teilnehmer.app?>
5<html>
6 <head>
7 <title>Teilnehmerliste</title>
8 <?render globals.t_la_static_font_awesome()?>
9 <link rel="stylesheet" href="<?printx teilnehmerapp.template_url('css')?>" />
10 </head>
11 <body>
12 <h1><?print app.pv_ueberschrift?></h1>
13 <h2>
14 <?if teilnehmerapp.image is not None?>
15 <img src="<?printx teilnehmerapp.image.url?>" width="32"/>
16 <?end if?>
17 <?printx teilnehmerapp.name?> (<?printx teilnehmerapp.description?>)
18 </h2>
19 <table align="center" border="0" cellpadding="0" cellspacing="0">
20 <thead>
21 <tr>
22 <th>Kurs</th>
23 <th>Teilnehmer</th>
24 <th>Anzahl Personen</th>
25 <th>E-Mail-Adresse</th>
26 <th>Bearbeiten</th>
27 </tr>
28 </thead>
29 <tbody>
30 <?code summe_personen = 0?>
31 <?for record in teilnehmerapp.records.values()?>
32 <?if not record.v_abgemeldet?>
33 <tr>
34 <td>
35 <?if record.v_veranstaltung2?>
36 <?printx record.v_veranstaltung2.v_veranstaltung?>
37 <?end if?>
38 </td>
39 <td>
40 <?printx record.v_nachname?> <?printx record.v_vorname?>
41 </td>
42 <td>
43 <?if record.v_anzahl_personen2?>
44 <?printx record.v_anzahl_personen2?>
45 <?code summe_personen += record.v_anzahl_personen2?>
46 <?end if?>
47 </td>
48 <td>
49 <?printx record.v_e_mail_adresse?>
50 </td>
51 <td class="zentriert">
52 <a target="_top" href="<?printx record.edit_embedded_url()?>"><?render globals.t_la_icon("pencil", fw=True)?></a>
53 </td>
54 </tr>
55 <?end if?>
56 <?end for?>
57 </tbody>
58 </table>
59 <p>Insgesamt angemeldete Personen: <?printx summe_personen?></p>
60 <p><a target="_top" href="<?printx teilnehmerapp.new_embedded_url()?>">Anmeldung hinzufügen</a></p>
61 </body>
62</html>
- Zeile 1
Die Beschreibung des Templates mit dem
<?doc?>-Tag
.- Zeile 4
Belegung der Variablen
teilnehmerapp
mit den Informationen aus der App der Datenquelle.- Zeilen 6 - 10
Der title der Seite wird festgelegt. Das interne Template
la_static_font_awesome
(Zeile 8) und das ausgelagerteCSS
-Template (Zeile 9) werden eingebunden.- Zeile 12
Die Überschrift des Templates wird über den App-Parameter
ueberschrift
eingebunden und ausgegeben. Über App-Parameter können Sie in der Dokumentation der Parameter mehr lesen.- Zeilen 14 - 16
Wenn ein App-Icon hochgeladen wurde, wird dieses hier ausgegeben.
- Zeile 17
Der Name und die Beschreibung der App wird ausgegeben.
- Zeile 18 - 26
Der Kopf der Tabelle wird festgelegt, mit den Spalten-Überschriften
Kurs
,Teilnehmer
,Anzahl Personen
,E-Mail-Adresse
undBearbeiten
.- Zeile 30
Die Variable
summe_personen
wird initialisiert, zu der in jedem Datensatz die Anzahl der angemeldeten Personen aufaddiert wird.- Zeile 31
Die
for
-Schleife durchläuft die Werte der Datensätze in der Datenquelle.- Zeile 32
Der Code im
if
-Block von Zeile 32 - 55 wird nur ausgeführt für Teilnehmer, die sich nicht wieder abgemeldet haben.- Zeilen 35 - 37
Wenn eine Veranstaltung ausgewählt wurde, wird der Wert des Feldes „Veranstaltung“ aus der verknüpften App „Veranstaltungen“ ausgegeben.
- Zeile 40
Der Nachname und der Vorname des Teilnehmers wird ausgegeben.
- Zeile 43 - 46
Wenn das Feld
Anzahl Personen
gefüllt ist, dann wird dieser Wert hier (Zeile 44) ausgegeben und anschließend auf die in Zeile 30 definierte Variable aufsummiert (Zeile 45).- Zeile 49
Die E-Mail-Adresse des Teilnehmers wird ausgegeben.
- Zeile 52
Link zum Bearbeiten des jeweiligen Datensatzes. Mit
<?render globals.t_la_icon("pencil", fw=True)?>
wählen Sie das Icon zum Editieren aus Font-Awesome aus.- Zeile 59
Ausgabe der Variablen
summe_personen
.- Zeile 60
Link zur Dateneingabe, in dem ein neuer Datensatz angelegt werden kann.
Nachdem sie das Template gespeichert haben, können Sie Datenquellen dazu anlegen. Die Datenquelle, die für dieses Anwendungsbeispiel angelegt wurde, finden Sie in der Dokumentation der Datenquelle.
Wie ein Template aufgerufen wird, können Sie unter Aufruf eines Anzeige-Templates nachlesen.