OptionSplit en Typoscript - explications et exemples en français

De Typo3 CMS / Documentation Typo3 / Support Typo3.

Comme il est dit dans le Tsref, optionSplit est une fonction « délicate » ;-)


Sommaire

Utilisation de |*| seul

Au départ le principe en est assez simple, les parties sont divisées en « first », « middle », « last ». Par exemple, imaginons un menu ou nous définirions des couleurs, comme ceci :

rouge |*| vert |*| bleu

C'est surtout le nombre de pages qui va déterminer le comportement de cette fonction :

Avec 6 pages, cela donnera ceci :

Page 1 : rouge
Page 2 : vert
Page 3 : vert
Page 4 : vert
Page 5 : vert
Page 6 : bleu

Si l'on a que deux pages, comme la priorité est ainsi définie : last, first, middle, on obtient ce résultat :

Page 1 : rouge
Page 2 : bleu

Et donc, avec une seule page :

Page 1 : bleu

Utilisation de || seul

Cette syntaxe est assez différente, elle fonctionne dans l'ordre donné (de gauche à droite) ; de plus on peut en utiliser autant qu'on veut, alors qu'avec la syntaxe |*| on sépare bien les items en 3 parties.

On prend les mêmes (presque) et on recommence : rouge || vert || bleu || orange || rose

Ici le résultat est différent, sur le cas des 6 pages ou plus on obtient ceci :

Page 1 : rouge
Page 2 : vert
Page 3 : bleu
Page 4 : orange
Page 5 : rose
Page 6 : rose
Page 7 : rose
Page 8 : rose

La dernière valeur est reprise, il n'y a pas d'effet de boucle comme avec |*|

Avec 2 items, on obtient ceci :

Page 1 : rouge
Page 2 : vert

et avec un seul item :

Page 1 : rouge


Utilisation avancée : les 4 règles d'OptionSplit

Jusque là, tout va bien, après ça se complique ; en effet en utilisant les 2 séparateurs ensemble ça devient assez rapidement un casse-tête.

La fonction optionSplit est pensée au départ pour être utilisée comme ceci :

- on divise d'abord les éléments en 3 parties : first, middle, last avec |*|

- dans chacune de ces 3 parties on définit des sous-parties avec ||


C'est ici qu'interviennent les notions de règles et de priorité.

Voici ce qui est dit dans TSRef  :


- La priorité est : last, first, middle

- Si la partie « middle » est vide, la dernière sous-partie de « first » est répétée

- Si les parties « first » et « middle » sont vides, la première sous-partie de « last » est répétée

- La partie « middle » boucle à l'intérieur d'elle-même


La priorité est : last, first, middle

Ceci concerne le séparateur |*|, comme dans l'exemple donné ci-avant (Utilisation de |*| seul).


Si la partie « middle » est vide, la dernière sous-partie de « first » est répétée

Un exemple avec :

rouge || vert || bleu |*||*| rose

donne ceci :

Page 1: rouge
Page 2: vert
Page 3: bleu
Page 4: bleu
Page 5: bleu
Page 6: bleu
Page 7: bleu
Page 8: bleu
Page 9: bleu
Page 10: rose

Attention : ici il ne faut pas mettre d'espace entre les séparateurs |*|.

Par exemple, si on utilise une propriété allWrap pour un menu item et qu'on met un espace entre les |*|, optionSplit considère que la saisie est équivalente à un séparateur vide, comme dans cet exemple :

1.NO.allWrap = <li class= c1>|</li> || <li class= c2>|</li> || <li class= c3>|</li> |*| |*| <li class= c4>|</li>

le code HTML généré sera celui-ci :

<li class= c1><a href="index.php?id=1">Page 1</a></li>
<li class= c2><a href="index.php?id=2">Page 2</a></li>
<li class= c3><a href="index.php?id=3">Page 3</a></li>
<a href="index.php?id=4">Page 4</a>
<a href="index.php?id=5">Page 5</a>
<a href="index.php?id=6">Page 6</a>
<a href="index.php?id=7">Page 7</a>
<a href="index.php?id=8">Page 8</a>
<a href="index.php?id=9">Page 9</a>
<li class= c4><a href="index.php?id=10">Page 10</a></li>

alors qu'avec ce code (l'espace en moins)

1.NO.allWrap = <li class= c1>|</li> || <li class= c2>|</li> || <li class= c3>|</li> |*||*| <li class= c4>|</li>

le code généré est le suivant :

<li class= c1><a href="index.php?id=1">Page 1</a></li>
<li class= c2><a href="index.php?id=2">Page 2</a></li>
<li class= c3><a href="index.php?id=3">Page 3</a></li>
<li class= c3><a href="index.php?id=4">Page 4</a></li>
<li class= c3><a href="index.php?id=5">Page 5</a></li>
<li class= c3><a href="index.php?id=6">Page 6</a></li>
<li class= c3><a href="index.php?id=7">Page 7</a></li>
<li class= c3><a href="index.php?id=8">Page 8</a></li>
<li class= c3><a href="index.php?id=9">Page 9</a></li>
<li class= c4><a href="index.php?id=10">Page 10</a></li>


Si les parties « first » et « middle » sont vides, la première sous-partie de « last » est répétée

Dans le TSRef il est dit : « If the first- or middle value is empty, the first part of the last-value is repeated before the last value » ; cela dit l'exemple proposé l'est bien avec les 2 parties vides.

Cet exemple simple :

|*||*| orange|| bleu

donne ceci :

Page 1: orange
Page 2: orange
Page 3: orange
Page 4: orange
Page 5: orange
Page 6:  bleu

Avec 2 pages, le résultat est normal (priorité = last) :

Page 1: orange
Page 2:  bleu

Cette méthode est très pratique, notamment pour les menus de type Ariane, le dernier lien du menu utilisé étant la plupart du temps la page courante est différencié des autres.

Attention : ici, comme dans la règle précédente il ne faut pas mettre d'espace entre les séparateurs |*|


La partie « middle » boucle à l'intérieur d'elle-même

C'est la plus simple :

en utilisant || à l'intérieur de la partie « middle », comme ceci :

rouge |*| vert || bleu || orange |*| rose

on obtient ce résultat (exemple avec 10 pages) :

Page 1 : rouge
Page 2 : vert
Page 3 : bleu
Page 4 : orange
Page 5 : vert
Page 6 : bleu
Page 7 : orange
Page 8 : vert
Page 9 : bleu
Page 10 : rose



Cas d'utilisation simple

Menu « ariane »

Dans ce type de menu, on ajoute un séparateur entre les liens, on veut juste que le dernier ne l'affiche pas pour obtenir ce résultat :

Accueil > Produits > Frigos

et non celui-ci :

Accueil > Produits > Frigos >


Ce premier exemple est très simple, pour ce menu on utilise la fonction optionSplit sur la propriété « wrap » de l'item de menu, comme ceci :

lib.menuAriane.1.NO.allWrap= |&nbsp;&gt;&nbsp; |*| |&nbsp;&gt;&nbsp; |*| |

Résultat : le premier lien affiche le séparateur, tous les liens suivants affichent le même séparateur que le premier lien, seul le dernier ne l'affiche pas.

On peut encore simplifier celui-ci, comme ceci :

lib.menuAriane.1.NO.allWrap = |*||*| |&nbsp;&gt;&nbsp; || |

Ceci utilise la règle :

« Si les parties « first » et « middle » sont vides, la première sous-partie de « last » est répétée »

Outils personnels