Google Chercher dans diml.org
[ english ]

Table des matières
Syntaxes
Erreurs courantes d'utilisation d'une forme conditionnelle
Confondre traitement client et serveur  Dernières infos
 Une application du composant  WCT_NEWS  
>> Haut de la page

Formes conditionnelles

Bien que le DIML se veuille avant tout langage d'interface, c'est à dire de "mapping" entre un ensemble logiciel (base de données plus scripts) et un ensemble présentationnel (HTML et scripts client), un minimum de structures conditionnelles permet de simplifier l'implementation dans de nombreuses situations.

Les structures conditionnelles apportent surtout aux templates DIML une capacité de polymorphisme en fonction de paramètres extérieurs au template.

Syntaxes

Le DIML dispose de deux formes principales d'écriture d'une alternative :

  • La forme compacte :

    <%if (condition) alternative [ %else alternative ] %endif %>

    La condition peut être toute expression utilisant la syntaxe Perl dans laquelle des variables DIML et Perl ($var, @table, %hash) peuvent être mélangées. Tous les opérateurs et imbrications de parenthèses sont permis sauf l'opérateur modulo qui provoquerait une collision avec le marqueur d'instruction DIML %. L'opérateur modulo est translaté sur le caractère non signifiant @.

    L'alternative peut être soit :

    • Une variable DIML existante :
      <%if (condition) %FORM::lang% %endif %>
    • Une chaîne littérale dans laquelle des appels DIML peuvent exister sous forme échappée :
      <%if (condition) "&lt;%%FORM::lang%%&gt;" %endif %>

    Elle est surtout utilisée pour commuter des "paramètres", par exemple pour :

    • gérer des versions de ressources de façon explicite,
    • commuter une charte graphique, ou des valeurs d'attributs dans des balises HTML,
    • paramétrer des constantes pour des scripts Javascript.

  • La forme multiligne :
    <%if (condition1) %>
    alternative_diml [ 
    <%elsif (condition2) %>
    alternative_diml ][ 
    <%else %>
    alternative_diml ] 
    <%endif %>

    Elle est particulièrement adaptée à la commutation de grandes séquences de code comme pour :

    • occulter la diffusion de code javascript lorsque l'authentification d'un intranet échoue,
    • commuter un écran d'erreur dans ce même cas,
    • ajouter un formulaire de saisie en fonction d'un certain contexte,
    • adapter le code de la page Web à l'environnement du client, d'après les informations fournies au serveur.

Erreurs courantes d'utilisation d'une forme conditionnelle

Confondre traitement client et serveur

Une des erreurs souvent commise par les programmeurs utilisant le DIML est de confondre les traitements entre code client et code serveur, entre le Javascript et le DIML.

Bien que ces deux codes cohabitent parfois sur une même page, voire interférent, ils ne sont pas du tout traités au même moment.
Prenons un exemple. Dans la séquence qui suit, le DIML paramètre une séquence de Javascript. Ceci est tout à fait possible si le Javascript (code client) est écrit dans une page DIML (comme il serait écrit dans une page HTML).
Dans l'exemple qui suit, le DIML paramètre une séquence de Javascript. Ceci qui est licite si le Javascript (code client) est écrit dans la page DIML et non pas dans un fichier séparé.

Voir l'exemple

S'il n'est pas forcément des plus fonctionnels, il illustre bien la dissociation nécessaire.

Le code ci-dessus déclare trois DIV (assimilable à des blocs "flottants" ou "composables") cachés. La séquence de Javascript commande l'affichage d'un de ces blocs en fonction d'un paramètre %FORM::delta%. Le test compare la valeur de retour du formulaire (un appel DIML, exécuté côté serveur) à la constante de consigne '0'. Le code envoyé au navigateur peut paraître un peu ésotérique à celui qui visualiserait le source de la page. Par exemple, si delta vaut '-1' :

<SCRIPT LANGUAGE="Javascript" >
function choice()
   {
   if (-1 < 0)
      {
      document.getElementById('box1').style.visibility = 'visible';
      document.getElementById('box1').style.display = 'block' ;
      }
   if (-1 == 0)
      {
      document.getElementById('box2').style.visibility = 'visible';
      document.getElementById('box2').style.display = 'block';
      }
   if (-1 > 0)
      {
      document.getElementById('box3').style.visibility = 'visible';
      document.getElementById('box3').style.display = 'block';
      }
   }
choice();
</SCRIPT>

Le lecteur peu avisé pourrait s'interroger sur l'intéret du test 1 == 0 toujours faux. Il aurait raison, d'autant plus que l'exemple n'est pas des plus fonctionnels. Mais l'important est de considérer l'ensemble du processus et son résultat, qui est la sélection de la bonne séquence de code. Le DIML confronte la valeur CGI du paramètre delta à tous les cas prévus par le Javascript. Le paramètre DIML subit l'alternative Javascript.

Si aucune valeur de delta n'est donnée, la séquence devient :

<SCRIPT LANGUAGE="Javascript" >
function choice()
   {
   }
...
choice();
</SCRIPT>

qui paraît encore moins fonctionnel au lecteur et/ou augmente sa perplexité, mais évite une erreur de syntaxe Javascript dans chacun des tests.

précédent sommaire suivant


All material is copyleft V.G. FREMAUX (EISTI France) 1999 to 2003 except explicitly mentioned