[PhP=>SMARTY] Qui l'utilise et pourquoi ? ccm

Résolu/Fermé
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
- 6 févr. 2006 à 12:03
 bhaal443 - 10 août 2014 à 11:20
Bonjour à tous,

je viens de découvrir SMARTY.
Le moteur de templates (http://smarty.php.net/).
Ca a l'air super, qui l'utilise ou peut me donner un avis.
Je me demande si je ne vais pas refaire toutes mes appli avec histoire d'être plus lisible .... vous en pensez quoi ??

Avis favorable, défavorable ??
Quel en est la porté ...
Comment ca marche ... SMARTY :D

bref, je vous écoute :D

23 réponses

kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
7 févr. 2006 à 13:49
J'aime bien smarty. Je suis en train de reprendre un site où la présentation et le Php étaient mélangés (histoire de faciliter la maintenance pour plus tard). Avec les templates ça devient plus clair.

Pour résumer, Smarty est une classe. Pour comprendre un peu son fonctionnement, ce serait pas mal que tu connaisses les bases de la programmation orientée objet.
http://www.commentcamarche.net/poo/poointro.php3
http://www.php.net/manual/fr/language.oop.php

Juste les bases: c'est quoi une classe, un objet, une variable membre et une fonction membre.

Par exemple deux fonctions membres très utilisées par les instances de Smarty c'est assign() et display()
assign() te permet de transmettre une variable dans le template et display() te permet d'afficher la page à partir d'un fichier template.

Mais je ne vois pas mieux que la documentation officielle pour comprendre le fonctionnement de Smarty.
Par contre si tu as des question précises, n'hésite pas à les poser.
4
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
7 févr. 2006 à 16:06
Non, le tpl est censé ne traiter aucune donnée.

Mais en fait ça ne se passe pas vraiment comme ça.
Le tpl ne traite pas les données mais il peut afficher en fonction de conditions ou effectuer des boucles.

Par exemple pour afficher un tableau du genre
$tab=array('un','deux');
$Tpl->assign('tab',$tab)

Et dans le template:
{foreach from=$tab item=chiffre}
         {$chiffre}<br/>
{/foreach}

Le champs from c'est le nom de la variable tableau concernée.
Et le champs item sera le nom à donner à chaque occurence du tableau. Le résultat te donnera:
un<br/>deux<br/>

Tu vois ce n'est pas vraiment un traitement de données mais un traitement d'affichage. Un affichage par boucle.
Ce qui est contenu dans le tableau $tab par contre, ça se passe dans le fichier Php.

Et tu peux aussi appliquer des fonctions Php dans le template aux variables affichées, pour mettre la première lettre en majuscule par exemple. Là encore il ya du traitement, mais ça reste cantonné à du traitement pour l'affichage.

Bien sûr tu peux utiliser des fonctions Php qui n'ont pas de rapport avec l'affichage dans le template mais du coup tu perds l'interêt du template.
2
jisisv
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
957
6 févr. 2006 à 15:29
Assez, sympa.
J'ai utilisé pas mal de temps ModeliXe comme moteur de templates.
Je suis passé à Smarty.
Très agréable, malgré la nécessité de l'adaptation.
J'aprécie particulièrement l'utilisation de la notation pointée (on fait un assign d'un array PHP et le tour est joué, l'utilisation des boucles
{foreach}, des conditionnelles {if}{ellseif}}{/if}

J'ai switché vers Smarty car c'est un standard.
De même, l'utilisation de PEARDB permet de changer facilement de base de données sous-jacente.
La documentation est disponible, non?
http://smarty.php.net/manual/fr/ (14-12-2005)
Document PDF
http://smarty.php.net/distributions/manual/fr/Smarty-2.5.0-docs.pdf
Johan
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
6 févr. 2006 à 15:39
Faut un super bon niveau pour l'utiliser ??
J'ai pas encore mis les mains dedans, mais je compte m'y mettre d'ici mercredi ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
7 févr. 2006 à 13:07
Peut on créer tout type d'application avec SMARTY ??
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
7 févr. 2006 à 13:18
Je commence a travailler avec ... mais j'ai du mal a embarquer ...
Quelqu'un pourrait il me faire un résumé rapide qui me permettrait de faire mes premier pas ... et arriver a accrocher avec la doc (ce qui n'est pas encore le cas ...)
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
7 févr. 2006 à 14:51
Merci, je suis en pleine lecture ...
Car en effet, tu as raison je n'ai jamais pratiqué la poo.
Je lis, je comprend ... et le passage à l'application :
-je le fait avec l'utilisation de SMARTY
-autre idée plus simple ??
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
7 févr. 2006 à 15:13
Oui avec smarty.
Essaie de faire des trucs de base et demande nous si tu as des soucis...
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
7 févr. 2006 à 15:51
Ben voilà ...
Ca re-commence ... J'ai une question :D

En fait c'est pour vérifier que j'ai compris ...

Les pages php ce sont les demandes avec les données ...
les *.tpl s'occupe du design et des fonctions ???

Genre je fais fais mes *.tpl pour mon design (facile, j'ai compris)
Ensuite, je fais mes fonctionalités ...
Dans mon *.php je fais mes requêtes MySQL pour séléctionner mes données par example, je les stocks dedans ... en assignant $smarty->assign("",""); et ensuite, je fais appel au *.tpl qui va traiter le tout et l'afficher comme faut ...

C'est ca ??
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
7 févr. 2006 à 16:20
Donc, je fais l'affichage dans le template ...

Et tous le traitement genre exportation, tri ou autre dans mon php ...

Le fait que l'affichage gére pas mal de chose comme l'UpperCase, la date et l'heure ou les boucles, combo ...
c'est ça ??
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
7 févr. 2006 à 16:27
La date et l'heure, je les vois plus dans le traitement.
Et les trucs comme les majuscules, tu peux tout à fait les gérer dans le Php comme dans le template, là c'est plus une question de choix).


Cette logique de disposer tel truc dans l'une ou l'autre partie viendra d'elle même...
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
7 févr. 2006 à 16:43
Pourquoi y a t il les templates et les templates_c ??
Pourquoi dans templates_c les nom des templates sont de types %%45^45E^45E480CD%%index.tpl.php ??
Je les sort de la demo de smarty ... pour info
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
7 févr. 2006 à 16:51
Templates_c ce sont les templates compilés.
Je ne sais pas trop comment smarty gère ça mais c'est lui qui s'en occupe, tu n'as pas à t'en soucier (par contre tu dois créer un repertoire pour ces fichiers).
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
7 févr. 2006 à 17:42
J'ai un souci ...

je fait ma requete, je rempli un tableau avec
$prenom = mysql_fetch_array($result, MYSQL_ASSOC);

Ce qui fait un tableau de type [NOM] [PRENOM] ... et ce 7 fois car j'ai 7 entrée en base, mais le dernier et vide
aprés je l'assigne
$smarty->assign("prenom",$prenom);


dans mon template il y a
  {foreach key=key item=item from=$prenom}
    {$key}: {$item}<br />
  {/foreach}


et là il ne me montre qu'un [NOM] [PRENOM] qu'il montre ainsi

NOM: Premiére valeur nom
PRENOM: Premiére valeur prénom

Pourquoi il ne le met pas sur une seule ligne et pourquoi je ne vois pas mes autres enregistrement ???
Je suis sur que j'ai raté un truc dans le foreach !!!

Merci d'avance pour votre aide
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
7 févr. 2006 à 19:41
Pourquoi il ne le met pas sur une seule ligne

Parce que tu as mis un <br />

pourquoi je ne vois pas mes autres enregistrement ???

Tu n'as demandé qu'une seule ligne du résultat renvoyé par ta requête Sql.
J'ai du faire face au même problème que toi au début.

Pour afficher tous les résultats renvoyés par une requête, d'habitude on fait comme ça:
while ($prenom = mysql_fetch_array($result, MYSQL_ASSOC) )
{
           echo 'Prenom: ' .$prenom['prenom'];
           echo 'Nom: '. $prenom['nom'];
}


Ce n'est plus possible avec les tpl vu qu'on n'as plus les echo, on doit d'abord récupérer tous les résultats pour les envoyer au tpl.

Pour arriver à ça, je passe par un tableau multidimensionnel et par une boucle qui ne fait que répéter sa condition (une boucle sans bloc d'instruction):
while ($lignes[]=mysql_fetch_array($result, MYSQL_ASSOC) ); /* Note le ";" à la fin */

Voilà, dans $lignes[0], tu auras la première ligne.
Dans $lignes[1]['prenom'] tu auras le prenom stocké à la ligne 2

Seul soucis: lorsqu'il n'y a plus de résultat dans $result, le while executera la condition, et comme il n'y a plus rien, il quittera la boucle mais par contre la variable $lignes[] prendra un résultat vide.

Il faut donc supprimer le dernier offset de $lignes:
array_pop($lignes);
//Puis on envoie $lignes au tpl
$Tpl->assign('lignes', $lignes);

Ensuite dans le tpl tu peux faire comme ça:
{foreach from=$lignes item=ligne}
           Prenom: {$ligne.prenom}<br/>
           Nom: {$ligne.nom}
{/foreach}

{* Ou alors *}
{foreach from=$lignes item=ligne}
         {foreach from=$ligne item=item key=key}
           {$key}: {$item}<br/>
         {/foreach}
{/foreach}

Et pis voilà.... :-)
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
8 févr. 2006 à 10:34
Ca marche ...
bon maintenant faut que je comprenne et que je fasse apparaître mes données comme je l'entend ...

Petite question subsidiaire ...
parce que le changement de système me "trouble" un peu.
J'ai la sensation que pour chaque fonction de mon application, il va falloir que je créer un fichier php et un tpl ... c'est ca ??

Avant, je passait des variables qui appeler certains includes.
J'avais une page du nom de "contenu" qui routait toute mes pages .... ainsi je n'avais qu'une page php a savoir index et le reste était chargé par des includes
avec les templates ... c'est fini je ne peux plus faire ca ?? (c'est une question, j'ai un gros doute)

0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
8 févr. 2006 à 11:01
Tu peux inclure un template dans un autre à n'importe quel endroit:
{include file="nom_du_fichier.tpl"}
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186 > kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016

8 févr. 2006 à 12:01
ca voudrait dire que je peux faire un template design générique présentant le header, footer et le menu ...

Est ce que je peut faire appele à plusieur new smarty dans une page ??
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523 > ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009

8 févr. 2006 à 12:22
ca voudrait dire que je peux faire un template design générique présentant le header, footer et le menu ...

Tout à fait, tu peux en fair un pour le footer, un pour le header etc...

Est ce que je peut faire appel à plusieur new smarty dans une page ??

Oui tu peux créer plusieurs instances de Smarty mais pour ça tu n'en a pas besoin.
Tu as juste besoin d'assigner les variables nessaires aux templates puis de lancer le display sur le template qui inclut les autres templates.
Les {include file} importent le code d''autre templates tout simplement....
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
8 févr. 2006 à 11:18
faut que je change tout ma façon de structurer mes application, non ?

pendant un moment j'ai cru qu'avec les templates, il fallait que je créer toutes les fonctionalité par modules puis les assembler notament avec les templates ...

Maintenant, je ne sais plus comment je doit le structurer... je veux dire, je ne sais plus par quel bout commencer.

J'ai une application qui fonctionne, mais elle ne respecte pas les standard ... et puis je veux apprendre surtout

Il y a un design, a peu prés 10 fonctionalités qui peuvent se spécialiser et en ouvrir d'autres si on fait évoluer l'application.

Par où je commence ??
Par créer les modules (1 module par pages php et template ?)
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
8 févr. 2006 à 12:44
Autre question ...

Encore ...
Ce coups ci je fait une combo ... tu sais une liste déroulante ...
J'appelle mes données depuis la base comme pour les autres affichage et dans le template je fais
{html_options name=fonction options=$option_values }


Le fait est qu'il me met autour de chaque valeur un optgroup qui apparait dans la combo avec le numéro du array ...
ca fait quelque chose comme:
0
permiere valeur
1
deuxième valeur
...

la source html montre ce genre d'info
<optgroup label="0">
<option label="1" value="id">1</option>
<option label="Première valeur" value="nom">Première valeur</option>
</optgroup>


... je crois que ca a un rapport avec le tableau mutlidimensionnel ... mais pas sur
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
8 févr. 2006 à 14:33
bon, je l'ai fait avec foreach ... au moins ca marche
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
8 févr. 2006 à 14:36
Tant mieux, parce que je m'en suis encore jamais servi...
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
8 févr. 2006 à 14:48
autre question à la con ... (c'est par ce que je refais une appli que j'ai déjà fait alors ...)

voila ... j'ai une liste de checkbox ...
le fait est que j'ai une liste d'item dans/sous laquelle j'ai une liste avec checkbox.

en fait, c'est un peu comme la présentation des msg dans ce forum sauf que je l'ai bridé à niveau... pour faire plus simple ...
Je vois comment générer une liste depuis smarty, mais j'ai du mal a imaginer les sous liste ...

--
..:::ZIG1:::..
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
8 févr. 2006 à 15:50
C'est encore moi,

Je fais une boucle avec une section genre ...
{section name=service loop=$service}
				{if $smarty.section.service.level eq 1}
				<INPUT TYPE="checkbox" NAME="SERVICE[]" VALUE={$smarty.section.service.foldId}>{$smarty.section.service.folder}<BR>
				{/if}
			{/section}


ma question est la suivante ...
Quand j'écris $smarty.section.service.level je fais fais bien ressortir la valeur "level" du tableau service, non ??
parce que c'est mon but ... et il me dit qu'il ne connait pas cet index ... alors du coup je ne sais pas vraiment quoi faire et comment ...

0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
8 févr. 2006 à 23:12
Chais pas. J'ai pas encore vu les sections...
0
ZIG1
Messages postés
1709
Date d'inscription
vendredi 7 juillet 2000
Statut
Membre
Dernière intervention
24 mars 2009
186
9 févr. 2006 à 10:00
j'ai trouvé en fait voilà comment ca marche
			{section name=service loop=$service}
				{if $service[service].level eq 1}
					{$service[service].folder}
					{section name=service2 loop=$service}
						{if $service[service].foldId eq $service[service2].app}
							<INPUT TYPE="checkbox" NAME="SERVICE[]" VALUE={$service[service2].foldId}>{$service[service2].folder}<BR>
						{/if}
					{/section}
				{/if}
			{/section}
0