ExperSHOP - DynHtmlPage Principale Table Pour tout rapport de bug ou suggestion, envoyez un mèl au Support ExperLog Vue généraleDynHtml est une technologie permettant d'inclure des données provenant d'une base de données, ou d'autres données dynamiques, dans des pages HTML.Les pages DynHtml sont interprétées à la volée par ExperSHOP, et les résultats des requêtes à la base de données sont inclus dans le texte HTML (ainsi que d'autres informations dynamiques comme par exemple des valeurs de paramètres HTTP). Les fichiers sources DynHtml sont des fichiers ASCII, qui mélangent du HTML avec des tags spécifiques DynHtml: ceux-ci sont interprétés à l'exécution, afin d'afficher de l'information dynamique.
Comment écrire une page DynHtmlVoici un exemple de page DynHtml:
<html><body> <b>Liste des Clients</b><p> $DefineSql ListeClients SELECT Prenom, Nom FROM Client $IfPresent AgeMin $AppendSql ListeClients WHERE Age>AgeMin $Endif $ExecSql ListeClients $IfNoResult ListeClients Il n'y a pas de client. $Else $LoopOnResults ListeClients client Nom du client: $client:Nom$, $client:Prenom$<br> $EndLoop $EndIf </body></html> Les valeurs
de "Nom" et "Prenom" retournées dans le résultat de la requête
apparaîtront dans le navigateur web, à la place de $client:Nom$
et $client:Prenom$; Liste des Clients Nom du client:
Durand, Paul Remarquez l'instruction "$IfPresent... $Endif": si la page DynHtml est appelée avec un paramètre HTTP nommé "AgeMin", une clause WHERE est ajoutée à la requête SQL.
Comment s'interprète une page DynHtmlLes pages DynHtml sont interprétées par les servlets ExperSHOP Lite:l'utilisateur n'a rien de particulier
Retrieve an SQL request into a variable $ExpandSql varname requestNameà faire.
Instructions DynHtml$# $Action $Add $Append $AppendSql $AppendSql2 $Assign $Case $CheckNumber $ClearError $Cookie $Debug $Default $Defvar $Div $Else (voir les instructions If...) $EndCase $Endif (voir les instructions If...) $EndLoop (voir LoopOnEnum, LoopOnFiles, LoopOnResults) $EndSwitch $ExecSql $Exit $ExitLoop $ExpandFile $ExpandSql $Forward $FetchProduct $If $IfEe $IfEqual $IfError $IfFilePresent $IfGe $IfGt $IfLe $IfLt $IfNoResult $IfPresent $Include $Invoke $LoopOnEnum $LoopOnFiles $LoopOnResults $Mul $NewObject $SetCookie $Sub $Switch $System Variables et paramètresVariables, paramètres, colonnes dans la base de donnée, etc... sont désignés par un nom de variable: pour afficher la valeur correspondant à un nom de variable, mettez un caractère "$" de chaque côté du nom de variable:$nom-de-variable$
Il est possible d'utiliser des formats d'affichage, par exemple pour
les valeurs numériques:
le format doit être mis entre parenthèses juste après
le caractère "$" qui délimite la variable (par exemple,
Formats numériques:
Tous formats supportés par la classe java java.text.DecimalFormat. $(.00)Prix$ $(##.##)Total$ Notez que les formats numériques n'ont pas pour but d'arrondir des nombres: leur effet lorsqu'il sont utilisés dans ce but n'est pas garanti, en particulier les formats (0) et (00) peuvent réserver des surprises si on les applique à des réels.
Si vous avez besoin d'arrondis, utilisez les formats (Round), (Ceil) ou
(Floor).
String.sub - Sous-chaine. Par exemple, $(String.sub5,8)chaine$
retourne les caractères entre les positions 5 (incluse) et 8 (exclue), et
$(String.sub5)chaine$ retourne tous les caractères après la position 5
(incluse). La première position est 0, pas 1.
Formats de dates : Autres formats:
Upper - Passage en majuscules (exemple:
Variables DynHtml prédéfinies$COOKIE$
Le numéro de session client ExperShop, sous forme de paramètre HTTP, à
inclure dans les URL ExperSHOP (dans les liens HTTP utilisant le tag HTML
<A HREF=...> tag). Voir aussi: instruction $Cookie, pour les URLs invoquées via des "FORM" HTML. $\$
Affiche un caractère "$".
Data sets et data objectsUn "data object" est equivalent à un n-uplet de base de données, avec des attributs équivalents aux colonnes du n-uplet.
Un "data set" est un ensemble de "data objects": par exemple, le résultat
d'une requête à une base de données, ou le panier
d'achats d'un client vu comme un ensemble d'articles. Il y a deux types de "data sets": les "data sets" prédéfinis d'ExperSHOP (comme le panier d'achats ou le fichier de configuration de la boutique), et les "data sets" transitoires générés à l'exécution (comme les résultats de requêtes à une base de données, ou les énumérations).
Par exemple, ExperShop fournit un "data set" prédéfini appelé
Le panier d'achats, "ShoppingCart", est aussi un "data set": vous pouvez
boucler sur les articles du panier, pour afficher leurs caractéristiques
(chaque article étant un "data object").
Les requêtes SQL sont elles aussi des "data sets", dès leur
exécution:
Un paramètre est une variable vue comme un paramètre HTTP: en
particulier, il sera transmis aux actions si $Action est utilisé.
(par contre, il ne sera pas transmis si la page courante est soumise en
tant que "form" HTML: c'est un paramètre de la page courante).
Pour ajouter du texte à la fin d'une variable ou d'un paramètre,
utilisez l'instruction
Une variable peut être calculée : $DefVar jour (24 * 60 * 60) EnumérationsUne énumération est une liste de valeurs separées par des virgules, ou une série continue d'entiers, ou les deux; par exemple, vous pouvez définir des énumérations comme ceci:$DefVar mois Jan,Fev,Mar,Avr,Mai,Jun,Jul,Sep,Oct,Nov,Dec $DefVar jourssemaine 1->7 Le premier exemple liste les mois, le second est équivalent à 1,2,3,4,5,6,7. La combinaison des deux syntaxes est valide: par exemple, $DefVar intervalles 1->5,10->20
Il est possible de boucler sur les valeurs d'une énumération, en
utilisant l'instruction $LoopOnEnum mois mm Le mois courant est: $mm:value$ $EndLoop $LoopOnEnum jourssemaine jj Le jour courant est: $jj:value$ $EndLoopEn fait, une énumération est un "data set", dont chaque valeur "data object" comporte une seule colonne, nommée "value" (c'est pourquoi mm:value est utilisé dans la boucle ci-dessus).
Il est possible de traîter les erreurs d'exécution en utilisant
l'instruction
Exemple (dans une page DynHtml, la plupart des "FORM" doiven commemcer ainsi):
<FORM METHOD=POST ACTION="com.expershop.lite.ExperSHOP"> $Cookie Stocker des informations liées à la session$Cookie permet d'accéder à toute information liée à la session client: par exemple, $Cookie:CustId$ est le numéro de client lorsqu'un client est loggé.Notez qu'ExperShop n'utilise pas de "vrais" cookies: dans ce document, "cookie" fait référence à des informations relatives à la session, et disponibles pendant toute sa durée. Il est possible de stocker des informations dans le "cookie":
Requêtes SQLIl est possible de définir des requêtes SQL, de les exécuter, et de boucler sur leurs résultats pour afficher le contenu des n-uplets.
Définir une requête SQL $DefineSql nomRequete instruction-sql Ajouter du texte à une requête SQL $AppendSql nomRequete texte $AppendSql2 nomRequete texte$AppendSql et $AppendSql2 permettent d'ajouter du texte à une requête SQL. $AppendSql2 évalue la requête tout de suite (toutes les variables connues sont remplacées par leur valeur), alors que $AppendSql laisse les variables telles quelles (la requête sera évaluée par $ExecSql, dont elle peut être paramétré). $AppendSql ou $AppendSql2 peuvent être utilisés avec une instruction "If... Else", pour compléter le texte d'une requête. Note: Si "texte" commence par "AND" ou "OR", la chaîne AND ou OR sera supprimée si "texte" est la première condition d'une clause WHERE. Par exemple, ajouter "AND Prix>10" à la requête "SELECT * FROM Articles WHERE" produira "SELECT * FROM Articles WHERE Prix>10". Ensuite, ajouter "AND Prix<100" produira "SELECT * FROM Articles WHERE Prix>10 AND Prix<100".
Exécuter une requête SQL $ExecSql nomRequete [nomBase]Si la requête contient des variables, celles-ci sont évaluées avant exécution de la requête. Le nom de la base est optionnel dans le cas de la base de données définie par défaut dans le fichier de configuration de l'application, sinon la base de données doit être définie sous forme d'une datasource dans le fichier de configuration de l'application.
Boucler sur les résultats d'une requête $LoopOnResults nomRequete nomTuple [i j] ... $EndLoopIl est possible de rajouter au nom du tuple les bornes de la requête, pour pouvoir boucler de l'élément i, jusqu'à l'élément j. Attention, cette option ne guarantit en rien l'ordre des éléments provenant de la base (contrainte SGBD). exemple : $LoopOnResults MyREQ myTuple 11 20 ... $EndLoop Afficher la valeur d'une colonne (dans une boucle)
Cas où il n'y a pas de résultat $IfNoResult nomRequete ... $Else ... $Endif Gestion d'erreur $IfError ... $Else ... $Endif
Extraire une requête SQL dans une variable $ExpandSql nomVariable nomRequete ActionsVous pouvez exécuter une Action ExperSHOP depuis une page DynHtml, en utilisant l'instruction$Action (pour en savoir plus sur
les Actions ExperSHOP, voir la
page web des actions DynHtml).
Syntaxe: Exemple: vider le panier d'achats. $Action com.expershop.actions.ESEmptyCart Tester la présence d'une variable$IfPresent nomVariable ... $Else ... $EndifExemples: $IfPresent Prenom $IfPresent client:Prenom (dans une boucle)
$IfFilePresent nomFichier ... $Else ... $EndifExemples: $IfFilePresent fichierLocal.txt
(dans le répertoire local)$IfFilePresent /tmp/fichier.txt (chemin absolu)$IfFilePresent f:NomFich (dans une boucle)
$LoopOnFiles repertoire fich Nom: $fich:name$, Extension: $fich:ext$, Date: $(DateFormat.dd/MM/yyyy)file:lastmodified$, FichierOuRepertoire: $file:isfile$ <br> ... $EndLoopLe nom du répertoire est soit relatif à ESRootDir, soit absolu (par exemple, s'il commence par / sous Unix). Le champ "isfile" vaut 1 s'il s'agit d'un fichier, 0 sinon (répertoire, lien...)
$DefVar x 2.3 $CheckNumber $x$ $IfError ERREUR: $x$ n'est pas un nombre<br> $Else Ok<br> $Endif $ClearError Opérateurs de calcul simplesIl est possible de faire des additions, soustractions, multiplications et divisions, en utilisant $Add, $Sub, $Mul and $Div.Les variables utilisées doivent avoir été préalablement déclarées; exemple: $DefVar a 1 $Add a 1 $DefVar b 2 $Div a $b$Dans cet exemple, a=1, puis on ajoute 1 (a=2), et on divise par la valeur de b (à la fin, a=1).
$IfEqual nomvariable valeur ... $Else ... $EndifExemples: $IfEqual Ville Paris $IfEqual Prenom "" $IfEqual Prenom $nom$ $IfEqual client:Prenom Jean (dans une boucle)
Comparaisons de valeurs numériques $IfEe variable 0 Zero! $Endif $IfLe variable 10 $variable$ <= 10 $Endif $IfLt variable $unNombre$ $variable$ < $unNombre$ $Endif $IfGe variable 10 $variable$ >= 10 $Endif $IfGt variable $unNombre$ $variable$ > $unNombre$ $Endif Comparer et évaluer des expressions$If permet d'utiliser des expressions à l'intérieur d'une syntaxe conditionnelle :$If ( expression opérateur expression) ... $Else ... $Endif"expression" peut être un calcul : ($var1$ + 14)*3 + $var2$ "opérateur" peut être un opérateur de comparaison, ou un opérateur logique. Les opérateurs de comparaison sont : < > <= >= = <> !=Les opérateurs logiques sont : && ("et" logique) || ("ou" logique) ! ("not" logique)Il est possible d'utiliser des parenthèses pour regrouper des expressions. Par exemple, la syntaxe suivante est valide : $If $courant$ >= $min$ && ! ($courant$ > $max$) La valeur courante semble correcte. $Else La valeur courante est en dehors des bornes. $Endif Exit$ExitQuitter la page immédiatement. $ExitLoopQuitter la boucle courante immédiatement.
$Switch var $Case val_1 ... ... $EndCase $Case val_2 ... ... $EndCase $Default ... ... $EndCase $EndSwitchSelon la valeur de l'expression le cas approprié est exécuté. Dans le cas où aucune expression ne convient, il est possible de rajouter un cas "attrape-tout" ("$Default").
$ExpandFile chemin $ExpandFile est différent de $Include: par exemple, une variable ou une requête définie dans le fichier expansé ne sera pas accessible au retour dans le fichier d'origine. chemin est relatif au répertoire où se trouve la page courante.
$Include chemin $Include est différent de $ExpandFile: par exemple, une variable ou une requête définie dans le fichier expansé sera accessible au retour dans le fichier d'origine. chemin est relatif au répertoire où se trouve la page courante.
$Forward URL URL peut être absolue ou relative. $Forward sera ignoré s'il n'a pas de sens dans le contexte considéré (ex. dans un $ExpandFile ou une action SendMail...) Seule la requête HTTP d'origine sera transféré (les paramétres qui auraient été ajoutés, par exemple avec $Assign, seront perdus). Exécuter une commande sur le système$System command $System exécute une commande du système d'exploitation: les résultats de la commandes sont affichés sur le flux HTML de sortie. Par exemple, pour lister les fichiers dans /tmp sur un système Unix: <pre> $System ls -l /tmp </pre> $Debug texteAffiche du texte sur la sortie standard, dans un but de debug. Exemples: $Debug Bonjour les gars! $Debug Nom = $Nom$
$# Ceci est un Commentaire Accédes à un produit par référence article$FetchProduct refProduit nomVariableAccès à un produit de la base articles (par défaut : table EProduct), par référence article (par défaut : colonne ProdId). Le résultat est un "data object" (stocké dans une variable dont le nom est spécifié par "nomVariable") avec au moins 3 attributs : ProdId (réf. article), Name (nom), Price (prix unitaire). Cette instruction sert à encapsuler les produits, pour éviter d'utiliser des requêtes SQL complexes dans les templates (ex. pour calculer le prix unitaire d'un article en fonction d'une catégorie de client ou d'une devise...) |