Condition {if} dans un template smarty

Condition {if} dans un template smarty - PHP - Programmation

Marsh Posté le 16-06-2010 à 10:14:48    

Bonjour à vous,
 
J'ai en effet un problème avec une condition {if} dans mon template.
En effet j'essaie de colorier les lignes de mon tableau quand celle-ci commence par un chiffre [0_9]
 

Code :
  1. {section name=id loop=$ppo->test}
  2.  <tr {if $ppo->test[id] eq '[0-9].*'} class='ligne1' {else}
  3.    class='ligne2'
  4.   {/if}>
  5.  <td> {$ppo->test[id]}</td> </tr>
  6.  {/section}


Avec ce script rien ne se colorie alors qu'avec celui-ci:
 

Code :
  1. {section name=id loop=$ppo->test}
  2.  <tr {if $smarty.section.id.index eq '[0-9].*'} class='ligne1' {else}
  3.    class='ligne2'
  4.   {/if}>
  5.  <td> {$ppo->test[id]}</td> </tr>
  6.  {/section}


Seulement ma première ligne se colorie.
Je n'ai pas trouvé de fonction sous smarty permettant de contrôler la première valeur d'une chaîne de caractère.
 
Quelqu'un aurait-il la solution pour contrôler le premier caractère d'une chaîne?
Merci d'avance.

Message cité 1 fois
Message édité par Azax le 16-06-2010 à 11:35:32
Reply

Marsh Posté le 16-06-2010 à 10:14:48   

Reply

Marsh Posté le 16-06-2010 à 19:07:10    

oui, tu fais ta boucle dans le code php, et tu mets un attribut explicite à tester dans ton template :o
 
Le principe du template est de rester simple, fait un maximum de contrôles et de test dans le code php

Reply

Marsh Posté le 16-06-2010 à 19:49:07    

Azax a écrit :

Bonjour à vous,
 
J'ai en effet un problème avec une condition {if} dans mon template.
En effet j'essaie de colorier les lignes de mon tableau quand celle-ci commence par un chiffre [0_9]
 

Code :
  1. {section name=id loop=$ppo->test}
  2.  <tr {if $ppo->test[id] eq '[0-9].*'} class='ligne1' {else}
  3.    class='ligne2'
  4.   {/if}>
  5.  <td> {$ppo->test[id]}</td> </tr>
  6.  {/section}


Avec ce script rien ne se colorie alors qu'avec celui-ci:
 

Code :
  1. {section name=id loop=$ppo->test}
  2.  <tr {if $smarty.section.id.index eq '[0-9].*'} class='ligne1' {else}
  3.    class='ligne2'
  4.   {/if}>
  5.  <td> {$ppo->test[id]}</td> </tr>
  6.  {/section}


Seulement ma première ligne se colorie.
Je n'ai pas trouvé de fonction sous smarty permettant de contrôler la première valeur d'une chaîne de caractère.
 
Quelqu'un aurait-il la solution pour contrôler le premier caractère d'une chaîne?
Merci d'avance.


 
http://www.smarty.net/manual/en/la [...] uncate.php :??:


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-06-2010 à 10:51:34    

Skeye je n'ai pas compris pourquoi tu m'a redirigé vers la fonction de troncation.
 
Par contre PunkRod pourrait tu être plus claire s'il te plaît ( avec un exemple :p). Je suis vraiment débutant en matière de framework et donc en utilisation de template.
 
Que dois-je écrire exactement dans le php? le contrôle de la chaîne de caractère ?
Comment je fais appel a ce contrôle une fois dans le template?  
 
Désolé si mes questions vous paraissent dérisoire.

Message cité 1 fois
Message édité par Azax le 17-06-2010 à 11:28:33
Reply

Marsh Posté le 17-06-2010 à 11:35:11    

Azax a écrit :

Skeye je n'ai pas compris pourquoi tu m'a redirigé vers la fonction de troncation.

 

Par contre PunkRod pourrait tu être plus claire s'il te plaît ( avec un exemple :p). Je suis vraiment débutant en matière de framework et donc en utilisation de template.

 

Que dois-je écrire exactement dans le php? le contrôle de la chaîne de caractère ?
Comment je fais appel a ce contrôle une fois dans le template?

 

Désolé si mes questions vous paraissant dérisoire.

 

ça fait longtemps que j'ai pas touché à smarty, mais ça ne gère pas les expressions régulières dans un simple test d'égalité, non?
Je proposais donc la troncature pour tester la valeur du 1er caractère de ta variable, tout simplement.
Mais après un coup d'oeil à la doc, je vois qu'on peu carrément faire appel à des fonctions php dans un if, donc tu dois pouvoir tout simplement faire un truc de ce genre (pas testé):

 
Code :
  1. {if (int) $ppo->test == ""}
 


Message édité par skeye le 17-06-2010 à 11:35:25

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-06-2010 à 13:59:30    

attention tout de même, même si cette solution reste propre  

Code :
  1. 1. {if (int) $ppo->test == ""}


dans le cas où  

Code :
  1. $ppo->test = t487


$ppo->test sera égale à 0
dans le cas où  

Code :
  1. $ppo->test = 7ty87


$ppo->test sera égale à 7


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 17-06-2010 à 14:04:47    

Ba je veux juste que si $ppo->test trouve un chiffre qu'il applique la classe qui lui est renseigné.
 
Or avec ca  
 

Code :
  1. <tr {if (int) $ppo->test == ""} class='ligne1' {else}
  2.    class='ligne2'
  3.   {/if}>


Rien ne se passe, il n'applique ni la class 'ligne1' ni la class 'ligne2'.
 
Donc je me demande même si il rentre dans mon if ?

Reply

Marsh Posté le 17-06-2010 à 14:08:02    

Réctification avec cette syntaxe il passe dans le else

Reply

Marsh Posté le 17-06-2010 à 14:31:38    

mais il va passer toujours dans le else non ?
et faire plutôt  

Code :
  1. <tr {if ((int) $ppo->test == "" ) >= 0} class='ligne1' {else}
  2.      class='ligne2'
  3. {/if}>


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 17-06-2010 à 14:40:56    

Avec ca, il ne passe pas dans le esle. Par contre il me colorie toutes mes lignes avec la class 'ligne1'.
 
Soit il me colorie toutes mes lignes avec la class ligne1 soit avec ligne 2 mais il n'arrive pas a différencier les lignes de mon tableau.


Message édité par Azax le 17-06-2010 à 14:44:14
Reply

Marsh Posté le 17-06-2010 à 14:40:56   

Reply

Marsh Posté le 17-06-2010 à 14:46:06    

Ok, la conversion en int te donne toujours 0 pour les autres lignes, je suis con.[:joce] Si tu mets un > au lieu du >= tu devrais avoir toutes les lignes qui commencent par [1-9]

 

Bon, et ça ,

Code :
  1. {if ord($ppo->test) >= ord('0') && ord($ppo->test) <= ord('9') }


Message édité par skeye le 17-06-2010 à 14:46:24

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-06-2010 à 14:51:50    

Avec cela j'ai le droit à un message d'erreur
Warning: ord() expects parameter 1 to be string, array given in /opt/lampp/htdocs/m-phd/temp/cache/php/templates/%%97^97D^97DA3A0C%%listemodule.tpl.php  on line 44
class='ligne2' >  
 
Le truck c'est que c'est seulement le 1er caractère de ma chaîne que je dois contrôler.
Mes chaînes de caractère correspondent a cela :
 
1 - COMMUNICATION ET MANAGEMENT                
SAVOIR COMMUNIQUER EN SITUATION PROFESSIONNELLE      
SAVOIR CONDUIRE DES REUNIONS DE TRAVAIL      
PILOTAGE D'EQUIPE      
GERER LES CONFLITS
 
et donc je veux que celle avec un chiffre devant soit coloré d'une certaine manière
 

Reply

Marsh Posté le 17-06-2010 à 14:56:26    

Bizarre, ord() est censé prendre le premier caractère de la chaine passée, justement...
Remplace ord($ppo->test) par ord(substr($ppo->test, 0, 1))...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-06-2010 à 15:49:37    

Escuse du temps de latence j'étais en réunion avec mon maître de stage.
 
Même message d'erreur avec ton autre technique.
L'erreur pourrait-elle venir du tableau de valeur que je récupère?

Reply

Marsh Posté le 17-06-2010 à 16:05:59    

Oui! J'avais oublié de relire ton code au début, il est évident qu'il faut remplacer $ppo->test par $ppo->test[id] dans tous les exemples plus haut...:o


Message édité par skeye le 17-06-2010 à 16:06:26

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-06-2010 à 16:25:50    

Cela fonctionne !
 
Merci énormément skeye !
 
Si je rencontre d'autre problème de ce genre je re-posterais sur ce topic donc ne t'éloigne pas trop :p )
 
Merci encore.

Reply

Marsh Posté le 21-06-2010 à 15:14:19    

je re -up le sujet en espérant que skeye soit toujours dans le coin :p
 
Toujours un problème de smarty )
 

Code :
  1. {foreach from=$ppo->mod key=them item=uv}
  2.  <tr>
  3.   <td class='ligne1' >{$them}</td>
  4.   {foreach name=id from=$uv item=foo}
  5.    <tr>
  6.     <td class='ligne2'>{$foo}</td>
  7.     <td align=center><img src="{copixresource path='img/oeil.png'}" style="cursor:pointer;" onClick="affiche('info');AjaxFicheMod({$ppo->donnees[id][0]}, {$smarty.get.id}, '{$smarty.get.check}');" /></td>
  8.     <td><input type="radio" name="option{$myCounter}" value="annee 1"></td>
  9.     <td><input type="radio" name="option{$myCounter}" value="annee 2"></td>
  10.     <td><input type="radio" name="option{$myCounter}" value="annee 3"></td>
  11.    </tr>
  12.    {assign var=myCounter value=$myCounter+1}
  13.   {/foreach}
  14.  </tr>
  15.  {/foreach}


 
Le problème est que mon lien javascript ne se lance pas parce que le [id] en rouge ne récupère rien. Si je rentre en dure un chiffre cela fonctionne mais ca ne me sert a rien.
 
Je pensais avoir trouvé une solution en remplaçant mon second foreach par un section comme ceci  
 
 

Code :
  1. {section name=id loop=$uv}
  2.    <tr>
  3.     <td class='ligne2'>{$uv[id]}</td>
  4.     <td align=center><img src="{copixresource path='img/oeil.png'}" style="cursor:pointer;" onClick="affiche('info');AjaxFicheMod({$ppo->donnees[id][0]}, {$smarty.get.id}, '{$smarty.get.check}');" /></td>
  5.     <td><input type="radio" name="option{$myCounter}" value="annee 1"></td>
  6.     <td><input type="radio" name="option{$myCounter}" value="annee 2"></td>
  7.     <td><input type="radio" name="option{$myCounter}" value="annee 3"></td>
  8.    </tr>
  9.    {assign var=myCounter value=$myCounter+1}
  10.   {/foreach}


Comme ceci mon lien java script fonctionne, le problème étant que pour chaque thématique, le lien javascript re-commence a partir de la première uv. Exemple pour comprendre
Them 1
uv 1 // javascript de l'uv 1
uv2 // javascript de l'uv2
uv3 // javascript de l'uv3
Them 2
uv4 // javascript de l'uv 1
uv5 // javascript de l'uv 2
them 3  
uv6 //javascript de l'uv 1
etc..
 
Si quelqu'un peut m'expliquer pourquoi ?  
Merci.

Reply

Marsh Posté le 21-06-2010 à 16:23:05    

Problème résolu grâce a mes super collègues informaticiens.
 
il fallait rajouter un key dans mon 2eme foreach "key=id"
ainsi que remplacer mon $ppo->donnee[id] par $id
 
et le tour est joué !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed