Categories > TinyButStrong general (FR) >

Faire l'équivalent de IF... THEN... ELSE...

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: Macbee
Date: 2006-06-22
Time: 18:22

Faire l'équivalent de IF... THEN... ELSE...

Bonjour,

Félicitation pour cet outil que je découvre et qui semble puissant.
Je réalise une gallerie photos et j'aimerais afficher une ligne de liens :
précédent | page 1 |...| page x |...| page...| suivant

Je souhaite mettre des liens hypertextes en fonction de la page actuelle :
Si je suis sur le première page les mots précédent et page 1 n'ont pas de lien mais sur une autre page le lien hypertexte apparaît.
Cela donnerait un code comme :
if pageactuelle=1 then 'pageactuelle' else '<a href="...">pageactuelle</a>'
ou encore :
if pageactuelle=1 then 'page [page]' else '<a href="...">page [page]'</a>'

Voila ce que j'ai réussit à faire :
        <span>
            [onshow;block=span;when [pageactuelle]!=1]
            <a href="[page.link]">[page.label;htmlconv=no]</a> |
            </span
            <span>
            [onshow;block=span;[pageactuelle]=1]
            [page.label;htmlconv=no] |
        </span>
Mais je trouve la méthode un peu lourde : place des balise pour définir un block surcharge le code.

Auriez-vous une solution plus simple ?

Merci de votre aide
By: Skrol29
Date: 2006-06-23
Time: 11:13

Re: Faire l'équivalent de IF... THEN... ELSE...

Salut,

Pour optimiser la fusion, il faudrait que la condition "pageactuelle" soit traitée avant la fusion du block "page". Ainsi elle ne sera évaluée qu'une seule fois alors qui si elle est traitée après "page", elle est évaluée une fois pour chaque enregistrement.

Pour simplifier ton modèle, tu peux utiliser la paramètre "magnet".
Exemple :
<a href="[page.link]" [onload;if [var.pageactuelle]!=1;then ' ';magnet=a;mtype=m+m]>
  [page.label;htmlconv=no]
</a>

Explications :
* J'ai mis [onload] au lieu de [onshow]. [onload] est évalué au chargement du modèle donc avant ta fusion du bloc "page". Mais cela nécaissite que $pageactuelle soit déjà calculé.
* Si $pageactuelle=1, alors [onload] gadre sa valeur qui est chaîne vide par défaut, donc magnet agit et la balise <a> est supprimée tout en gardant le texte.
Si $pageactuelle!=1 alors [onload] est remplacé par un espace et magnet n'agit pas.
By: Macbee
Date: 2006-06-28
Time: 10:16

Re: Faire l'équivalent de IF... THEN... ELSE...

Merci pour ta réponse Skroll.

Le code que tu m'a donné donne un bon résultat sauf si qd $pageactuelle = 1.
Qu'est-ce que tu entends par : Mais cela nécessite que $pageactuelle soit déjà calculé. Car visiblement cette variable n'est pas calculée. Donc comment procède-t-on pour forcer cette évaluation ?
By: Skrol29
Date: 2006-06-28
Time: 12:13

Re: Faire l'équivalent de IF... THEN... ELSE...

Ton champ [var.pageactuelle] est imbriqué dans un champ [onload], donc [var.pageactuelle] sera évalué lors de l'appel à la méthode LoadTemplate(). Tu dois donc t'assurer que la variable $pageactuelle existe et qu'elle ait sa valeur adéquate avant que tu appelles LoadTemplate().
By: Macbee
Date: 2006-06-28
Time: 22:30

Re: Faire l'équivalent de IF... THEN... ELSE...

Bonjour,

Merci pour ces précisions. Le code fonctionne très bien.
Je voudrais pousser le raisonnement un peu plus loin.

Voici le code préconnisé :
<a href="[page.link]" [onload;if [var.pageactuelle]!=1;then ' ';magnet=a;mtype=m+m]>
  [page.label;htmlconv=no]
</a>

Imaginons que l'on rajoute une variable de paramétrage suplémentaire modifiable par l'utilisateur : $affichelien.
Quand $affichelien = 1 le lien hypertexte correspondant au code ci-dessus s'affiche.
Nous avons donc une double condition à remplir : $affichelien = 1 et $pageactuelle !=1 pour afficher le lien hypertexte.
Comment le code prend-t-il forme ?
Dois-je répéter la séquence conditionnelle :
<a href="..." [onload;if [var.pageactuelle]!=1;then ' ';magnet=a;mtype=m+m][onload;if [var.affichelien]=1;then ' ';magnet=a;mtype=m+m]>...</a>
ou faire une double condition dans la même séquence :
<a href="..." [onload;if ([var.pageactuelle]!=1 && [var.affichelien]=1);then ' ';magnet=a;mtype=m+m]...</a>
?
Merci de m'éclairer dans cette problèmatique.
By: Skrol29
Date: 2006-06-28
Time: 23:45

Re: Faire l'équivalent de IF... THEN... ELSE...

Salut,

Y'a une réponse à cette question dans la FAQ.
En résumé : les OR ne sont pas possibles, il est conseillé d'utiliser une variable PHP intermédiaire. Les AND sont possibles par concaténation de chaîne. Mais là tu as un "AND NOT". Le mieux est de passer par une variable PHP intermédaire.
By: Macbee
Date: 2006-06-29
Time: 15:26

Re: Faire l'équivalent de IF... THEN... ELSE...

Hum, on arrive sur les limites de ce merveilleux moteur de template que je découvre et apprécie de jour en jour.

Dans les faits, j'ai une série de paramètres modifiables par l'utilisateur :
- Combien de photos miniatures veux-t-il afficher ?
- Quel effet l'agrandissement dois-t-il prendre en compte (slide, light, popup, externe) ?
- Veux-t-il une image intermédiaire sous une rangée de vignette ?
- etc.

J'ai donc une série de conditions à remplir et donc une série d'imbrication de IF... THEN... ELSE...
J'avais même une question en réserve : comment faire l'équivalent de SWITCH... CASE... CASE... DEFAULT...

Mais le but d'un moteur de template n'est justement pas de récréer un langage avec des clauses conditionnelles. A nous de nous adapter aux possibilités du moteur.
Ce que j'apprécie dans TinyButStrong, c'est qu'il n'insère pas de code PHP dans le code source comme le font les autres moteurs de template mais modifie le code xHTML pour générer un autre code xHTML.

Encore merci pour les réponses.
By: Skrol29
Date: 2006-06-29
Time: 15:41

Re: Faire l'équivalent de IF... THEN... ELSE...

Salut,

Oui effectivement c'est volontairement que le moteur de template ne gère pas d'expressions compliquées. Si une formule est un tant soit peu compliquée, elle ne devrait pas faire partie du modèle, mais elle devrait plutôt être évaluée côté Logique Métier, c'est à dire côté PHP.