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ü Konfiguration ‣ Erweitert und klicken Sie anschließend in der linken Menüleiste auf Anzeige-Templates und dann auf Hinzufügen.

Anzeige-Template hinzufügen

Anzeige-Template hinzufügen

Im nun geöffneten Fenster sehen Sie die Eingabeansicht des Anzeige-Templates.

Anzeige-Template Eingabeansicht

Anzeige-Template Eingabeansicht

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 Konfiguration ‣ Berechtigungen 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 obigen for-Schleife und verkapselt in einer if-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 als record.f_identifier zur Verfügung. record.fields.identifier.value steht auch direkt als record.v_identifier zur Verfügung. Wobei identifier 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ü Konfiguration ‣ Erweitert und anschließend in der linken Menüleiste Anzeige-Templates. Klicken Sie auf Hinzufügen.

Im nun geöffneten Fenster wurden für das Anwendungsbeispiel folgende Konfigurationen vorgenommen:

Anzeige-Template CSS - Konfiguration

Anzeige-Template CSS - Konfiguration

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.

Anzeige-Template Ergebnisseite

Anzeige-Template Ergebnisseite

Um eine Ergebnisseite anzulegen, wählen Sie im Menü Konfiguration ‣ Erweitert und anschließend in der linken Menüleiste Anzeige-Templates. Klicken Sie auf Hinzufügen.

Im nun geöffneten Fenster werden folgende Konfigurationen vorgenommen:

Anzeige-Template Ergebnisseite - Konfiguration

Anzeige-Template Ergebnisseite - Konfiguration

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.

Datenquelle hinzufügen

Datenquelle hinzufügen

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.

Datenquellen

Datenquellen

Identifizierer

Der eindeutige Name dieser Datenquelle. Der Name darf nur Buchstaben, Ziffern und _ beinhalten. Eine Datenquelle mit dem Namen beispiel kann in den Anzeige-Templates mittels des Ausdrucks datasources.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 Variablen a (zu filternde App), app (App zu der diese Datenquelle gehört), user (eingeloggter Benutzer), record (Detail-Datensatz; nur in Detail-Templates) und params (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. Mit a.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 Variablen r (zu filternder Datensatz), app (App zu der dieses Anzeige-Template gehört), user (eingeloggter Benutzer) und params (Request-Parameter) zur Verfügung. Zum Beispiel könnten Sie nur die Daten, die in den letzten 30 Tagen eingegeben wurden anzeigen lassen mit r.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 wurde r.v_vorgangstyp == "rechnung". Wobei vorgangstyp 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 Konfiguration ‣ Erweitert ‣ Parameter erstellten App-Parameter (params) 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 Konfiguration ‣ Erweitert ‣ Account ‣ App-Kategorien angelegten Kategorien verwendet.

Keine Kategorien

Es steht keine Information zur Verfügung, d.h. das Attribut categories der App-Objekte ist immer None.

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 das parent-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 Familie ‣ Privat, oder Verein ‣ Privat.

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 ist children immer None). 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 ist apps immer None). 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.

Beispiel Kategorien

Beispiel Kategorien

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 Datenmanagement ‣ Sortierung für das Datenmanagement konfiguriert wurde, verwendet.

Klicken Sie auf den Tab Sortierung und dann auf Hinzufügen, um eine Sortierung anzulegen.

Datenquellen - Sortierung hinzufügen

Datenquellen - Sortierung hinzufügen

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

Datenquellen - Sortierung

Datenquellen - Sortierung

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) und params (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.

Datenquelle - untergeordnete Datensätze

Datenquelle - untergeordnete Datensätze

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

Datenquelle - untergeordnete Datensätze hinzufügen

Datenquelle - untergeordnete Datensätze hinzufügen

Im nun geöffneten Fenster werden folgende Konfigurationen vorgenommen.

Datenquellen - untergeordnete Datensätze - Konfiguration

Datenquellen - untergeordnete Datensätze - Konfiguration

Identifizierer

Der eindeutige Identifizierer für diese Konfiguration. Der Identifizierer darf nur Buchstaben, Ziffern und _ beinhalten. Die Konfiguration mit dem Namen beispiel kann in den Anzeige-Templates für einen Datensatz record mittels des Ausdrucks record.children.beispiel angesprochen werden. Zu einem Veranstaltungsdatensatz wäre z. B. bei o.g. Beispiel ein Zugriff auf die zugehörigen Anmeldungen möglich über record.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 Variablen r (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) und params (Request-Parameter) zur Verfügung. Ist der Ausdruck nicht vom Typ BOOL, wird er mittels der Funktion bool 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.

Datenquellen - Felderwahl

Datenquellen - Felderwahl

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.

Datenquellen - Ansicht in der Template-Übersicht

Datenquellen - Ansicht in der Template-Übersicht

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“

Aktivitäten stellen Ereignisse dar, die im Living-Apps-System stattgefunden haben, von denen der eingeloggte Benutzer verständigt werden soll. In der System-App sind alle Aktivitäten vorhanden, die noch nicht als gelesen markiert wurden, aber nicht von Benutzer selbst ausgelöst wurden.

Die Sytem-App „Aktivitäten“ hat folgende Felder:

Name

Identifizierer

Typ

Übergeordnete Aktivität

parent

applookup/select

Typ

type

string/text

App

app

applookup/select

Datensatz

record

applookup/select

Inhalt

content

string/textarea

Quittiert am

seen

date/datetimeminute

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

name

string/text

Beschreibung

description

string/text

Kleines Icon

icon_small

File

Großes Icon

icon_large

File

Anzahl unquittierter Aktivitäten

activity_count

int

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.

Anzeige-Template Teilnehmerliste

Anzeige-Template Teilnehmerliste

Wählen Sie im Menü Konfiguration ‣ Erweitert und anschließend in der linken Menüleiste Anzeige-Templates. Klicken Sie auf Hinzufügen um ein neues Anzeige-Template anzulegen.

Im nun geöffneten Fenster werden folgende Konfigurationen vorgenommen.

Anzeige-Template Konfiguration

Anzeige-Template Konfiguration

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 ausgelagerte CSS-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 und Bearbeiten.

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.