4D v16

4D 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:

  • Über den Befehl PROCESS 4D TAGS: Er akzeptiert ein "template" als Eingabe, optional auch Parameter und gibt den Text als Ergebnis der Bearbeitung zurück.
  • Über den in 4D integrierten HTTP Server: Halbdynamische Seiten, die über die Befehle WEB SEND FILE (.htm, .html, .shtm, .shtml), WEB SEND BLOB (text/html vom Typ BLOB) oder WEB SEND TEXT gesendet oder über URL aufgerufen werden. Im letzten Fall werden zwecks Optimierung Seiten mit den Endungen .htm und .html NICHT analysiert. Um hier das Analysieren der HTML Seiten zu erzwingen, müssen Sie die Endung .shtm oder shtml anfügen, z.B. http://www.server.com/dir/page.shtm. Weitere Informationen dazu finden Sie im Abschnitt Halbdynamische Seiten des Kapitels Web Server.

Nachfolgende Tabelle listet die verfügbaren 4D Transformation Tags mit Beispielen und Verwendungsweise:

TagAktionBeispiel$ Syntax(*)Kommentare
4DTEXTFügt 4D Variablen und Ausdrücke als Text ein<!--#4DTEXT [Kunde]Name-->XEmpfohlen bei externer Bearbeitung der Daten, um Injektion von böswilligem Code zu verhindern.
4DHTMLFügt HTML Code ein<!--#4DHTML <br/>-->XNicht empfohlen bei externer Bearbeitung der Daten
4DEVALBewertet jeden 4D Ausdruck<!--#4DEVAL a:=20-->XNicht empfohlen bei externer Bearbeitung der Daten
4DSCRIPT/Führt eine 4D Methode mit einem Parameter aus<!--#4DSCRIPT/MeineMethode/MeinParam-->
4DINCLUDEFügt eine HTML Seite innerhalb einer anderen ein<!--#4DINCLUDE Unterseite.html-->
4DBASEBestimmt die von 4DINCLUDE verwendete Datei<!--#4DBASE ../Datei/-->
4DCODEFügt 4D Code ein<!--#4DCODE ALERT(myVar)-->Unterstützt CR, LF (4D Code Blöcke)
4DIF, 4DELSE, 4DELSEIF, 4DENDIFFügt Bedingungen in den Code in Form vom Tags ein<!--#4DIF (myVar=1)-->
4DLOOP, 4DENDLOOPFügt Schleifen in den Code in Form von Tags ein<!--#4DLOOP [table]-->Lässt sich mit Tabellen, Arrays, Methoden, Ausdrücken, ZeigerArrays verwenden

(*) 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.
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 "&lt;!--#4DEVAL QUIT 4D--&gt;" es wird nicht transformiert.

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
 input:="<!--#4DTEXT value-->"
 PROCESS 4D TAGS(input;output)
  // ergibt immer 2.5, selbst wenn regionale Einstellungen ',' als Trenner verwenden

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:

  • Für value mit einem Punkt als Dezimalzeichen: <!--#4DTEXT value-->
  • Für value mit einem Dezimalzeichen gemäß den regionalen Einstellungen: <!--#4DTEXT String(value)-->

4DTEXT  

Syntax: <!--#4DTEXT VarName--> oder <!--#4DTEXT 4DExpression-->
Alternative Syntax: $4DTEXT(VarName) oder $4DTEXT(4DExpression) (siehe Alternative Syntax für 4DTEXT, 4DHTML, 4DEVAL)

Über <!--#4DTEXT VarName--> können Sie eine Referenz auf eine 4D Variable bzw. Ausdruck einfügen. Schreiben Sie zum Beispiel in einer HTML Seite:
<P>Welcome to <!--#4DTEXT vtSiteName-->!</P>,
wird der Wert der 4D Variablen vtSiteName in die HTML Seite eingefügt, wenn sie gesendet wird. Dieser Wert wird als einfacher Text eingefügt, spezifische HTML Zeichen wie ">" werden automatisch aufgelöst.

Ü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:

  • Sie können mit Prozessvariablen arbeiten.
  • Sie können den Inhalt eines Feldes vom Typ Bild anzeigen. Dagegen lässt sich der Inhalt eines Array-Elements vom Typ Bild nicht anzeigen.
  • Sie können den Inhalt eines Feldes vom Typ Objekt über eine 4D Formel anzeigen. Sie können z.B. schreiben <!--#4DTEXT OB Get([Rect]Desc;\"color\")-->.
  • Aus Sicherheitsgründen empfehlen wir, dieses Tag 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.
  • In der Regel arbeiten Sie mit Textvariablen. Sie können aber auch Variablen vom Typ BLOB einsetzen. Dazu müssen Sie lediglich das BLOB im Modus Text without length generieren.

4DHTML  

Syntax: <!--4DHTML VarName--> oder <!--4DHTML 4D Expression-->
Alternative Syntax: $4DHTML(VarName) oder $4DHTML(4DExpression) (siehe Alternative Syntax für 4DTEXT, 4DHTML, 4DEVAL)

Ü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:

Wert von meinevarTagsErgebnis
meinevar:="<B>"<!--#4DTEXT meinevar-->&lt;B&gt;
meinevar:="<B>"<!--#4DHTML meinevar--><B>

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-->
Alternative Syntax: $4DEVAL(VarName) oder $4DEVAL(4DExpression) (siehe Alternative Syntax für 4DTEXT, 4DHTML, 4DEVAL)

Ü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"

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
 C_TEXT($0;$1//Diese Parameter müssen immer angegeben werden
 $0:=String(Current date)

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:

  • Verwenden Sie das Tag 4DINCLUDE mit dem Befehl PROCESS 4D TAGS, ist der Standardordner der Ordner mit der Strukturdatei der Anwendung.
  • Mit <!--#4DBASE --> können Sie den Standardordner, den 4DINCLUDE in der aktuellen Seite verwendet, verändern (siehe unten)

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-->

4DBASE  

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-->

4DCODE  

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
//Initialisierung der PARAMETER
C_OBJECT:C1216($graphParameters)
OB SET:C1220($graphParameters;"graphType";1)
$graphType:=1
//...Ihr Code hier
if (OB Is defined:C1231($graphParameters;"graphType"))
    $graphType:=OB GET:C1224($graphParameters;"graphType")
    if ($graphType=7)
        $nbSeries:=1
        if ($nbValues>8)
            DELETE FROM ARRAY:C228 ($yValuesArrPtr{1}->;9;100000)
            $nbValues:=8
        end if
    end if
end if
-->

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:

  • Der Befehl TRACE wird unterstützt und aktiviert den 4D Debugger, so dass Sie Ihren Template Code debuggen können.
  • Jeder Fehler zeigt den Standard Fehlerdialog, über den der Nutzer die Ausführung des Code stoppen oder in den Schrittmodus zum Debuggen gehen kann.
  • Der Text zwischen <!--#4DCODE und --> ist in Zeilen aufgeteilt, die die verschiedenen Zeilenenden (cr, lf oder crlf) zulassen.
  • Der Text wird im Kontext der Datenbank tokenisiert, die PROCESS 4D TAGS aufgerufen hat. Das ist zum Beispiel zum Erkennen von Projektmethoden wichtig.
    Hinweis: Die Methodeneigenschaft "Zugang per 4D Tags und URLs (4DAction)" wird nicht berücksichtigt (siehe auch unten Hinweis zur Sicherheit).
  • Der 4D Code muss immer mit der Programmiersprache in Englisch-US geschrieben werden. Deshalb ignoriert 4DCODE die Benutzereinstellungen "Verwende regionale Systemeinstellungen" für die 4D Programmiersprache (siehe Sprache für Befehle und Konstanten).
  • Auch wenn der Text immer Englisch-US verwendet, wird empfohlen, die Syntax :Cxxx und :Kxxx für Befehls- und Konstantennamen zu verwenden, um Umbenennung von Befehlen oder Konstanten von einer 4D Version zur nächsten aufzufangen.
    Hinweis: Weitere Informationen zur Syntax :Cxxx und :Kxxx finden Sie im Abschnitt Tokens in Formeln verwenden.

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.
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.

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:

  • Code nur mit 4DELSE:
    <!--#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-->
  • Ähnlicher Code mit dem Tag 4DELSEIF:
    <!--#4DIF Condition1-->
         /* Condition1 ist wahr*/
    <!--#4DELSEIF Condition2-->
         /* Condition2 ist wahr*/
    <!--#4DELSEIF Condition3-->
        /* Condition3 ist wahr*/
    <!--#4DELSE-->
        /* Keine der Bedingungen ist wahr*/
    <!--#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>

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:

  • <!--#4DLOOP [Tabelle]-->
    Diese Syntax führt für jeden Datensatz der aktuellen Auswahl von Tabelle eine Schleife im laufenden Prozess aus. Der Teil des HTML Codes zwischen den beiden Kommentaren wird für jeden Datensatz der aktuellen Auswahl wiederholt.
    Hinweis:
    Wird ein Tag 4DLOOP mit einer Tabelle verwendet, werden die Datensätze im Nur-Lesen Modus geladen.

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 selec tion([People])))
    ...
    NEXT RECORD([People])
 End while

  • <!--#4DLOOP array-->
    Diese Syntax führt für jedes Element des Array eine Schleife aus. Der laufende Zähler des Array erhöht sich mit jeder Wiederholung dieses Teils des HTML Codes.
    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

  • <!--#4DLOOP Methode-->
    Diese Syntax führt eine Schleife aus, solange die Methode Wahr zurückgibt. Sie lässt einen Parameter vom Typ Lange Ganzzahl zu. Sie wird das erste Mal mit dem Wert 0 (Null) aufgerufen, damit evtl. eine Initialisierung durchgeführt werden kann. Dann wird sie sukzessiv mit den Werten 1, 2, 3... aufgerufen, solange sie Wahr zurückgibt.

Aus Sicherheitsgründen kann die Datenbankmethode On Web Authentication einmal direkt vor der Initialisierung aufgerufen werden (Methodenausführung mit 0 als Parameter). 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-->


... lässt sich folgendermaßen in 4D Code übersetzen:

 If(AuthenticationWebOK)
    If(my_method(0))
       $counter:=1
       While(my_method($counter))
          ...
          $counter:=$counter+1
       End while
    End if
 End if

Die Methode meine_methode lautet:

 C_LONGINT($1)
 C_BOOLEAN($0)
 If($1=0) `Initialisation
    $0:=True
 Else
    If($1<50)
       ...
       var:=...
       $0:=True
    Else
       $0:=False `Stops the loop
    End if
 End if

  • <!--#4DLOOP 4DAusdruck-->
    Mit dieser Syntax führt das Tag 4DLOOP eine Schleife aus, solange der 4D Ausdruck Wahr zurückgibt. Das kann jeder gültige Boolean Ausdruck sein und dieser sollte in jeder Schleife einen variablen Part zur Bewertung haben, um unendliche Schleifen zu vermeiden.

Dieser Code:

<!--#4DEVAL $i:=0-->
<!--#4DLOOP ($i<4)-->
<!--#4DEVAL $i-->
<!--#4DEVAL $i:=$i+1-->
<!--#4DENDLOOP-->

ergibt folgendes:

0
1
2
3

  • <!--#4DLOOP ZeigerArray-->
    In diesem Fall arbeitet das Tag 4DLOOP wie mit einem Array, d.h. es macht für jeden Eintrag im Array eine Schleife. Der aktuelle Eintrag des Array erhöht sich, wenn dieser Part im Code wiederholt wird.

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.

Folgende Fehlerbeschreibungen sind möglich:

  • Ein derartiger Ausdruck wurde nicht erwartet (generischer Fehler)
  • Ungültiger Tabellenname (Fehler im Tabellennamen)
  • Es wurde ein Array erwartet (die Variable ist kein Array bzw. ein zweidimensionales Array)
  • Die Methode existiert nicht
  • Syntaxfehler (beim Ausführen der Methode)
  • Zugriffsfehler (Rechte nicht ausreichend für Zugriff auf Tabelle oder Methode)
  • 4DENDLOOP wird erwartet (die Anzahl von <!--#4DENDLOOP--> passt nicht zur Anzahl von <!--#4DLOOP-->).

Einige vorhandene 4D Transformation Tags lassen sich jetzt mit der neuen Syntax mit $ schreiben:
Sie können $4dtag (expression) anstelle von <!--#4dtag expression--> verwenden

Diese alternative Syntax ist nur für Tags verfügbar, die bearbeitete Werte zurückgeben:

  • 4DTEXT
  • 4DHTML
  • 4DEVAL

(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
 myName:="<!--#4DHTML QUIT 4D-->" //böswillige Injektion
 input:="My name is: <!--#4DHTML myName-->"
 PROCESS 4D TAGS(input;output)
  //4D beendet!

  // Beispiel 2
 myName:="<!--#4DHTML QUIT 4D-->" //böswillige Injektion
 input:="My name is: <!--#4DTEXT myName-->"
 PROCESS 4D TAGS(input;output)
  //Ausgabe ergibt "My name is:  & lt;!--#4DHTML QUIT 4D-->"

  // Beispiel 3
 myName:="$4DEVAL(QUIT 4D)" //böswillige Injektion
 input:="My name is: <!--#4DTEXT myName-->"
 PROCESS 4D TAGS(input;output)
  //Ausgabe ergibt "My name is: $4DEVAL(QUIT 4D)"

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)\\\"\")"
 PROCESS 4D TAGS(input;output)
 -->Ausgabe ergibt 1"(hello)"