version 2004.2 (Modifiée)
Le serveur Web de 4D fournit diverses balises HTML spécifiques à 4D, permettant d'insérer des références à des expressions ou variables 4D, ou différents types de traitements, à l'intérieur des pages HTML envoyées par le serveur Web 4D, par exemple à l'aide des commandes ENVOYER FICHIER HTML et ENVOYER BLOB HTML. Ces pages sont appelées pages semi-dynamiques.
Ces balises doivent être insérées sous forme de commentaires HTML (<!--#LaBalise LeContenu--> en code HTML). La plupart des éditeurs HTML proposent des fonctions facilitant l'insertion de commentaires dans les pages statiques.
Les balises HTML 4D disponibles sont les suivantes :
4DVAR, pour insérer des variables et expressions 4D
4DHTMLVAR, semblable à 4DVAR mais insérant du code HTML
4DSCRIPT, pour exécuter une méthode 4D
4DINCLUDE, pour insérer une page HTML dans une autre page
4DIF, 4DELSE et 4DENDIF, pour insérer des conditions dans le code HTML
4DLOOP et 4DENDLOOP, pour insérer des boucles dans le code HTML
Note de compatibilité : Dans les versions 6.0.x de 4D, l'insertion de variables 4D dans les pages statiques s'effectuait à l'aide d'une notation utilisant des crochets ([NomVar]). Si vous travaillez avec une base créée avec une version précédente de 4D et souhaitez utiliser la notation standard <!--#4DVAR NomVar-->, assurez-vous que l'option "Utiliser les commentaires 4DVAR au lieu des crochets" dans la boîte de dialogue des Préférences est bien cochée (reportez-vous à la section Paramétrages du serveur Web).
Traitement des balises HTML 4D
L'analyse du contenu des pages semi-dynamiques envoyées par 4D s'effectue au moment de l'appel à ENVOYER FICHIER HTML (.htm, .html, .shtm, .shtml), ENVOYER BLOB HTML (blob de type text/html) et lors de l'envoi de pages appelées via des URLs.
Toutefois en mode sans contexte, à 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).
Un exemple d'utilisation de ce type de page est fourni dans la description de la routine STATISTIQUES DU CACHE WEB.
Voici un tableau récapitulatif des cas dans lesquels 4D analyse les balises contenues dans les pages HTML envoyées aux navigateurs Web :
Conditions d'envoi | Analyse du contenu des pages envoyées | |
Mode contextuel | Mode sans contexte | |
Extensions des pages (cas général) : | ||
.htm, .html, .shtm, .shtml (pages HTML) | X | X |
.xml, .xsl (pages XML) | X | X |
.wml (pages WML) | X | X |
Pages appelées par des URLs | X | X, sauf pages suffixées ".htm" |
ou ".html" | ||
Commande ENVOYER FICHIER HTML | X | X |
Commande ENVOYER BLOB HTML (si le | X | X |
BLOB est du type "text/html") | ||
Inclusion par la balise <!--#4DINCLUDE--> | X | X |
Inclusion par la balise {mapage.htm} | X | - |
En vue d'une exploitation par 4D, un commentaire HTML doit toujours être de la forme <!--#4D...-->. Attention, certains éditeurs HTML ajoutent automatiquement d'autres informations au sein d'un commentaire, ce qui peut entraîner des erreurs d'analyse.
La présence d'autres commentaires HTML (par exemple <!--Début de liste-->) est toutefois possible.
Si un commentaire <!--#4D... ne se termine pas par -->, un texte de la forme "<!--#4D... : --> attendu" sera inséré et l'analyse sera interrompue à ce niveau (la page sera tout de même envoyée pour indiquer l'erreur).
Il est possible d'imbriquer les différents types de commentaires. 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 : <!--#4DVAR [TABLE]ValNum--></B><BR> (Affichage d'un champ) <!--#4DENDIF--> <!--#4DENDLOOP--> (Fin de boucle) </BODY> </HTML>
Balise 4DVAR
Syntaxe : <!--#4DVAR NomVar--> ou <!--#4DVAR Expression4D-->
La balise <!--#4DVAR NomVar--> vous permet d'insérer une référence à une variable ou à une expression 4D à tout endroit d'une page HTML. Par exemple, si vous écrivez :
<P>Bienvenue sur <!--#4DVAR vtNomSite-->!</P>
La valeur de la variable 4D vtNomSite sera insérée dans la page HTML lors de son envoi.
Vous pouvez également insérer du code HTML dans une variable texte 4D. Pour cela, il vous suffit de faire débuter la variable par le code ASCII 1 (par exemple, vtHTML:=Caractere(1)+"...code HTML..."). Un autre moyen consiste à utiliser la balise 4DHTMLVAR.
Il est aussi possible d'insérer des expressions 4D dans les commentaires HTML 4D à l'aide de la balise 4DVAR. Vous pouvez par exemple insérer directement le contenu d'un champ (<!--#4DVAR [nomTable]nomChamp-->), un élément de tableau (<!--#4DVAR tab{1}-->) ou une méthode retournant une valeur (<!--#4DVAR 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.
Note : L'exécution d'une méthode 4D avec 4DVAR est soumise à la valeur de l'attribut "Disponible via 4DACTION, 4DMETHOD et 4DSCRIPT" 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.
Bien qu'une expression puisse contenir directement des appels de fonctions 4D, il est déconseillé d'utiliser ce mode de fonctionnement, pour des raisons de localisation. Par exemple le commentaire <!--#4DVAR Date du jour-->, bien que correctement interprété avec un 4D français, ne sera pas traité avec un 4D anglais. Il en va de même pour le traitement des nombres réels (car le séparateur décimal peut varier d'un pays à l'autre). Dans ces deux cas, il est préférable d'affecter une variable par programmation.
En cas d'erreur d'évaluation, le texte inséré sera de la forme "<!--#4DVAR mavar--> : ## erreur # code d'erreur".
Notes :
Vous devez utiliser des variables process.
Il est possible d'afficher le contenu d'un champ image. En outre (en mode contextuel uniquement), vous pouvez également afficher le contenu d'une variable image. En revanche, dans les deux modes, il n'est pas possible d'afficher le contenu d'un élément de tableau image.
Comme le HTML est orienté texte, vous travaillerez généralement avec des variables Texte. Toutefois, vous pouvez également utiliser des variables BLOB (ce qui vous permet de vous affranchir de la limite des 32 000 caractères inhérente aux variables de type texte). Il vous suffit pour cela de générer des BLOBs en mode Texte sans longueur.
Des exemples d'utilisation de la balise 4DVAR sont fournis dans la section Associer des objets 4D à des objets HTML.
Balise 4DHTMLVAR
Syntaxe : <!--#4DHTMLVAR NomVar--> ou <!--#4DHTMLVAR Expression4D-->
Cette balise permet d'évaluer une variable ou une expression 4D et de l'insérer dans une page en tant qu'expression HTML. En fait, cette balise produit exactement les mêmes effets que la balise <!--#4DVAR mavar-->, lorsque mavar débute par le caractère de code ASCII 1.
Par exemple, voici les résultats de l'insertion de la variable Texte 4D mavar à l'aide des balises disponibles :
Valeur de mavar | Balises | Insertion dans la page Web |
mavar:="<B>" | <!--#4DVAR mavar--> | <B> |
mavar:=Caractere(1)+"<B>" | <!--#4DVAR mavar--> | <B> |
mavar:="<B>" | <!--#4DHTMLVAR mavar--> | <B> |
En cas d'erreur d'évaluation, le texte inséré sera de la forme "<!--#4DHTMLVAR mavar--> : ## erreur # code d'erreur".
Note : L'exécution d'une méthode 4D avec 4DHTMLVAR est soumise à la valeur de l'attribut "Disponible via 4DACTION, 4DMETHOD et 4DSCRIPT" 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.
Note : La variable doit être exprimée à l'aide de la table de caractères ISO Latin-1 (pour plus d'informations, reportez-vous à la description de la commande Mac vers ISO).
Balise 4DSCRIPT/
Syntaxe : <!--#4DSCRIPT/NomMéthode/Param-->
La balise 4DSCRIPT/ vous permet d'exécuter des méthodes 4D au moment de l'envoi de pages HTML statiques. La présence dans une page statique 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. 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 retourne alors du texte dans $0. Si la chaîne débute par le caractère de code ASCII 1, elle est considérée comme du HTML (même principe que pour les variables).
Note : L'exécution d'une méthode avec 4DSCRIPT est soumise à la valeur de l'attribut "Disponible via 4DACTION, 4DMETHOD et 4DSCRIPT" 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.
Note : En mode contextuel, la méthode est exécutée dans le contexte.
Par exemple, vous insérez dans une page statique 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/03"), l'expression "Nous sommes le <!--#4DSCRIPT/MAMETH/MONPARAM-->" devient alors "Nous sommes le 28/10/03".
Le code de MAMETH est :
C_TEXTE($0;$1) `Ces paramètres doivent TOUJOURS être déclarés $0:=Chaine(Date du jour)
Note : Une méthode appelée par 4DSCRIPT ne doit pas faire appel à des éléments d'interface (DIALOGUE, ALERTE...)
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é.
Note : Vous pouvez insérer autant de commentaires <!--#4DSCRIPT...--> que vous voulez dans une page statique.
Note de compatibilité : Dans les versions précédentes de 4D, la même balise, 4DACTION, pouvait être utilisée soit sous forme d'URL (par exemple http://monserver/4DACTION/meth), soit sous forme de commentaire HTML dans une page statique (<!--#4DACTION/meth-->). Cette diversité d'utilisations pouvant entraîner des confusions, la balise de commentaire 4DSCRIPT permet désormais de dissocier les deux usages. La balise 4DSCRIPT s'utilise exclusivement sous forme de commentaire HTML (<!--#4DSCRIPT/meth-->) et produit exactement les mêmes effets que <!--#4DACTION/meth-->. 4DACTION est désormais réservée à une utilisation en tant qu'URL.
Balise 4DINCLUDE
Syntaxe : <!--#4DINCLUDE chemin-->
Ce commentaire permet d'inclure, dans une page HTML, le corps d'une autre page HTML (désignée par le paramètre chemin). Le corps d'une page HTML désigne ce qui est compris entre les balises <BODY> et </BODY> (les balises elles-mêmes ne sont pas incluses).
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, quels que soient le mode et 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 ENVOYER FICHIER HTML.
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).
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".
Note : En mode contextuel, si une page est insérée dans un formulaire via un marqueur {mapage.html} inséré dans une zone de texte statique, les éventuels commentaires 4DINCLUDE qu'elle contient seront ignorés.
Exemples
<!--#4DINCLUDE souspage.html--> <!--#4DINCLUDE dossier/souspage.html--> <!--#4DINCLUDE ../dossier/souspage.html-->
Balises 4DIF, 4DELSE et 4DENDIF
Syntaxe : <!--#4DIF expression--> <!--#4DELSE--> <!--#4DENDIF-->
Utilisé en conjonction avec les commentaires <!--#4DELSE--> (optionnel) et <!--#4DENDIF-->, le commentaire <!--#4DIF expression--> offre la possibilité d'exécuter du code HTML 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-->.
Exemple
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 <!--#4DVAR vnom-->. <!--#4DELSE--> Aucun nom n'a été trouvé. <!--#4DENDIF--> ... </BODY>
Balises 4DLOOP et 4ENDLOOP
Syntaxe : <!--#4DLOOP condition--> <!--#4DENDLOOP-->
Ce commentaire permet de répéter une portion de code HTML 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 trois 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 HTML 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 HTML suivant :
<!--#4DLOOP [Personnes]--> <!--#4DVAR [Personnes]Nom--> <!--#4DVAR [Personnes]Prenom--><BR> <!--#4DENDLOOP-->
... pourrait se traduire en langage 4D par :
DEBUT SELECTION([Personnes]) Tant que(Non(Fin de selection([Personnes]))) ... ENREGISTREMENT SUIVANT([Personnes]) Fin tant que
<!--#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 HTML.
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 HTML suivant :
<!--#4DLOOP tab_noms--> <!--#4DVAR tab_noms{tab_noms}--><BR> <!--#4DENDLOOP-->
... pourrait se traduire en langage 4D par :
Boucle($indice;1;Taille tableau(tab_noms)) tab_noms:=$indice ... Fin de boucle
<!--#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é, la Méthode base Sur authentification Web 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--> <!--#4DVAR var--> <BR> <!--#4DENDLOOP-->
... pourrait se traduire en code 4D par :
Si(AuthentificationWebOK) Si(ma_methode(0)) $compteur:=1 Tant que(ma_methode($compteur)) ... $compteur:=$compteur+1 Fin tant que Fin de si Fin de si
La méthode ma_methode pourrait avoir la forme suivante :
C_ENTIER LONG($1) C_BOOLEEN($0) Si ($1=0) `Initialisation $0:=Vrai Sinon Si($1<50) ... var:= ... $0:=Vrai Sinon $0:=Faux `Arrêt de la boucle Fin de si Fin de si
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 -->).
Référence
Associer des objets 4D à des objets HTML, URLs et actions de formulaires, Utiliser le mode contextuel.