4D v16.3

Balises de transformation 4D

Accueil

 
4D v16.3
Balises de transformation 4D

Balises de transformation 4D  


 

 

4D propose un jeu de balises de transformation permettant d'insérer des références à des expressions ou variables 4D ou d'effectuer différents types de traitements à l'intérieur d'un texte source, appelé "template". Ces balises sont interprétées lors de l'exécution du texte source et génèrent un texte de sortie. 

Ce principe est notamment utilisé par le serveur Web 4D pour construire des Pages semi-dynamiques.

Les balises sont généralement insérées sous forme de commentaires type HTML (<!--#LaBalise LeContenu-->). La présence d’autres commentaires (par exemple <!--Début de liste-->) est toutefois possible. Il est possible d’imbriquer les différents types de balises. Voici par exemple une structure HTML parfaitement envisageable :

<HTML>
...
<BODY>
<!--#4DSCRIPT/PRE_PROCESS-->         (Appel de méthode)
<!--#4DIF (mavar=1)-->               (Si condition)
   <!--#4DINCLUDE banner1.html-->   (Insertion d’une sous page)
<!--#4DENDIF-->                     (Fin de si)
<!--#4DIF (mavar=2)-->
   <!--#4DINCLUDE banner2.html-->
<!--#4DENDIF-->

<!--#4DLOOP [TABLE]-->               (Boucle sur la sélection courante)
<!--#4DIF ([TABLE]ValNum>10)-->         (Si [TABLE]ValNum>10)
   <!--#4DINCLUDE subpage.html-->   (Inclusion d'une sous page)
<!--#4DELSE-->                     (Sinon)
   <B>Valeur : <!--#4DTEXT [TABLE]ValNum--></B><BR>
                              (Affichage d’un champ)
<!--#4DENDIF-->
<!--#4DENDLOOP-->                  (Fin de boucle)
</BODY>
</HTML>

L’analyse du contenu des pages 'templates' est effectuée dans deux contextes :

  • Utilisation de la commande PROCESS 4D TAGS ; cette commande accepte un 'template' en entrée, ainsi que des paramètres (optionnel) et retourne un texte résultant du traitement.
  • Utilisation du serveur HTTP intégré de 4D : Pages semi-dynamiques envoyées via les commandes WEB SEND FILE (.htm, .html, .shtm, .shtml), WEB SEND BLOB (blob de type text/html), WEB SEND TEXT ou appelées via des URLs. Dans ce dernier cas, à des fins d'optimisation, les pages suffixées “.htm” et “.html” ne sont PAS analysées. Pour “forcer” l’analyse des pages HTML dans ce cas, vous devez les suffixer “.shtm” ou “.shtml” (par exemple http://www.server.com/dir/page.shtm). Pour plus d'informations sur ce point, reportez-vous à la section Pages semi-dynamiques dans le chapitre Serveur Web.

Le tableau suivant liste les balises de transformation 4D disponibles. Pour plus de détails, reportez-vous plus bas à la description des balises.

BaliseActionExempleSyntaxe $(*)Commentaire
4DTEXTInsère des variables et expressions 4D en texte<!--#4DTEXT [Client]Nom-->XConseillé si traitement de données externes pour éviter l'injection de code malveillant
4DHTMLInsère du code HTML<!--#4DHTML <br/>-->XDéconseillé si traitement de données externes
4DEVALEvalue toute expression 4D<!--#4DEVAL a:=20-->XDéconseillé si traitement de données externes
4DSCRIPT/Exécute une méthode 4D avec un paramètre<!--#4DSCRIPT/MyMethod/MyParam-->
4DINCLUDEInclut une page html dans une autre<!--#4DINCLUDE souspage.html-->
4DBASEDésigne le dossier à utiliser par 4DINCLUDE<!--#4DBASE ../dossier/-->
4DCODEInsère du code 4D<!--#4DCODE ALERT(myVar)-->Prend en charge les CR, LF (blocs de code 4D)
4DIF, 4DELSE, 4DELSEIF, 4DENDIFInsère des conditions dans le code balisé<!--#4DIF (myVar=1)-->
4DLOOP, 4DENDLOOPInsère des boucles dans le code balisé<!--#4DLOOP [table]-->Utilisable avec table, tableau, méthode, expression, pointeurTab

(*)Les balises doivent être généralement insérées sous forme de commentaires type HTML (<!--#LaBalise LeContenu-->) dans le texte source. Une syntaxe alternative utilisant le $ est utilisable dans certaines conditions pour les balises qui retournent des valeurs, afin de les rendre conformes au XML. Pour plus d'informations, reportez-vous ci-dessous au paragraphe Syntaxe alternative pour 4DTEXT, 4DHTML, 4DEVAL.

 

L'exécution d'une méthode 4D avec 4DTEXT, 4DHTML, 4DEVAL, 4DSCRIPT, 4DIF, 4DELSEIF ou 4DLOOP depuis une requête Web est soumise à la valeur de l’attribut “Disponible via les balises et URLs 4D (4DACTION...)” défini dans les propriétés de la méthode. Si l'attribut n'est pas coché pour la méthode, elle ne pourra pas être appelée depuis une requête Web. Pour plus d'informations sur ce point, reportez-vous à la section Sécurité des connexions.

Les balises 4D sont interprétées de manière récursive : 4D tente toujours de réinterpréter le produit d'une transformation et, si une nouvelle transformation a eu lieu, une interprétation supplémentaire est effectuée, et ainsi de suite jusqu'à ce que le produit obtenu ne nécessite plus de transformation. Par exemple, soit l'instruction suivante :

<!--#4DHTML [Courriers]Lettre_type--> 

Si le champ texte [Courriers]Lettre_type contient lui-même une balise, par exemple <!--#4DSCRIPT/m_Gender-->, elle sera évaluée récursivement après interprétation de la balise 4DHTML.

Ce principe puissant répond à la plupart des besoins liés à la transformation des textes. Attention cependant, il peut permettre également dans certains cas l'injection de code malveillant. Pour plus d'informations sur ce point, reportez-vous au paragraphe suivant.

Les balises de transformation 4D acceptent en paramètres différents types de données : textes, variables, méthodes, noms de commandes, etc. Lorsque ces données sont fournies par votre propre code, il n'y a pas de risque d'injection de code malveillant car vous contrôlez les entrées. Cependant, le code de votre base manipule souvent des données qui ont été, à un moment où à un autre, introduites via une source externe (saisie utilisateur, import, etc.).
Dans ce cas, il est conseillé de ne pas utiliser de balises de transformation qui évaluent les paramètres, comme 4DEVAL ou 4DSCRIPT, directement avec ces données.
De plus, en vertu du principe de récursivité (cf. paragraphe ci-dessus), le code malveillant peut lui-même contenir des balises de transformation. Dans ce cas, il est impératif d'utiliser la balise 4DTEXT.
Imaginez par exemple un champ de formulaire Web nommé "Nom", dans lequel l'utilisateur doit saisir son nom. Ce nom est ensuite affiché via une balise <!--#4DHTML vNom--> dans la page. Si un texte du type "<!--#4DEVAL QUIT 4D-->" est inséré au lieu du nom, l'interprétation de la balise provoquera la sortie de l’application.
Pour éviter ce risque, il suffit d'utiliser systématiquement la balise 4DTEXT dans ce cas. Comme cette balise échappe les caractères HTML spéciaux, le code récursif "malin" éventuellement inséré ne sera pas réinterprété. Pour reprendre l'exemple précédent, le champ "nom" contiendra dans ce cas "&lt;!--#4DEVAL QUIT 4D--&gt;" qui ne sera pas transformé.

Pour assurer l'évaluation correcte des expressions traitées via les balises, quelle que soit la langue ou la version de 4D, il est recommandé d'utiliser la syntaxe tokenisée pour les éléments dont le nom peut varier au fil des versions (commandes, tables, champs, constantes). Par exemple, pour insérer la commande Current time, saisissez 'Current time:C178'. Pour plus d'informations sur ce point, reportez-vous à la section Utiliser des tokens dans les formules.

A compter de la version 15 R4, 4D utilise toujours le point (.) comme séparateur décimal lors de l'évaluation d'une expression numérique via une balise 4DTEXT, 4DHTML, 4DEVAL ou 4DSCRIPT (ainsi que les anciennes balises 4DVAR et 4DHTMLVAR). Les paramètres régionaux sont ignorés dans ce contexte.

Ce fonctionnement facilite la maintenance et la compatibilité du code entre les diverses versions et langues de 4D. 

Par exemple, quels que soient les paramètres régionaux :

 value:=10/4
 input:="<!--#4DTEXT value-->"
 PROCESS 4D TAGS(input;output)
  // retourne toujours 2.5 même si les paramètres régionaux déclarent le ',' comme séparateur

Note de compatibilité : Si votre code, converti depuis une version précédente, évalue des expressions numériques via des balises 4D en tenant compte des paramètres régionaux, il vous sera nécessaire de l'adapter à l'aide de la commande String :

  • Pour obtenir value avec le point comme séparateur décimal : <!--#4DTEXT value-->
  • Pour obtenir value avec le séparateur décimal défini dans les paramètres régionaux : <!--#4DTEXT Chaine(value)-->

4DTEXT  

Syntaxe : <!--#4DTEXT NomVar--> ou <!--#4DTEXT Expression4D-->
Syntaxe alternative : $4DTEXT(NomVar) ou $4DTEXT(Expression4D) (voir Syntaxe alternative pour 4DTEXT, 4DHTML, 4DEVAL)

La balise <!--#4DTEXT NomVar--> vous permet d’insérer une référence à une variable ou à une expression 4D retournant une valeur. Par exemple, si vous écrivez dans une page HTML :
<P>Bienvenue sur <!--#4DTEXT vtNomSite-->!</P>
La valeur de la variable 4D vtNomSite sera insérée dans la page HTML lors de son envoi. Cette valeur est insérée sous forme de texte simple, les caractères HTML spéciaux tels que "<" sont automatiquement échappés.

Il est aussi possible d’insérer des expressions 4D à l’aide de la balise 4DTEXT. Vous pouvez par exemple insérer directement le contenu d’un champ (<!--#4DTEXT [nomTable]nomChamp-->), un élément de tableau (<!--#4DTEXT tab{1}-->) ou une méthode retournant une valeur (<!--#4DTEXT mamethode-->). La conversion de l’expression obéit aux mêmes règles que la conversion d’une variable. En outre, l’expression doit satisfaire aux règles de syntaxe de 4D.

En cas d’erreur d’évaluation, le texte inséré sera de la forme “<!--#4DTEXT mavar--> : ## erreur # code d’erreur”.

Notes :

  • Vous devez utiliser des variables process.
  • Il est possible d’afficher le contenu d’un champ image. En revanche, il n’est pas possible d’afficher le contenu d’un élément de tableau image.
  • Il est possible d'afficher le contenu d'un champ objet, par l'intermédiaire d'une formule 4D. Par exemple, vous pouvez écrire <!--#4DTEXT OB Get:C1224([Rect]Desc;\"color\")-->.
  • Vous travaillerez généralement avec des variables Texte. Toutefois, vous pouvez également utiliser des variables BLOB. Il vous suffit pour cela de générer des BLOBs en mode Texte sans longueur.

4DHTML  

Syntaxe : <!--#4DHTML NomVar--> ou <!--#4DHTML Expression4D-->
Syntaxe alternative : $4DHTML(NomVar) ou $4DHTML(Expression4D) (voir Syntaxe alternative pour 4DTEXT, 4DHTML, 4DEVAL)

Tout comme la balise 4DTEXT, cette balise permet d’évaluer une variable ou une expression 4D retournant une valeur et de l’insérer en tant qu’expression HTML. A la différence de la balise 4DTEXT, cette balise n'échappe pas les caractères HTML spéciaux tels que ">".

Par exemple, voici les résultats du traitement de la variable Texte 4D mavar à l’aide des balises 4DTEXT et 4DHTML :

Valeur de mavarBalisesRésultat
mavar:="<B>"<!--#4DTEXT mavar-->&lt;B&gt;
mavar:="<B>"<!--#4DHTML mavar--><B>

En cas d’erreur d’évaluation, le texte inséré sera de la forme “<!--#4DHTML mavar--> : ## erreur # code d’erreur”.

Note : Pour des raisons de sécurité, il est recommandé d'utiliser la balise 4DTEXT lorsque vous traitez des données introduites depuis l'extérieur de l'application, afin d'empêcher l'injection de code malveillant (cf. paragraphe Prévention de l'injection de code malveillant).

Syntaxe : <!--#4DEVAL NomVar--> ou <!--#4DEVAL Expression4D-->
Syntaxe alternative : $4DEVAL(NomVar) ou $4DEVAL(Expression4D) (voir Syntaxe alternative pour 4DTEXT, 4DHTML, 4DEVAL

La balise 4DEVAL vous permet d'évaluer une variable ou une expression 4D. Tout comme la balise 4DHTML, 4DEVAL n'échappe pas les caractères HTML lorsqu'elle retourne du texte. Cependant, à la différence de 4DHTML ou 4DTEXT, 4DEVAL vous permet d'exécuter toute instruction 4D valide, y compris des affectations ou des expressions qui ne retournent pas de valeur.

Par exemple, vous pouvez exécuter :

 $input:="<!--#4DEVAL a:=42-->" //affectation
 $input:=$input+"<!--#4DEVAL a+1-->" //calcul
 PROCESS 4D TAGS($input;$output)
  //$output = "43"

En cas d’erreur lors de l'interprétation, le texte inséré sera de la forme “<!--#4DEVAL expr--> : ## erreur # code d’erreur”.

Note: Pour des raisons de sécurité, il est recommandé d'utiliser la balise 4DTEXT lorsque vous traitez des données introduites depuis l'extérieur de l'application, afin d'empêcher l'injection de code malveillant (cf. paragraphe Prévention de l'injection de code malveillant).

Syntaxe : <!--#4DSCRIPT/NomMéthode/Param-->

La balise 4DSCRIPT/ vous permet d'exécuter des méthodes 4D au moment du traitement du template. La présence du commentaire HTML <!--#4DSCRIPT/NomMéthode/Param--> provoque l’exécution de la méthode NomMéthode avec le paramètre Param sous forme de chaîne dans $1.

Note : Si la balise est appelée dans le contexte d'un process Web, au chargement de la page, 4D appelle la Méthode base Sur authentification Web (si elle existe). Si elle retourne Vrai, 4D exécute la méthode. 

La méthode doit retourner du texte dans $0. Si la chaîne débute par le caractère de code 1, elle est considérée comme du HTML (même principe que pour la balise 4DHTML).

Note : L'exécution d'une méthode avec 4DSCRIPT est soumise à la valeur de l’attribut “Disponible via les balises et URLs 4D (4DACTION...)” défini dans les propriétés de la méthode. Pour plus d'informations sur ce point, reportez-vous à la section Sécurité des connexions.

Par exemple, vous insérez dans une page Web semi-dynamique le commentaire “Nous sommes le <!--#4DSCRIPT/MAMETH/MONPARAM-->”. Au chargement de la page, 4D appelle la Méthode base Sur authentification Web (si elle existe) puis la méthode MAMETH en lui passant comme paramètre (dans $1) la chaîne “/MONPARAM”.
La méthode retourne du texte dans $0 (par exemple “28/10/14”), l’expression “Nous sommes le <!--#4DSCRIPT/MAMETH/MONPARAM-->” devient alors “Nous sommes le 28/10/14”.

Le code de MAMETH est :

 C_TEXT($0;$1`Ces paramètres doivent TOUJOURS être déclarés
 $0:=String(Date du jour)

Note : Une méthode appelée par 4DSCRIPT ne doit pas faire appel à des éléments d’interface (DIALOG, ALERT...)

Comme 4D exécute les méthodes dans leur ordre d’apparition, il est tout à fait possible de faire appel à une méthode qui fixe la valeur de plusieurs variables elles-mêmes référencées plus loin dans le document, quel que soit le mode utilisé. Vous pouvez insérer autant de commentaires <!--#4DSCRIPT...--> que vous voulez dans un template. 

Syntaxe : <!--#4DINCLUDE chemin-->

Cette balise est principalement conçue pour inclure, dans une page HTML, une autre page HTML (désignée par le paramètre chemin). Par défaut, seul le corps de la page HTML désignée, c'est-à-dire le contenu compris entre les balises <body> et </body>, est inclus (les balises elles-mêmes ne sont pas incluses). Ce principe permet d'éviter les conflits liés aux meta balises présentes dans les en-têtes. Toutefois, si la page HTML désignée ne contient pas de balises <body></body>, la page entière est incluse. Il vous appartient alors de veiller à la cohérence des meta balises.
Le commentaire <!--#4DINCLUDE --> s’avère particulièrement utile en combinaison avec les tests (<!--#4DIF-->) ou les boucles (<!--#4DLOOP-->). Il est également pratique pour inclure des bannières en fonction d’un critère, ou de manière aléatoire.
Au moment de l’inclusion, quelle que soit l’extension du nom du fichier, 4D analyse la page appelée puis insère son contenu — éventuellement modifié — dans la page d’où provient l’appel 4DINCLUDE.

Le placement dans le cache Web d’une page incluse à l’aide du commentaire <!--#4DINCLUDE --> répond aux mêmes règles que celles des pages demandées via un URL ou envoyées par la commande WEB SEND FILE.

Passez dans chemin le chemin d’accès au document à inclure. Attention : Dans le cas de la balise 4DINCLUDE, le chemin d’accès doit être défini relativement au document en cours d’analyse, c'est-à-dire au document “parent”, et non à la racine du serveur. Utilisez la barre oblique (/) comme séparateur de dossiers et les deux-points (..) pour remonter d’un niveau hiérarchique (syntaxe HTML).

Notes :

  • Lorsque vous utilisez la balise 4DINCLUDE avec la commande PROCESS 4D TAGS, le dossier par défaut est le dossier contenant le fichier de structure de la base.
  • Vous pouvez modifier le dossier par défaut utilisé par la balise 4DINCLUDE dans la page courante, à l'aide de la balise <!--#4DBASE --> (cf. ci-dessous).

Le nombre de <!--#4DINCLUDE chemin--> au sein d’une page n’est pas limité. Toutefois, les appels à <!--#4DINCLUDE chemin--> ne peuvent s’effectuer que sur 1 niveau. Cela signifie que par exemple vous ne pouvez pas insérer le commentaire <!--#4DINCLUDE mondoc3.html--> dans le corps de la page mondoc2.html, elle-même appelée par <!--#4DINCLUDE mondoc2--> inséré dans mondoc1.html.
En outre, 4D contrôle que les inclusions ne sont pas récursives.

En cas d’erreur, le texte inséré est de la forme "<!--#4DINCLUDE chemin--> : Le document ne peut pas être ouvert".

Exemples :

<!--#4DINCLUDE souspage.html-->
<!--#4DINCLUDE dossier/souspage.html-->
<!--#4DINCLUDE ../dossier/souspage.html-->

4DBASE  

Syntaxe : <!--#4DBASE cheminDossier-->

La balise <!--#4DBASE --> permet de désigner un répertoire courant qui sera utilisé par la balise <!--#4DINCLUDE-->.
Lorsqu’elle est appelée dans une page Web, la balise <!--#4DBASE --> modifie tous les appels <!--#4DINCLUDE--> suivants dans cette page, jusqu’au prochain <!--#4DBASE --> éventuel. Si le dossier <!--#4DBASE --> est modifié depuis un fichier inclus, il récupère sa valeur d’origine dans le fichier parent. 

Le paramètre cheminDossier doit contenir un chemin d’accès relatif à la page courante. Il doit se terminer par une barre oblique (/). Le dossier désigné doit être situé à l’intérieur du dossier Web.
Passez le mot-clé WEBFOLDER pour rétablir le chemin par défaut (relatif à la page). 

Ainsi, le code suivant, devant spécifier un chemin relatif à chaque appel :

<!--#4DINCLUDE subpage.html--> 
<!--#4DINCLUDE folder/subpage1.html-->
<!--#4DINCLUDE folder/subpage2.html-->
<!--#4DINCLUDE folder/subpage3.html-->
<!--#4DINCLUDE  ../folder/subpage.html-->

... peut être réécrit à l’aide de la balise <!--#4DBASE --> :

<!--#4DINCLUDE subpage.html--> 
<!--#4DBASE folder/-->
<!--#4DINCLUDE subpage1.html-->
<!--#4DINCLUDE subpage2.html-->
<!--#4DINCLUDE subpage3.html-->
<!--#4DBASE ../folder/-->
<!--#4DINCLUDE subpage.html-->
<!--#4DBASE WEBFOLDER-->

Exemple  

Définition d’un répertoire pour la page d’accueil à l’aide de la balise <!--#4DBASE --> :

/* Index.html */
<!--#4DIF LangFR=True-->
    <!--#4DBASE FR/-->
<!--#4DELSE-->
    <!--#4DBASE US/-->
<!--#4DENDIF-->
<!--#4DINCLUDE head.html-->
<!--#4DINCLUDE body.html-->
<!--#4DINCLUDE footer.html-->

Dans le fichier head.html, le dossier courant est modifié via <!--#4DBASE -->, sans que cela change sa valeur dans Index.html :

/* Head.htm */
/* ici le répertoire courant est relatif au fichier inclus (FR/ ou US/) */
<!--#4DBASE Styles/-->
<!--#4DINCLUDE main.css-->
<!--#4DINCLUDE product.css-->
<!--#4DBASE Scripts/-->
<!--#4DINCLUDE main.js-->
<!--#4DINCLUDE product.js-->

4DCODE  

La balise 4DCODE vous permet d'insérer un bloc de code 4D multi-lignes dans un template.

Lorsqu'une séquence "<!--#4DCODE" suivie d'un caractère espace, CR ou LF est détectée, 4D interprète directement toutes les lignes de code jusqu'à la séquence "-->" suivante. Le bloc de code lui-même peut contenir des retours chariot, des retours ligne, ou les deux ; il sera interprété séquentiellement par 4D.

Par exemple, à l'aide de la balise 4DCODE, vous pouvez écrire dans un template :

<!--#4DCODE
//Initialisation des paramètres
C_OBJECT:C1216($graphParameters)
OB SET:C1220($graphParameters;"graphType";1)
$graphType:=1
//...votre code ici
If(OB Is defined:C1231($graphParameters;"graphType")) //langage US uniquement
    $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
-->

Note : Dans une balise 4DCODE, le code 4D doit toujours être écrit en langage Anglais-US. 4DCODE ne tient pas compte de la préférence "Utiliser paramètres régionaux système " pour le langage 4D (voir Langue des commandes et des constantes ).

La balise 4DCODE inclut les fonctionnalités suivantes :

  • La commande TRACE est prise en charge et active le débogueur de 4D, vous permettant donc de déboguer le code de votre template.
  • Toute erreur est affichée via la boîte de dialogue standard d'erreur qui propose à l'utilisateur de stopper l'exécution du code ou d'ouvrir le débogueur.
  • Les lignes du texte situé entre <!--#4DCODE et --> peuvent utiliser tout type de convention de fin de ligne (cr, lf ou crlf).
  • Le texte est tokenisé dans le contexte de la base qui a appelé la commande PROCESS 4D TAGS. Ce principe est important pour la reconnaissance des méthodes projet par exemple.
    Note : La propriété de méthode "Disponible via les balises HTML et les URLs 4D" n'est pas prise en compte (voir également ci-dessous Note à propos de la sécurité).
  • Même si le texte utilise toujours la langue Anglais-US, il est recommandé d'utiliser la syntaxe avec tokens (:Cxxx) pour les noms des commandes et des constantes afin d'éliminer les problèmes potentiels liés au renommage des commandes ou des constantes entre deux versions de 4D.
    Note : Pour plus d'informations sur la syntaxe :Cxxx, veuillez vous référer à la section Utiliser des tokens dans les formules.

Note à propos de la sécurité : Le fait que les balises 4DCODE puissent appeler n'importe quelle commande 4D ou méthode projet pourrait être perçu comme une faille de sécurité, notamment lorsque la base est accessible via HTTP. Cependant, comme elle exécute côté serveur du code appelé depuis vos propres fichiers de templates, la balise elle-même ne pose aucun problème de sécurité. Dans ce contexte, comme pour tout serveur Web, la sécurité doit avant tout être optimale au niveau des accès distants aux fichiers du serveur.

Syntaxe : <!--#4DIF expression--> {<!--#4DELSEIF expression2-->...<!--#4DELSEIF expressionN-->} {<!--#4DELSE-->} <!--#4DENDIF-->

Utilisé en conjonction avec les commentaires <!--#4DELSEIF--> (optionnel), <!--#4DELSE--> (optionnel) et <!--#4DENDIF-->, le commentaire <!--#4DIF expression--> offre la possibilité d’exécuter des portions de code de manière conditionnelle.
Le paramètre expression peut contenir toute expression 4D valide retournant une valeur booléenne. Elle doit figurer entre parenthèses et respecter les règles de syntaxe de 4D.

Les blocs <!--#4DIF expression--> ... <!--#4DENDIF--> peuvent être imbriqués sur plusieurs niveaux. Comme dans 4D, chaque <!--#4DIF expression--> doit avoir un <!--#4DENDIF--> correspondant.
En cas d’erreur d’évaluation, le texte “<!--#4DIF expression--> : Une expression booléenne était attendue” est inséré à la place du contenu situé entre <!--#4DIF --> et <!--#4DENDIF-->.
De même, s’il n’y a pas autant de <!--#4DENDIF--> que de <!--#4DIF -->, le texte “<!--#4DIF expression--> : 4DENDIF attendu” est inséré à la place du contenu situé entre <!--#4DIF --> et <!--#4DENDIF-->.

A l’aide de la balise <!--#4DELSEIF-->, vous pouvez tester un nombre illimité de conditions. Seul le contenu suivant la première condition évaluée à Vrai sera exécuté. Si aucune des conditions n’est vraie, aucun contenu n’est exécuté (s’il n’y a pas de <!--#4DELSE--> final).
Vous pouvez utiliser une balise <!--#4DELSE--> après le dernier <!--#4DELSEIF-->. Si toutes les conditions sont fausses, les instructions suivant le <!--#4DELSE--> seront exécutées.

Les deux codes suivants sont équivalents.

  • Code utilisant uniquement 4DELSE :
    <!--#4DIF Condition1-->
      /* Condition1 est vraie*/
    <!--#4DELSE-->
        <!--#4DIF Condition2-->
            /* Condition2 est vraie*/
        <!--#4DELSE-->
            <!--#4DIF Condition3-->
                /* Condition3 est vraie */
            <!--#4DELSE-->
                /*Aucune condition n’est vraie*/
            <!--#4DENDIF-->
        <!--#4DENDIF-->
    <!--#4DENDIF-->
  • Code similaire utilisant la balise 4DELSEIF :
    <!--#4DIF Condition1-->
         /* Condition1 est vraie*/
    <!--#4DELSEIF Condition2-->
         /* Condition2 est vraie*/
    <!--#4DELSEIF Condition3-->
        /* Condition3 est vraie*/
    <!--#4DELSE-->
        /* Aucune condition n’est vraie */
    <!--#4DENDIF-->

Cet exemple de code inséré dans une page HTML statique affiche un libellé différent en fonction du résultat de l’expression vnom#"" :

<BODY>
...
<!--#4DIF (vnom#"")-->
Noms commençant par <!--#4DTEXT vnom-->.
<!--#4DELSE-->
Aucun nom n’a été trouvé.
<!--#4DENDIF-->
...
</BODY>

Cet exemple insère des pages différentes en fonction de l’utilisateur connecté :

<!--#4DIF LoggedIn=False-->
    <!--#4DINCLUDE Login.htm -->
<!--#4DELSEIF User="Admin" -->
    <!--#4DINCLUDE AdminPanel.htm -->
<!--#4DELSEIF User="Manager" -->
    <!--#4DINCLUDE SalesDashboard.htm -->
<!--#4DELSE-->
    <!--#4DINCLUDE ItemList.htm -->
<!--#4DENDIF-->

Syntaxe : <!--#4DLOOP condition--> <!--#4DENDLOOP-->

Ce commentaire permet de répéter une portion de code tant que la condition est remplie. La portion est délimitée par <!--#4DLOOP--> et <!--#4DENDLOOP-->.
Les blocs <!--#4DLOOP condition--> ... <!--#4DENDLOOP--> peuvent être imbriqués. Comme dans 4D, chaque <!--#4DLOOP condition--> doit avoir un <!--#4DENDLOOP--> correspondant.

Il existe cinq types de conditions :

  • <!--#4DLOOP [table]-->
    Cette syntaxe effectue une boucle pour chaque enregistrement de la sélection courante de table dans le process en cours. La portion de code située entre les deux commentaires est répétée pour chaque enregistrement de la sélection courante.
    Note : Lors de l'utilisation de 4DLOOP avec une table, les enregistrements sont chargés en mode Lecture seule.
    L’exemple de code suivant :
<!--#4DLOOP [Personnes]-->
<!--#4DTEXT [Personnes]Nom--> <!--#4DTEXT [Personnes]Prenom--><BR>
<!--#4DENDLOOP-->

... pourrait se traduire en langage 4D par :

 FIRST RECORD([Personnes])
 While(Not(End selection([Personnes])))
    ...
    NEXT RECORD([Personnes])
 End while
  • <!--#4DLOOP tableau-->
    Cette syntaxe effectue une boucle pour chaque élément du tableau. L’indice courant du tableau est incrémenté à chaque répétition de la portion de code.
    Il n’est pas possible d’utiliser cette syntaxe avec des tableaux à deux dimensions. Dans ce cas, la solution consiste à combiner une méthode et des boucles imbriquées.

    L’exemple de code suivant :
<!--#4DLOOP tab_noms-->
<!--#4DTEXT tab_noms{tab_noms}--><BR>
<!--#4DENDLOOP-->

... pourrait se traduire en langage 4D par :

 For($indice;1;Size of array(tab_noms))
    tab_noms:=$indice
    ...
 End for
  • <!--#4DLOOP méthode-->
    Cette syntaxe effectue une boucle tant que la méthode retourne Vrai. La méthode admet un paramètre de type Entier long. Elle est appelée une première fois avec la valeur 0 pour permettre une éventuelle phase d’initialisation, puis elle est appelée successivement avec les valeurs 1, 2, 3... tant qu’elle renvoie Vrai.
    Pour des raisons de sécurité, dans le contexte d'un process Web la On Web Authentication database method peut être appelée, une seule fois, avant la phase d’initialisation (exécution de la méthode avec 0 comme paramètre). Si l’authentification est confirmée, la phase d’initialisation a lieu.
    En vue de la compilation de la base, il est impératif de déclarer C_BOOLEEN($0) et C_ENTIER LONG($1) au sein de la méthode.
    L’exemple de code HTML suivant :
<!--#4DLOOP ma_methode-->
<!--#4DTEXT var--> <BR>
<!--#4DENDLOOP-->

... pourrait se traduire en code 4D par :

 If(AuthentificationWebOK)
    If(ma_methode(0))
       $compteur:=1
       While(ma_methode($compteur))
          ...
          $compteur:=$compteur+1
       End while
    End if
 End if

La méthode ma_methode pourrait avoir la forme suivante :

 C_LONGINT($1)
 C_BOOLEAN($0)
 If($1=0)
  `Initialisation
    $0:=True
 Else
    If($1<50)
       ...
       var:=...
       $0:=True
    Else
       $0:=False `Arrêt de la boucle
    End if
 End if
  • <!--#4DLOOP expression4D-->
    Avec cette syntaxe, la balise 4DLOOP effectue une boucle tant que l'expression 4D retourne Vrai. L'expression peut être toute expression booléenne valide et doit contenir une partie variable évaluée à chaque boucle afin d'éviter les boucles infinies.
    Par exemple, le code suivant :

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

génère le résultat suivant :

0
1
2
3

  • <!--#4DLOOP pointeurTab-->
    Dans ce cas, la balise 4DLOOP se comporte exactement comme avec un tableau : elle effectue une boucle pour chaque élément du tableau pointé. L'élément courant du tableau est incrémenté chaque fois que le morceau de code est répété.
    Cette syntaxe est principalement utile lorsque vous passez un pointeur de tableau en paramètre à la commande PROCESS 4D TAGS.
    Exemple :

 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;"éléments = ";->$array)
  // $output = "éléments = hello world "

En cas d’erreur d’évaluation, le texte “<!--#4DLOOP expression--> : descriptif” est inséré à la place du contenu situé entre <!--#4DLOOP --> et <!--#4DENDLOOP-->.
Le descriptif de l’erreur peut être l’un des suivants :

  • Une expression de ce type n’était pas attendue (erreur générique).
  • Nom de table invalide (erreur sur le nom de la table).
  • Un tableau était attendu (la variable n’est pas un tableau ou est un tableau à deux dimensions).
  • La méthode n’existe pas.
  • Erreur de syntaxe (lors de l’exécution de la méthode).
  • Erreur de privilège (pas de droits suffisants pour accéder à la table ou à la méthode).
  • 4DENDLOOP attendu (le nombre de <!--#4DENDLOOP--> n’est pas égal à celui de <!--#4DLOOP -->).

Plusieurs balises de transformation 4D peuvent être exprimées à l'aide d'une syntaxe utilisant le $ :
$4dbalise (expression) peut remplacer <!--#4dbalise expression-->

Conditions de prise en charge
La syntaxe avec $ est utilisable uniquement avec certaines balises et dans certains contextes d'évaluation :

  • Balises
    Seules les balises qui traitent et retournent des valeurs acceptent cette syntaxe :
    • 4DTEXT
    • 4DHTML
    • 4DEVAL
  • Evaluation
    La syntaxe $ déclenche l'évaluation des balises par 4D uniquement dans les cas où l'évaluation est explicite :
    • commande PROCESS 4D TAGS
    • pages statiques .shtml servies directement par le serveur Web via des URLs
    • pages insérées via la balise 4DINCLUDE

Pour les autres balises (4DIF, 4DSCRIPT...) et dans les autres contextes d'évaluation (commandes WEB SEND FILE, WEB SEND BLOB et WEB SEND TEXT), la syntaxe $ n'est pas prise en charge, il est nécessaire d'utiliser la syntaxe standard.

Mode d'utilisation

Par exemple, vous pouvez écrire :

$4DEVAL(NomUtilisateur)

au lieu de :

<!--#4DEVAL(NomUtilisateur)-->

Le principal avantage de cette syntaxe est qu'elle vous permet d'écrire des templates conformes à la norme XML. Certains développeurs 4D ont besoin d'écrire et de valider des templates à base d'XML et en utilisant des éditeurs standard. Comme le caractère "<" est interdit dans une valeur d'attribut XML, il n'est pas possible d'utiliser la syntaxe "<!-- -->" pour les balises 4D sans rendre le document invalide du point du vue du XML. Parallèlement, échapper le caractère "<" empêche 4D d'interpréter correctement les balises. 

Par exemple, le code suivant provoquera une erreur d'analyse XML à cause du premier caractère "<" dans la valeur de l'attribut :

<line x1="<!--#4DEVAL $x-->" y1="<!--#4DEVAL $graphY1-->"/>

Grâce à la syntaxe $, le code suivant sera en revanche parfaitement validé par l'analyseur XML :

<line x1="$4DEVAL($x)" y1="$4DEVAL($graphY1)"/>

A noter que les syntaxes $4dbalise et <--#4dbalise --> ne sont pas strictement équivalentes : à la différence de <--#4dbalise -->, le traitement de $4dbalise n'effectuera pas d'interprétation récursive des balises. Les balises $ sont toujours évaluées une seule fois et le résultat est considéré comme du texte brut.

Note : Pour plus d'informations sur ce point, veuillez vous référer au paragraphe .

La raison de cette différence est la prévention de l'injection de code malveillant. Comme expliqué ci-dessous, il est fortement recommandé d'utiliser des balises 4DTEXT au lieu de balises 4DHTML lorsque le code manipule du texte saisi par les utilisateurs, de manière à empêcher toute réinterprétation des balises : avec 4DTEXT, les caractères spéciaux tels que "<" sont échappés, et donc toute balise 4D utilisant la syntaxe <!--#4dbalise expression --> perdra sa signification spécifique. Cependant, comme 4DTEXT n'échappe pas le symbole $, nous avons décidé de renoncer à prendre en charge la récursivité des traitements afin de rendre impossible toute injection de code malveillant via la syntaxe $4dbalise (expression).

Les exemples suivants montrent le résultat du traitement en fonction de la syntaxe et de la balise utilisées :

  // exemple 1
 myName:="<!--#4DHTML QUITTER 4D-->" //injection de code malveillant
 input:="Mon nom est : <!--#4DHTML myName-->"
 PROCESS 4D TAGS(input;output)
  //4D quitte !

  // exemple 2
 myName:="<!--#4DHTML QUITTER 4D-->" //injection de code malveillant
 input:="Mon nom est : <!--#4DTEXT myName-->"
 PROCESS 4D TAGS(input;output)
  //output vaut "Mon nom est : &lt;!--#4DHTML QUITTER 4D--&gt;"

  // exemple 3
 myName:="$4DEVAL(QUITTER 4D)" //injection de code malveillant
 input:="Mon nom est : <!--#4DTEXT myName-->"
 PROCESS 4D TAGS(input;output)
  //output is "Mon nom est : $4DEVAL(QUIT 4D)"

Notez que la syntaxe $4dbalise prend en charge les paires fermantes de guillemets ou de parenthèses incluses. Par exemple, supposons que vous souhaitez évaluer la chaîne complexe suivante (exemple théorique) :

String(1) + "\"(hello)\""

Vous pouvez écrire :

 input:="$4DEVAL( String(1)+\"\\\"(hello)\\\"\")"
 PROCESS 4D TAGS(input;output)
 -->output vaut 1"(hello)"



Voir aussi  

Pages semi-dynamiques
PROCESS 4D TAGS
Traiter les données reçues
URLs et actions de formulaires

 
PROPRIÉTÉS 

Produit : 4D
Thème : Chaînes de caractères

 
HISTORIQUE 

Modifié : 4D v15 R4

 
MOTS-CLÉS 

4DHTML, 4DVAR, 4DTEXT, 4DHTMLVAR, 4DIF, 4DSCRIPT, 4DLOOP, 4DELSEIF, 4DINCLUDE

 
UTILISATION DE L'ARTICLE

4D - Langage ( 4D v16)
4D - Langage ( 4D v16.1)
4D - Langage ( 4D v16.2)
4D - Langage ( 4D v16.3)