Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1710 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Condition {if} dans un template smarty

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Condition {if} dans un template smarty

n°2002055
Azax
Posté le 16-06-2010 à 10:14:48  profilanswer
 

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
mood
Publicité
Posté le 16-06-2010 à 10:14:48  profilanswer
 

n°2002329
PunkRod
Digital Mohawk
Posté le 16-06-2010 à 19:07:10  profilanswer
 

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

n°2002337
skeye
Posté le 16-06-2010 à 19:49:07  profilanswer
 

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 -
n°2002440
Azax
Posté le 17-06-2010 à 10:51:34  profilanswer
 

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
n°2002454
skeye
Posté le 17-06-2010 à 11:35:11  profilanswer
 

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 -
n°2002488
stef_dober​mann
Personne n'est parfait ...
Posté le 17-06-2010 à 13:59:30  profilanswer
 

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...
n°2002491
Azax
Posté le 17-06-2010 à 14:04:47  profilanswer
 

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 ?

n°2002492
Azax
Posté le 17-06-2010 à 14:08:02  profilanswer
 

Réctification avec cette syntaxe il passe dans le else

n°2002502
stef_dober​mann
Personne n'est parfait ...
Posté le 17-06-2010 à 14:31:38  profilanswer
 

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...
n°2002506
Azax
Posté le 17-06-2010 à 14:40:56  profilanswer
 

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
mood
Publicité
Posté le 17-06-2010 à 14:40:56  profilanswer
 

n°2002507
skeye
Posté le 17-06-2010 à 14:46:06  profilanswer
 

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 -
n°2002508
Azax
Posté le 17-06-2010 à 14:51:50  profilanswer
 

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
 

n°2002509
skeye
Posté le 17-06-2010 à 14:56:26  profilanswer
 

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 -
n°2002536
Azax
Posté le 17-06-2010 à 15:49:37  profilanswer
 

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?

n°2002543
skeye
Posté le 17-06-2010 à 16:05:59  profilanswer
 

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 -
n°2002546
Azax
Posté le 17-06-2010 à 16:25:50  profilanswer
 

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.

n°2003362
Azax
Posté le 21-06-2010 à 15:14:19  profilanswer
 

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.

n°2003391
Azax
Posté le 21-06-2010 à 16:23:05  profilanswer
 

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é !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Condition {if} dans un template smarty

 

Sujets relatifs
[Batch] Une condition qui n'est pas vérifiéeCondition, si la requete sql n'affiche rien
[Résolu] Pb de résolution de type dans un templateCondition "IF" qui ne fonctionne pas
[C++] Prototype méthode membre de classe templateCondition de navigateur
VB : condition selon l'url d'un WebBrowserCopier/coller des cellules sous condition
Condition If...End if à l'intérieur d'une boucle For...Nexttemplate - types spécifiques
Plus de sujets relatifs à : Condition {if} dans un template smarty


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR