4D v15.44D Transformation Tags |
|||||||||||
|
4D v15.4
4D Transformation Tags
|
Wert von meinevar | Tags | Ergebnis |
meinevar:="<B>" | <!--#4DTEXT meinevar--> | <B> |
meinevar:="<B>" | <!--#4DHTML meinevar--> | <B> |
Um sicherzustellen, dass Ausdrücke unabhängig von der 4D Programmiersprache oder Version korrekt bewertet werden, empfehlen wir die Syntax mit Tokens bei Elementen zu verwenden, deren Name sich zwischen verschiedenen Versionen ändern kann (Befehle, Tabellen, Felder, Konstanten). Um beispielsweise den Befehl Current time einzufügen, geben Sie 'Current time:C178' ein. Weitere Informationen dazu finden Sie im Abschnitt Tokens in Formeln verwenden.
Bei einem Bewertungsfehler erscheint der eingefügte Text in Form von “<!--#4DHTML meinevar--> : ## Fehler # Fehlercode”.
Hinweise:
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
$input:=$input+"<!--#4DEVAL a+1-->" // Berechnung mit Ausgabe
PROCESS 4D TAGS($input;$output)
//$output = "43"
Um sicherzustellen, dass Ausdrücke unabhängig von der 4D Programmiersprache oder Version korrekt bewertet werden, empfehlen wir die Syntax mit Tokens bei Elementen zu verwenden, deren Name sich zwischen verschiedenen Versionen ändern kann (Befehle, Tabellen, Felder, Konstanten). Um beispielsweise den Befehl Current time einzufügen, geben Sie 'Current time:C178' ein. Weitere Informationen dazu finden Sie im letzten Abschnitt Tokens in Formeln verwenden.
Bei fehlerhafter Interpretation wird der Text in Form von <!--#4DEVAL expression--> : ## Fehler # Fehlernummer” eingefügt.
Hinweise:
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.
Hinweis: Die Ausführung einer Methode mit 4DSCRIPT richtet sich nach der Option "Zugang per HTML Tags und URLs (4DAction...)", die im Dialogfenster Methodeneigenschaften definiert wird. Weitere Informationen dazu finden Sie im Abschnitt Sicherheit der Verbindung.
Der Inhalt der Seite wird analysiert, wenn der Befehl WEB SEND FILE (.htm, .html, .shtm, .shtml) oder WEB SEND BLOB (blob vom Typ Text/html) aufgerufen wird.
Beachten Sie, dass die Analyse im nicht kontextuellen Modus auch erfolgt, wenn eine URL auf eine Datei mit der Endung “.shtm” oder “.shtml” zeigt, zum Beispiel http://www.server.com/dir/page.shtm).
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.09”, der Ausdruck “heute ist der <!--4DSCRIPT/MeineMeth/MeinParam––>” also zu “Heute ist der 31.12.09”.
Die Methode MeineMeth lautet:
C_TEXT($0)\\Dieser Parameter muss immer angegeben sein
C_TEXT($1)\\Dieser Parameter muss immer angegeben sein
$0:=String(Current date)
Wichtig: Sie müssen in der aufgerufenen Methode immer die Parameter $0 und $1 angeben.
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.
Der Kommentar <!--#4DINCLUDE--> ist besonders hilfreich in Verbindung mit dem Test (<!--#4DIF-->) oder den Schleifen (<!--#4DLOOP-->). Er ist auch praktisch, um Tags nach einem bestimmten Kriterium oder zufällig einzufügen.
4D analysiert die aufgerufene Seite im Moment des Einfügens, unabhängig von der Endung des Dateinamens, und fügt dann den evtl. geänderten Inhalt in die Seite ein, von der der Aufruf 4DINCLUDE ausgeht.
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.
In Pfad übergeben Sie den Zugriffspfad des einzufügenden Dokuments. Beachten Sie, dass sich der Pfad bei Aufrufen mit 4DINCLUDE nach dem Dokument richtet, das gerade analysiert wird, d.h. nach dem Hauptdokument. Verwenden Sie den Schrägstrich (/) als Trenner zwischen den Dokumenten und die zwei Punkte (..), um in der Hierarchie eine Ebene höher zu gehen (HTML Syntax).
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.
Beim Aufrufen in einer Web Seite ändert das Tag <!--#4DBASE --> alle nachfolgenden Aufrufe von <!--#4DINCLUDE--> auf dieser Seite bis zum nächsten <!--#4DBASE --> - sofern vorhanden. Wird der Ordner <!--#4DBASE --> aus einer enthaltenden Datei heraus geändert, findet er deren ursprünglichen Wert aus der übergeordneten Datei.
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.
Übergeben Sie das Schlüsselwort WEBFOLDER, um den Standardpfad, d.h. relativ zur Seite, wiederherzustellen.
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-->
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.
Der Parameter expression kann jeden gültigen 4D Ausdruck enthalten, der einen booleschen Wert zurückgibt. Er muss in Klammern stehen und die Syntaxregeln von 4D berücksichtigen.
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.
Um sicherzustellen, dass Ausdrücke unabhängig von der 4D Programmiersprache oder Version korrekt bewertet werden, empfehlen wir die Syntax mit Tokens bei Elementen zu verwenden, deren Name sich zwischen verschiedenen Versionen ändern kann (Befehle, Tabellen, Felder, Konstanten). Um beispielsweise den Befehl Current time einzufügen, geben Sie 'Current time:C178' ein. Weitere Informationen dazu finden Sie im Abschnitt Tokens in Formeln verwenden.
Bei einem Interpretationsfehler wird zwischen <!--#4DIF --> und <!--#4DENDIF--> anstelle des Inhalts der Text “<!--#4DIF expression-->: Ein boolescher Ausdruck wurde erwartet” eingefügt.
Entspricht nicht jedem <!-#-4DENDIF--> ein <!--#4DIF -->, wird anstelle des Inhalts der Text
“<!--#4DIF expression-->: 4DENDIF 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).
Sie können nach dem letzten Tag <!--#4DELSEIF--> ein Tag <!--#4DELSE--> verwenden. Sind alle Bedingungen falsch, werden die Anweisungen ausgeführt, die auf <!--#4DELSE--> folgen.
Die beiden nachfolgenden Codes sind gleichwertig:
<!--#4DIF Condition1--> /* Condition1 ist wahr*/ <!--#4DELSE--> <!--#4DIF Condition2--> /* Condition2 ist wahr*/ <!--#4DELSE--> <!--#4DIF Condition3--> /* Condition3 ist wahr*/ <!--#4DELSE--> /*Keine der Bedingungen ist wahr*/ <!--#4DENDIF--> <!--#4DENDIF--> <!--#4DENDIF-->
<!--#4DIF Condition1--> /* Condition1 ist wahr*/ <!--#4DELSEIF Condition2--> /* Condition2 ist wahr*/ <!--#4DELSEIF Condition3--> /* Condition3 ist wahr*/ <!--#4DELSE--> /* Keine der Bedingungen ist wahr*/ <!--#4DENDIF-->
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-->
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>
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:
Dieser Code:
<!--#4DLOOP [People]--> <!--#4DTEXT [People]Name--> <!--#4DTEXT [People]Surname--><BR> <!--#4DENDLOOP-->
... lässt sich in 4D Code folgendermaßen ausdrücken:
FIRST RECORD([People])
While(Not(End selection([People])))
...
NEXT RECORD([People])
End while
Hinweis: Diese Syntax ist für zweidimensionale Arrays nicht verwendbar. Die Lösung: eine Methode mit verschachtelten Schleifen kombinieren.
Dieser Code:
<!--#4DLOOP arr_names--> <!--#4DTEXT arr_names{arr_names}--><BR> <!--#4DENDLOOP-->
... lässt sich folgendermaßen in 4D Code übersetzen:
For($Elem;1;Size of array(arr_names))
arr_names:=$Elem
...
End for
Aus Sicherheitsgründen kann die Datenbankmethode On Web Authentication einmal direkt vor der Initialisierung aufgerufen werden. Wird die Authentifizierung bestätigt, findet die Initialisierungsphase statt.
Warnung: Damit die Datenbank kompilierbar ist, müssen innerhalb der Methode unbedingt die Compilerbefehle C_BOOLEAN($0) und C_LONGINT($1) deklariert sein.
Dieser Code:
<!--#4DLOOP meine_methode--> <!--#4DTEXT var--> <BR> <!--#4DENDLOOP-->
If(AuthenticationWebOK)
If(meine_methode(0))
$counter:=1
While(meine_methode($counter))
...
$counter:=$counter+1
End while
End if
End if
Die Methode meine_methode lautet:
C_LONGINT($1)
C_BOOLEAN($0)
If($1=0)
`Initialisierung
$0:=True
Else
If($1<50)
...
var:=...
$0:=True
Else
$0:=False `Stoppt die Schleife
End if
End if
Dieser Code:
<!--#4DEVAL $i:=0--> <!--#4DLOOP ($i<4)--> <!--#4DEVAL $i--> <!--#4DEVAL $i:=$i+1--> <!--#4DENDLOOP-->
ergibt folgendes:
0
1
2
3
Um sicherzustellen, dass Ausdrücke unabhängig von der 4D Programmiersprache oder Version korrekt bewertet werden, empfehlen wir die Syntax mit Tokens bei Elementen zu verwenden, deren Name sich zwischen verschiedenen Versionen ändern kann (Befehle, Tabellen, Felder, Konstanten). Um beispielsweise den Befehl Current time einzufügen, geben Sie 'Current time:C178' ein. Weitere Informationen dazu finden Sie im Abschnitt Tokens in Formeln verwenden.
Diese Syntax ist hilfreich, wenn Sie im Befehl PROCESS 4D TAGS als Parameter einen Array Zeiger übergeben.
Beispiel:
ARRAY TEXT($array;2)
$array{1}:="hello"
$array{2}:="world"
$input:="<!--#4DEVAL $1-->"
$input:=$input+"<!--#4DLOOP $2-->"
$input:=$input+"<!--#4DEVAL $2->{$2->}--> "
$input:=$input+"<!--#4DENDLOOP-->"
PROCESS 4D TAGS($input;$output;"elements = ";->$array)
// $output = "elements = hello world"
Bei einem Interpretationsfehler wird zwischen <!--#4DLOOP--> und <!--#4DENDLOOP--> der Text “<!--#4DLOOP expression-->:Beschreibung” eingefügt.
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.
In diesem Fall raten wir, keine Transformation Tags wie 4DEVAL oder 4DSCRIPT zu verwenden, da sie die Parameter direkt mit dieser Art Daten bewerten.
Außerdem kann durch die rekursive Vorgehensweise (siehe voriger Abschnitt) böswilliger Code selbst Transformation Tags enthalten. Hier MUSS der Tag 4DTEXT verwendet werden.
Nehmen wir z.B. ein Feld im Webformular genannt "Name", in das Benutzer ihren Namen eingeben müssen. Dieser Name wird dann über ein Tag <!--#4DHTML vName--> auf der Seite angezeigt. Wird stattdessen Text vom Typ "<!--#4DEVAL QUIT 4D-->" eingefügt, führt die Interpretation dieses Tags zum Beenden der Anwendung.
Um dieses Risiko zu vermeiden, verwenden Sie einfach für solche Fälle systematisch das Tag 4DTEXT. Da dieses Tag die speziellen HTML Zeichen schützt, wird evtl. eingefügter böswilliger Code nicht erneut interpretiert. Das bedeutet für obiges Beispiel: Das Feld "Name" enthält in diesem Fall "<!--#4DEVAL QUIT 4D-->" es wird nicht transformiert.
4D Objekte mit HTML Objekten verbinden
Halbdynamische Seiten
PROCESS 4D TAGS
URLs und Form Actions
Produkt: 4D
Thema: String
4DVAR, 4DTEXT, 4DHTMLVAR, 4DHTML, 4DSCRIPT, 4DINCLUDE, 4DIF, 4DLOOP, 4DELSEIF
4D Programmiersprache ( 4D v15.4)
4D Programmiersprache ( 4D v15)
4D Programmiersprache ( 4D v15.3)