4D v164D Transformation Tags |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16
4D Transformation Tags
4D Transformation Tags
4D bietet verschiedene Transformation Tags, um Referenzen auf 4D Variablen oder Ausdrücke einzufügen, oder verschiedene Vorgehensweisen innerhalb des Quelltextes, auch "template" genannt, auszuführen. Die Tags werden beim Ausführen des Quelltextes interpretiert und der Ausgabetext wird generiert. Diese Funktionsweise nutzt der 4D Web Server zum Erzeugen von Halbdynamische Seiten. Die Tags müssen in Form von HTML Kommentaren (<!--#Tag Inhalt-->) in den Quellcode eingefügt werden. Aber auch Kommentare wie <!--Beginning of list--> sind möglich. Es lassen sich auch verschiedene Tag Typen miteinander mischen. Hier ein Beispiel:
<HTML> ... <BODY> <!--#4DSCRIPT/PRE_PROCESS--> (Method call) <!--#4DIF (myvar=1)--> (If condition) <!--#4DINCLUDE banner1.html--> (Subpage insertion) <!--#4DENDIF--> (End if) <!--#4DIF (mtvar=2)--> <!--#4DINCLUDE banner2.html--> <!--#4DENDIF--> <!--#4DLOOP [TABLE]--> (Loop on the current selection) <!--#4DIF ([TABLE]ValNum>10)--> (If [TABLE]ValNum>10) <!--#4DINCLUDE subpage.html--> (Subpage insertion) <!--#4DELSE--> (Else) <B>Value: <!--#4DTEXT [TABLE]ValNum--></B><BR> (Field display) <!--#4DENDIF--> <!--#4DENDLOOP--> (End for) </BODY> </HTML> Der Inhalt der "template" Seiten wird in zwei Kontexten ausgeführt:
Nachfolgende Tabelle listet die verfügbaren 4D Transformation Tags mit Beispielen und Verwendungsweise:
(*) Die Tags sollten generell als HTML Kommentare (<!--#Tag Content-->) in den Quelltext eingefügt werden. Die alternative Syntax mit $ eignet sich unter bestimmten Bedingungen für Tags, die Werte zurückgeben, damit sie XML konform sind. Weitere Informationen dazu finden Sie unten im Abschnitt Alternative Syntax für 4DTEXT, 4DHTML, 4DEVAL. Für eine 4D Methode, die mit 4DTEXT, 4DHTML, 4DEVAL, 4DSCRIPT, 4DIF, 4DELSEIF oder 4DLOOP über eine Web Anfrage läuft, muss in den Methodeneigenschaften die Eigenschaft “Zugang per 4D HTML Tags und URLs (4DACTION ...)” definiert sein. Ist diese Eigenschaft für die Methode nicht markiert, lässt sie sich nicht über eine Web Anfrage aufrufen. Weitere Informationen dazu finden Sie im Abschnitt Zugang per 4D HTML Tags und URLs. 4D Tags werden rekursiv interpretiert: 4D versucht immer, das Ergebnis einer Transformation wieder zu interpretieren. Wenn eine neue Transformation stattgefunden hat, wird eine zusätzliche Interpretation durchgeführt und weitergeführt, bis das erhaltene Produkt keine weitere Transformation benötigt. Nehmen wir z.B. folgende Anweisung: <!--#4DHTML [Mail]Letter_type--> Enthält das Textfeld [Mail]Letter_type selbst ein Tag, z.B. <!--#4DSCRIPT/m_Gender-->, wird dieses Tag nach der Interpretation des 4DHTML Tag rekursiv bewertet. Dieses Vorgehen erfüllt die meisten Anforderungen an Texttransformation. Beachten Sie jedoch, dass dies in manchen Fällen zum Einfügen von böswilligem Code führen kann. 4D Transformation Tags akzeptieren verschiedene Datentypen als Parameter: Text, Variablen, Methoden, Befehlsnamen, etc. Stammen diese Daten von Ihrem eigenen Code, besteht kein Risiko, dass böswilliger Code eingefügt wird, da Sie die Eingabe steuern. Jedoch arbeitet Ihr Datenbank Code oft mit Daten, die zu irgendeinem Zeitpunkt über eine externe Quelle dazugekommen sind, wie Benutzereingabe, Import, etc. Um sicherzustellen, dass Ausdrücke unabhängig von der 4D Programmiersprache oder Version korrekt bewertet werden, empfehlen wir die Syntax mit Tokens bei Elementen, deren Name sich zwischen verschiedenen Versionen ändern kann (Befehle, Tabellen, Felder, Konstanten). Um beispielsweise die Funktion Current time einzufügen, geben Sie 'Current time:C178' ein. Weitere Informationen dazu finden Sie im Abschnitt Tokens in Formeln verwenden. Ab v15 R4 verwendet 4D beim Bewerten eines numerischen Ausdrucks mit einem 4D Tag 4DTEXT, 4DVAR, 4DHTML, 4DHTMLVAR und 4DEVAL (bzw. den alten Tags 4DVAR und 4DHTMLVAR) immer den Punkt (.) als Dezimaltrenner. Regionale Einstellungen werden ignoriert. Dieses Feature vereinfacht die Wartung von Code und Kompatibilität zwischen verschiedenen 4D Programmiersprachen und Versionen. Hierzu ein Beispiel: value:=10/4 Hinweis zur Kompatibilität: Bewertet Ihr von einer früheren Version konvertierte Code numerische Ausdrücke über 4D Tags mit Berücksichtigung regionaler Einstellungen, müssen Sie ihn mit der Funktion String anpassen:
Syntax: <!--#4DTEXT VarName--> oder <!--#4DTEXT 4DExpression--> Über <!--#4DTEXT VarName--> können Sie eine Referenz auf eine 4D Variable bzw. Ausdruck einfügen. Schreiben Sie zum Beispiel in einer HTML Seite: Über 4DTEXT können Sie auch einen 4D Ausdruck einfügen. So können Sie den Inhalt eines Feldes, z.B. <!--4DTEXT [Tabellenname]Feldname-->), ein Array Element, z.B. <!--#4DTEXT tabarr{1}-->) oder eine Methode, die einen Wert zurückgibt (<!--#4DTEXT mymethod-->) direkt einfügen. Ein Ausdruck wird genauso wie eine Variable konvertiert. Ein 4D Ausdruck muss darüberhinaus auch die Syntaxregeln von 4D berücksichtigen. Bei einem Bewertungsfehler erscheint der eingefügte Text in Form von “<!--#4DTEXT meinevar--> : ## Fehler # Fehlercode”. Hinweise:
Syntax: <!--4DHTML VarName--> oder <!--4DHTML 4D Expression--> Über dieses Tag können Sie, wie beim Tag 4DTEXT, eine Variable oder einen 4D Ausdruck bewerten und in einen HTML Ausdruck einfügen. Dieser Tag löst jedoch NICHT spezielle HTML Zeichen auf. Hierzu ein Beispiel:
Bei einem Bewertungsfehler erscheint der eingefügte Text in Form von “<!--#4DHTML meinevar--> : ## Fehler # Fehlercode”. Hinweis: Aus Sicherheitsgründen empfehlen wir, das Tag 4DTEXT beim Bearbeiten von Daten zu verwenden, die von außerhalb kommen, um das Einfügen von bösartigem Code zu vermeiden. Weitere Informationen dazu finden Sie oben im Abschnitt Einfügen von böswilligem Code verhindern. Syntax: <!--#4DEVAL VarName--> oder <!--#4DEVAL 4DExpression--> Über das Tag 4DEVAL können Sie auf eine Variable oder einen 4D Ausdruck zugreifen. Wie 4DHTML löst auch 4DEVAL die HTML Zeichen im zurückgegebenen Text nicht auf. Im Gegensatz zu 4DHTML oder 4DTEXT kann 4DEVAL jedoch jede gültige 4D Anweisung ausführen, d.h. auch Anweisungen und Ausdrücke, die keinen Wert zurückgeben. Sie können z.B. folgendes ausführen: $input:="<!--#4DEVAL a:=42-->" // Zuweisung ohne Ausgabe Bei fehlerhafter Interpretation wird der Text in Form von <!--#4DEVAL expression--> : ## Fehler # Fehlernummer” eingefügt. Hinweis: Aus Sicherheitsgründen empfehlen wir, das Tag 4DTEXT beim Bearbeiten von Daten zu verwenden, die von außerhalb kommen, um das Einfügen von bösartigem Code zu vermeiden. Weitere Informationen dazu finden Sie oben im Abschnitt Einfügen von böswilligem Code verhindern. Syntax: <!--#4DSCRIPT/MeineMeth/MeinParam--> Mit 4DSCRIPT können Sie beim Bearbeiten des Template 4D Methoden ausführen. Existiert <!--#4DSCRIPT/MeineMeth/MeinParam--> als HTML Kommentar, wird die Methode MeineMeth mit dem Parameter MeinParam als ein String in $1 ausgeführt. Wird das Tag im Rahmen eines Web Prozesses beim Laden der Seite aufgerufen, ruft 4D – sofern vorhanden – die Datenbankmethode On Web Authentication auf. Gibt diese Wahr zurück, führt 4D die Methode aus. Die Methode muss in $0 Text zurückgeben. Beginnt der String mit dem Zeichencode 1, wird er als HTML betrachtet. Dasselbe Prinzip gilt auch für das Tag 4DHTML. Fügen Sie zum Beispiel den Kommentar “heute ist der <!--#4DSCRIPT/MYMETH/MYPARAM-->” in eine statische Seite ein. Beim Laden der Seite ruft 4D –sofern vorhanden– die Datenbankmethode On Web Authentication auf, dann die Methode MeineMeth und übergibt den String “/MeinParam” als Parameter $1. Die Methode gibt in $0 Text zurück, zum Beispiel “31.12.14”, der Ausdruck “heute ist der <!--4DSCRIPT/MeineMeth/MeinParam––>” also zu “Heute ist der 31.12.14”. Die Methode MeineMeth lautet: //MeineMeth Hinweis: Eine Methode, die über 4DSCRIPT aufgerufen wird, darf keine Elemente der Oberfläche aufrufen, wie DIALOG, ALERT... . Da 4D Methoden in ihrer eigenen Reihenfolge erscheinen, lässt sich eine Methode aufrufen, die den Wert von vielen Variablen setzt, auf die später im Dokument verwiesen wird. Sie können in ein Template beliebig viele <!--4DSCRIPT...--> Kommentare einfügen. Syntax: <!--#4DINCLUDE Pfad--> Dieses Tag dient hauptsächlich dazu, um in eine HTML Seite den Hauptteil einer anderen HTML Seite einzufügen (angegeben im Parameter Pfad). Als Hauptteil einer HTML Seite gilt alles, was innerhalb der Ausdrücke <body> und </body> steht. Die Tags selbst werden nicht eingefügt. Auf diese Weise können Sie Konflikte mit den im Header enthaltenen Meta Tags vermeiden. Enthält die angegebene HTML Seite keine Tags <body> </body>, wird die komplette Seite integriert. Sie müssen selbst für die Konsistenz der Meta Tags sorgen. Eine Seite, die über den Kommentar <!--#4DINCLUDE--> eingefügt wurde, wird im Web Cache genauso gesetzt wie die Seiten, die über eine URL angefordert oder über den Befehl WEB SEND FILE gesendet wurden. Hinweise:
Sie können <!--#4DINCLUDE Pfad--> innerhalb einer Seite beliebig oft verwenden. Die Aufrufe von <!--#4DINCLUDE Pfad--> sind jedoch nur auf einer Ebene möglich. Sie können also nicht den Kommentar <!--#4DINCLUDE meindok3.html--> in den Hauptteil der Seite meindok2.html einfügen, die wiederum von <!--#4DINCLUDE meindok2--> aufgerufen wird, welches in meindok1.html eingefügt ist. 4D prüft außerdem, dass die Einfügungen nicht rekursiv sind. Bei einem Fehler erscheint der eingefügte Text in Form von "<!--#4DINCLUDE Pfad-->: Dokument kann nicht geöffnet werden". Beispiele <!--#4DINCLUDE Unterseite.html--> <!--#4DINCLUDE Ordner/Unterseite.html--> <!--#4DINCLUDE ../Ordner/Unterseite.html--> Syntax: <!--#4DBASE folderPath--> Das Tag <!--#4DBASE --> bezeichnet ein Arbeitsverzeichnis, das vom Tag <!--#4DINCLUDE--> verwendet wird. Der Parameter folderPath muss einen Pfad relativ zur aktuellen Seite enthalten und dieser muss mit einen Schrägstrich (/) enden. Der angegebene Ordner muss innerhalb des Web Ordners liegen. Der folgende Code aus 4D v12, der für jeden Aufruf einen relativen Pfad angibt: <!--#4DINCLUDE subpage.html--> <!--#4DINCLUDE folder/subpage1.html--> <!--#4DINCLUDE folder/subpage2.html--> <!--#4DINCLUDE folder/subpage3.html--> <!--#4DINCLUDE ../folder/subpage.html--> ... lässt sich mit dem Tag <!--#4DBASE --> schreiben wie folgt: <!--#4DINCLUDE subpage.html--> <!--#4DBASE folder/--> <!--#4DINCLUDE subpage1.html--> <!--#4DINCLUDE subpage2.html--> <!--#4DINCLUDE subpage3.html--> <!--#4DBASE ../folder/--> <!--#4DINCLUDE subpage.html--> <!--#4DBASE WEBFOLDER--> Verzeichnis für die Home Page über das Tag <!--#4DBASE --> erstellen: /* Index.html */ <!--#4DIF LangFR=True--> <!--#4DBASE FR/--> <!--#4DELSE--> <!--#4DBASE US/--> <!--#4DENDIF--> <!--#4DINCLUDE head.html--> <!--#4DINCLUDE body.html--> <!--#4DINCLUDE footer.html--> In der Datei Head.html wird der aktuelle Ordner durch <!--#4DBASE --> geändert, ohne dass sich sein Wert in Index.htm ändert: /* Head.htm */ /* das Arbeitsverzeichnis hier ist relativ zur enthaltenen Datei (FR/ oder US/) */ <!--#4DBASE Styles/--> <!--#4DINCLUDE main.css--> <!--#4DINCLUDE product.css--> <!--#4DBASE Scripts/--> <!--#4DINCLUDE main.js--> <!--#4DINCLUDE product.js--> Mit dem Tag 4DCODE können Sie einen mehrzeiligen Block mit 4D Code in eine Vorlage einfügen. Wird eine "<!--#4DCODE" Sequenz gefunden, die mit einem Abstand, einem Zeichen CR oder LF abschließt, interpretiert 4D alle Code Zeilen bis zur nächsten "-->" Sequenz. Innerhalb des Code Blocks kann es Zeilenschaltungen, Zeilenvorschub oder beides geben, dies wird von 4D sequentiell interpretiert. Sie können z.B. mit dem Tag 4DCODE in einer Vorlage schreiben: <!--#4DCODE Hinweis: In einem Tag 4DCODE muss immer die Englisch-US Programmiersprache verwenden werden. Deshalb ignoriert 4DCODE die Benutzereinstellung "Verwende regionale Systemeinstellungen" (siehe Sprache für Befehle und Konstanten). Für den Tag 4DCODE gibt es folgende Vorgaben:
Hinweis zur Sicherheit: Die Tatsache, dass 4DCODE Tags einen beliebigen Befehl der 4D Programmiersprache oder Projektmethoden aufrufen kann, könnte als Sicherheitsrisiko eingestuft werden, besonders wenn die Datenbank über HTTP verfügbar ist. Da er jedoch server-seitigen Code aus Ihren eigenen Vorlagedateien ausführt, ist das Tag selbst kein Sicherheitsrisiko. In diesem Kontext wird die Sicherheit, wie für jeden Web Server, hauptsächlich auf der Ebene von externen Zugriffen auf die Server-Dateien verwaltet. Syntax: <!--#4DIF expression--> {<!--#4DELSEIF expression2-->...<!--#4DELSEIF expressionN-->} {<!--#4DELSE-->} <!--#4DENDIF--> Der Kommentar <!--#4DIF expression--> ermöglicht in Verbindung mit den Kommentaren <!--#4DELSE--> (optional) und <!--#4DENDIF-->, Teile des Code auf bedingte Weise auszuführen. Die Blöcke <!--#4DIF expression> ... <!--#4DENDIF--> können ineinander verschachtelt sein. Analog zu 4D muss jeder mit <!--#4DIF expression--> geöffnete Kommentar mit <!--#4DENDIF--> geschlossen werden. Bei einem Interpretationsfehler wird zwischen <!--#4DIF --> und <!--#4DENDIF--> anstelle des Inhalts der Text “<!--#4DIF expression-->: Ein boolescher Ausdruck wurde erwartet” eingefügt. Über das Tag <!--#4DELSEIF--> können Sie eine unbegrenzte Anzahl von Bedingungen testen. Nur der Code, der auf die erste als Wahr gewertete Bedingung folgt, wird ausgeführt. Ist keine der Bedingungen wahr, wird keine Anweisung ausgeführt (wenn es kein abschließendes <!--#4DELSE--> gibt). Die beiden nachfolgenden Codes sind gleichwertig:
Nachfolgendes Beispiel zeigt Code aus einer statischen HTML Seite, die je nach Ergebnis des Ausdrucks vname#"" eine andere Bezeichnung zeigt: <BODY> ... <!--#4DIF (vname#"")--> Namen, die mit <!--#4DTEXT vname--> beginnen. <!--#4DELSE--> Es wurde kein Name gefunden. <!--#4DENDIF--> ... </BODY> Dieses Beispiel fügt je nach angemeldetem Benutzer unterschiedliche Seiten ein: <!--#4DIF LoggedIn=False--> <!--#4DINCLUDE Login.htm --> <!--#4DELSEIF User="Admin" --> <!--#4DINCLUDE AdminPanel.htm --> <!--#4DELSEIF User="Manager" --> <!--#4DINCLUDE SalesDashboard.htm --> <!--#4DELSE--> <!--#4DINCLUDE ItemList.htm --> <!--#4DENDIF--> Syntax: <!--#4DLOOP Bedingung--> <!--#4DENDLOOP--> Mit diesem Kommentar können Sie den Teil eines HTML Codes so oft wiederholen wie die Bedingung erfüllt ist. Der Teil wird begrenzt durch <!--#4DLOOP--> und <!--#4DENDLOOP-->. Sie können ineinander verschachtelt sein. Analog zu 4D muss jeder mit <!--4DLOOP Bedingung--> geöffnete Kommentar mit <!--#4DENDLOOP--> geschlossen werden. Es gibt fünf Bedingungstypen:
Bei einem Interpretationsfehler wird zwischen <!--#4DLOOP--> und <!--#4DENDLOOP--> der Text “<!--#4DLOOP expression-->:Beschreibung” eingefügt.
Einige vorhandene 4D Transformation Tags lassen sich jetzt mit der neuen Syntax mit $ schreiben: Diese alternative Syntax ist nur für Tags verfügbar, die bearbeitete Werte zurückgeben:
(andere Tags, wie 4DIF oder 4DSCRIPT, müssen die reguläre Syntax verwenden) Sie können zum Beispiel schreiben: $4DEVAL(UserName) anstelle von: <!--#4DEVAL(UserName)--> Hauptvorteil dieser neuen Syntax ist, dass sie für XML geeignete Vorlagen ermöglicht. Einige 4D Entwickler müssen auf XML basierende Vorlagen erstellen und diese über standardmäßige XML Analyse Tools auswerten. Da das Zeichen "<" in einem XML Attributwert ungültig ist, ließ sich die Syntax "<!-- -->" von 4D Tags nicht ohne Brechen der Dokumentsyntax verwenden. Außerdem verhindert das auflösende Zeichen "<" die korrekte Interpretation von Tags durch 4D. So würde der folgende Code wegen dem ersten "<" einen XML Parsing Fehler verursachen: <line x1="<!--#4DEVAL $x-->" y1="<!--#4DEVAL $graphY1-->"/> Mit der $ Syntax wird der nachfolgende Code vom Parser korrekt interpretiert: <line x1="$4DEVAL($x)" y1="$4DEVAL($graphY1)"/> Beachten Sie, dass $4dtag und <--#4dtag --> nicht exakt identisch sind: im Gegensatz zu <--#4dtag --> interpretiert ein $4dtag 4D Tags beim Bearbeiten nicht rekursiv. $ Tags werden immer einmal bewertet und das Ergebnis wird als Volltext gewertet. Hinweis: Weitere Informationen dazu finden Sie im Abschnitt . Grund für diesen Unterschied ist der Schutz vor Injektion von böswilligem Code. Wie bereits im Handbuchs Programmiersprache erläutert, wird dringend geraten,zum Schutz vor ungewollter Reinterpretation von Tags beim Verwalten von Benutzertext 4DTEXT Tags anstelle von 4DHTML Tags zu verwenden: Mit 4DTEXT werden Sonderzeichen wie "<" aufgelöst, so dass alle 4D Tags mit der Syntax <!--#4dtag expression --> ihre spezielle Bedeutung verlieren. Da 4DTEXT jedoch das $ Symbol nicht auflöst, haben wir entschieden, die rekursive Unterstützung aufzuheben, um jegliche Injektion von böswilligem Code über die Syntax $4dtag (expression) zu verhindern. Nachfolgende Beispiele zeigen das Ergebnis der Bewertung je nach verwendeter Syntax und Tag: // Beispiel 1 // Beispiel 2 // Beispiel 3 Beachten Sie, dass die Syntax $4dtag zusammenpassende Paare von eingebundenen Anführungszeichen oder Klammern unterstützt. Angenommen, Sie müssen (rein hypotetisch) folgenden komplexen String bewerten: String(1) + "\"(hello)\"" Sie können schreiben: input:="$4DEVAL( String(1)+\"\\\"(hello)\\\"\")"
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||