4D v15.4Balises de transformation 4D |
|||||||||||
|
4D v15.4
Balises de transformation 4D
|
Valeur de mavar | Balises | Résultat |
mavar:="<B>" | <!--#4DTEXT mavar--> | <B> |
mavar:="<B>" | <!--#4DHTML mavar--> | <B> |
Pour assurer une évaluation correcte de l'expression 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.
En cas d’erreur d’évaluation, le texte inséré sera de la forme “<!--#4DHTML mavar--> : ## erreur # code d’erreur”.
Notes :
Syntaxe : <!--#4DEVAL NomVar--> ou <!--#4DEVAL Expression4D-->
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"
Pour assurer une évaluation correcte de l'expression 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.
En cas d’erreur lors de l'interprétation, le texte inséré sera de la forme “<!--#4DEVAL expr--> : ## erreur # code d’erreur”.
Notes :
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 :
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-->
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-->
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-->
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.
Pour assurer une évaluation correcte de l'expression 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.
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.
<!--#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-->
<!--#4DIF Condition1--> /* Condition1 est vraie*/ <!--#4DELSEIF Condition2--> /* Condition2 est vraie*/ <!--#4DELSEIF Condition3--> /* Condition3 est vraie*/ <!--#4DELSE--> /* Aucune condition n’est vraie */ <!--#4DENDIF-->
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-->
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>
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 [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 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 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
<!--#4DEVAL $i:=0--> <!--#4DLOOP ($i<4)--> <!--#4DEVAL $i--> <!--#4DEVAL $i:=$i+1--> <!--#4DENDLOOP-->
génère le résultat suivant :
0
1
2
3
Pour assurer une évaluation correcte de l'expression 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.
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 :
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 "<!--#4DEVAL QUIT 4D-->" qui ne sera pas transformé.
Pages semi-dynamiques
PROCESS 4D TAGS
Traiter les données reçues
URLs et actions de formulaires
Produit : 4D
Thème : Chaînes de caractères
4DVAR, 4DTEXT, 4DHTMLVAR, 4DHTML, 4DSCRIPT, 4DINCLUDE, 4DIF, 4DLOOP, 4DELSEIF
4D - Langage ( 4D v15.4)
4D - Langage ( 4D v15)
4D - Langage ( 4D v15.3)