PDF (adobe.com)

Répétitions des blocs de code avec la directive de boucle

Pour répéter un bloc de code, ou une partie de celui-ci, un certain nombre de fois, utilisez la syntaxe suivante :

<@ loop (@@param1@@,@@param2@@) @>    code
block<@ endloop @>
Lors de la création de comportements de serveur, vous pouvez utiliser des structures de boucle pour répéter un bloc de code un nombre défini de fois.
<@ loop (@@param1@@,@@param2@@,@@param3@@,@@param_n@@) @>    code block 
<@ endloop @>
La directive de boucle accepte des arguments se présentant sous la forme d'une liste de tableaux de paramètre séparés par des virgules. Dans ce cas, les arguments des tableaux de paramètre permettent aux utilisateurs de fournir plusieurs valeurs pour un même paramètre. Le texte répétitif sera dupliqué n fois, n correspondant à la longueur des arguments des tableaux de paramètre. Si plusieurs arguments de tableaux de paramètre sont indiqués, tous les tableaux doivent être de la même longueur. Lors de la nième évaluation de la boucle, les nièmes éléments des tableaux de paramètre remplacent les occurrences du paramètre correspondant dans le bloc de code.

Lorsque vous créez une boîte de dialogue pour le comportement de serveur, vous pouvez ajouter une commande à la boîte de dialogue qui permet au concepteur de la page de créer des tableaux de paramètre. Dreamweaver inclut une commande de tableau simple que vous pouvez utiliser pour créer des boîtes de dialogue. Cette commande, qui s'appelle Liste de champs de texte séparés par des virgules, est accessible à partir du Créateur de comportements de serveur. Pour créer des éléments d'interface utilisateur plus complexes et apprendre à concevoir une boîte de dialogue contenant une commande de création de tableaux (commande de grille, par exemple), consultez la documentation API.

Vous pouvez imbriquer autant de directives conditionnelles ou de boucle que vous le souhaitez au sein d'une même directive conditionnelle. Ainsi pouvez-vous préciser, par exemple, que si une expression est vraie, la boucle doit être exécutée.

L'exemple suivant montre comment utiliser des blocs de code répétitifs pour créer des comportements de serveur (cet exemple correspond à un comportement ColdFusion permettant d'accéder à une procédure stockée) :

<CFSTOREDPROC procedure="AddNewBook" 
    datasource=#MM_connection_DSN# 
    username=#MM_connection_USERNAME# 
    password=#MM_connection_PASSWORD#> 
<CFPROCPARAM type="IN" dbvarname="@CategoryId" value="#Form.CategoryID#" 
    cfsqltype="CF_SQL_INTEGER"> 
<CFPROCPARAM type="IN" dbvarname="@ISBN" value="#Form.ISBN#" 
    cfsqltype="CF_SQL_VARCHAR"> 
</CFSTOREDPROC>

Dans cet exemple, la balise CFSTOREDPROC peut comprendre zéro ou davantage de balises CFPROCPARAM. Toutefois, sans prise en charge de la directive de boucle, il est impossible d'inclure les balises CFPROCPARAM au sein de la balise CFSTOREDPROC insérée. Si vous vous inspiriez de cet exemple pour créer un comportement de serveur sans la directive de boucle, il vous faudrait le diviser en deux participants : une balise CFSTOREDPROC principale et une balise CFPROCPARAM dont le type de participant serait multiple.

Avec la directive de boucle, il est possible de rédiger cette même procédure comme suit :

<CFSTOREDPROC procedure="@@procedure@@" 
datasource=#MM_@@conn@@_DSN# 
username=#MM_@@conn@@_USERNAME# 
password=#MM_@@conn@@_PASSWORD#> 
<@ loop (@@paramName@@,@@value@@,@@type@@) @> 
    <CFPROCPARAM type="IN" 
    dbvarname="@@paramName@@" 
    value="@@value@@" 
    cfsqltype="@@type@@"> 
<@ endloop @> 
</CFSTOREDPROC>
Remarque : Les nouvelles lignes situées après chaque élément « @> » sont ignorées.

Supposons que l'utilisateur ait tapé les valeurs de paramètre suivantes dans la boîte de dialogue Créateur de comportements de serveur :

procedure = "proc1" 
conn = "connection1" 
paramName = ["@CategoryId", "@Year", "@ISBN"] 
value = ["#Form.CategoryId#", "#Form.Year#", "#Form.ISBN#"] 
type = ["CF_SQL_INTEGER", "CF_SQL_INTEGER", "CF_SQL_VARCHAR"]

Le comportement de serveur insérerait alors le code d'exécution suivant dans la page :

<CFSTOREDPROC procedure="proc1" 
datasource=#MM_connection1_DSN# 
username=#MM_connection1_USERNAME# 
password=#MM_connection1_PASSWORD#> 
<CFPROCPARAM type="IN" dbvarname="@CategoryId" value="#Form.CategoryId#" 
    cfsqltype="CF_SQL_INTEGER"> 
<CFPROCPARAM type="IN" dbvarname="@Year" value="#Form.Year#" 
    cfsqltype="CF_SQL_INTEGER"> 
<CFPROCPARAM type="IN" dbvarname="@ISBN" value="#Form.ISBN#" 
    cfsqltype="CF_SQL_VARCHAR"> 
</CFSTOREDPROC>
Remarque : Il est impossible d'utiliser les tableaux de paramètre en dehors d'une boucle, sauf en tant que composants d'une expression de directive conditionnelle.

Utilisation des variables _length et _index de la directive de boucle

La directive de boucle comprend deux variables intégrées utilisables dans les conditions if incorporées. Ces variables sont les suivantes : _length et _index. La variable _length se rapporte à la longueur des tableaux traités par la directive de boucle, alors que la variable _index se rapporte à l'index actuel de la directive loop elle-même. Pour que ces variables ne soient reconnues qu'en tant que directives et non en tant que paramètres à faire passer par la boucle, ne les insérez pas entre des symboles @@.

Un exemple d'utilisation des variables intégrées consiste à les appliquer à l'attribut import de la directive de page. L'attribut import requiert que les paquets soient séparés par des virgules. Si la directive loop englobe l'intégralité de l'attribut import, le nom d'attribut import= ne doit sortir qu'à la première itération de la boucle (les guillemets fermants (") sont alors inclus) et aucune virgule n'apparaît à la dernière itération de la boucle. Pour ce faire, vous pouvez utiliser la variable intégrée comme suit :

<@loop (@@Import@@)@> 
<@ if(_index == 0)@>import=" 
<@endif@>@@Import@@<@if (_index == _length-1)@>"<@else@>, 
<@ endif @> 
<@endloop@>