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

Résolu/Fermé
Utilisateur anonyme - 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
A voir également:

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 527
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 527
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 934
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
Utilisateur anonyme
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
Utilisateur anonyme
7 févr. 2006 à 13:07
Peut on créer tout type d'application avec SMARTY ??
0
Utilisateur anonyme
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
Utilisateur anonyme
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 527
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
Utilisateur anonyme
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
Utilisateur anonyme
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 527
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
Utilisateur anonyme
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 527
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
Utilisateur anonyme
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 527
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
Utilisateur anonyme
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 527
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
Utilisateur anonyme > 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 527 > Utilisateur anonyme
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
Utilisateur anonyme
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
Utilisateur anonyme
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
Utilisateur anonyme
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 527
8 févr. 2006 à 14:36
Tant mieux, parce que je m'en suis encore jamais servi...
0
Utilisateur anonyme
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
Utilisateur anonyme
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 527
8 févr. 2006 à 23:12
Chais pas. J'ai pas encore vu les sections...
0
Utilisateur anonyme
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