|
Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon. |
|
View previous topic :: View next topic |
Author |
Message |
persto Smarty n00b
Joined: 18 Jan 2010 Posts: 2
|
Posted: Mon Jan 18, 2010 8:56 pm Post subject: Débuter de zéro |
|
|
Bonsoir
Depuis peu je m'intéresse au moteur de template Smarty
J'ai bien commencé par faire le "Quick install", j'ai pas rencontrée trop de problèmes ...
Maintenant je cherche à avancer dans l'utilisation de smarty
Bien sûr j'ai cherché sur google mais moults article datent de 2006 , 2006
Mon problème c'est que j'ai un peu du mal à voir le liens entre PHP et Template
pourtant je visualise bien le modèle MVC
En fait je chercherai un tuto concret...
Je sais pas vous comment avez vous commencez avec smarty?
Au pire vous auriez pas un exemple simple de page php génére via php (autre qu'un hello world)
D'avance merci de votre aide . |
|
Back to top |
|
Gowser Smarty Pro
Joined: 19 Feb 2008 Posts: 104 Location: Nantes (France)
|
Posted: Wed Jan 20, 2010 8:14 am Post subject: |
|
|
Bonjour,
Nous codons également sous Pattern MVC, un truc assez simple mais tout de même complet pour faire notre boulot (donc tu ne devrait pas trop être dépayser si tu dis que tu visualises bien le mvc)
Je vais essayer d'être clair dans mon explication :
Pré-remarque:
Dans cette explication, je passerais par dessus le fait que mes controllers passent par un front controller, je passerais au dessus de la couche model ainsi que de mon arborescence.
Dans cet exemple, tu verras souvent une classe statique appelée Context utilisée souvent. Elle sert simplement à piloter les chemins d'accès
Description :
Dans cet exemple , j'expliquerai simplement le lien qu'il y a entre un controller de base et un template
Coté controller :
Mon controller va simplement allez récupérer une liste d'objet nommé "Guild" et les passer à un objet BaseView (qui est le reflet de la classe Smarty)
Code: |
<?php
require_once Context::$CONTROLLERS_DIR.'BaseController.php';
require_once Context::$VIEWS_DIR.'BaseView.php';
class AccueilController extends BaseController{
public function accueil(){
require_once Context::$MODELS_DIR.'Guild.php';
// on recupere les dernieres guildes inscrites
$guild = new Guild();
$guildListe = $guild->listerGuildDerniereInscrites();
// assignation smarty
$view = new BaseView('accueil/accueil.tpl');
$view->set('guildListe', $guildListe);
return $view;
}
}
?>
|
On peut voir qu'au chargement du fichier, 2 fichiers sont inclus :
- BaseController : il est simplement le constructeur de tous mes controllers vu que tous mes controllers étendent de celui la (cela me permet d'avoir des actions par défaut a chaque instance de controller comme récupérer une session, initialiser l'utilisateur, etc...)
- BaseView : il est le "pilote" de smarty. Il instancie la classe smarty et le paramètre (je ne passerait pas sur les options de paramétrage)
Code: |
<?php
require_once Context::$LIBS_DIR.'smarty/Smarty.class.php';
/**
* Cette classe définit la partie vue du pattern MVC.
*
* Elle initialise le "templateur" Smarty.
*/
class BaseView {
// Objet Smarty
protected $smarty;
// nom du template Smarty à afficher
protected $template;
/**
* Constructeur.
*
* Initialise le moteur Smarty, entre autre :
* <code>template_dir</code>
* <code>compile_dir</code>
* <code>config_dir</code>
* <code>cache_dir</code>
*
* Initialise 2 variables disponibles pour le template :
* <code>RESOURCES_DIR</code> : chemin absolu (filesystem) des resources de l'application
* <code>WEBROOT_URL</code> : URL racine de l'application
*
* @param string $template Nom du template Smarty à afficher
*/
public function __construct($template) {
header('Content-Type: text/html; charset='.Context::$CHARSET_PAGE);
$this->template = $template;
$this->smarty = new Smarty;
$this->smarty->template_dir = Context::$VIEWS_DIR.'templates/';
$this->smarty->compile_dir = Context::$TMP_DIR.'templates_c/';
$this->smarty->config_dir = Context::$CONFIGS_DIR;
$this->smarty->cache_dir = Context::$TMP_DIR.'cache/';
$this->smarty->compile_check = true;
$this->smarty->caching = false;
$this->smarty->cache_lifetime = -1;
$this->smarty->assign('RESOURCES_DIR', Context::$RESOURCES_DIR);
$this->smarty->assign('WEBROOT_URL', Context::$WEBROOT_URL);
$this->smarty->assign('ENCODING_CHARSET', Context::$CHARSET_PAGE);
}
/**
* Ajoute une variable disponible pour le template Smarty.
*
* @param string $key Nom de la variable
* @param string $value Valeur de la variable
*/
public function set($key, $value) {
$this->smarty->assign($key, $value);
}
/**
* Affiche la vue.
*/
public function display() {
$this->smarty->display($this->template);
}
}
?>
|
Grâce à tous cela, nous pouvons voir que mon controller :
- Récupère la liste des objets Guild en base
- Instancie un objet BaseView (le reflet de Smarty) avec en paramètre le nom du template à utiliser
- Envoi cette liste au template puis affiche le template (grâce à mon return de $view qui est interpréter par mon front controller comme un fait de devoir afficher le résultat. En gros le front controller ne fera qu'à la réception du return qu'un "$view->display()" )
Coté template :
Nous arrivons enfin dans la partie simple du sujet, le rendu.
Code: |
{include file='commun/entete.tpl'}
<div>
<h2>
Derniers clans / guildes inscrits
</h2>
<table cellpadding="2" cellspacing="0" style="width: 100%;">
<tbody>
{section name=indexGuild loop=$guildListe}
{cycle assign='classTr' values='colored,'}
{assign var='nombreMembre' value=$guildListe[indexGuild]->compterGuildNombreMembre()}
<tr class="{$classTr}">
<td>
[
{$guildListe[indexGuild]->getGuildTag()|escape}
]
</td>
<td>
<a href="?action=guild&guildId={$guildListe[indexGuild]->getGuildId()|escape}">
{$guildListe[indexGuild]->getGuildName()|escape|truncate:'25'}
</a>
</td>
</tr>
{sectionelse}
<tr>
<td class="alignCenter">
Aucun clan / guilde inscrit
</td>
</tr>
{/section}
</tbody>
</table>
</div>
{include file='commun/pied.tpl'}
|
Nous pouvons voir maintenant que 2 fichiers sont inclus en smarty :
- entete.tpl : qui contient mes balise html, body et head avec tous ce qui va avec
- pied.tpl : qui s'occupe de fermer les balises html et body (et d'écrire un footer si on veut)
Nous voyons également que je fait un {section} à l'intérieur d'un <TABLE> afin de parcourir la liste de "Guild" que j'ai récupéré dans mon controller
Conclusion
Tout ceci nous a permis de pouvoir séparer correctement la partie controller (la récupération d'objet, faire des calculs, etc... plein de trucs que l'on ne met pas dans le rendu) et la partie affichage qui ne contient donc du coup que du HTML et du smarty.
Pour répondre à comment avez vous commencez avec smarty, je dirais comme toi, avec des hello world, puis on peaufine avec des section, des foreach , on feuillette toutes les fonctions de smarty en se faisant plein de petits exemples bidons puis on passe aux choses sérieuses en l'incluant dans un pattern et la on voit vraiment le potentiel du joujou.
Bon je crois que j'ai fait le tour. Si tu as des questions, n'hésite pas !
++ |
|
Back to top |
|
persto Smarty n00b
Joined: 18 Jan 2010 Posts: 2
|
Posted: Mon Jan 25, 2010 8:48 pm Post subject: |
|
|
Merci Gowser pour ta réponse très complète apparemment
Je vous tiendrai au courant ...
Pour l'heure j'ai quelques imprévu qui me font mettre à sourdine la découverte de smarty |
|
Back to top |
|
nlefebrve Smarty n00b
Joined: 06 May 2010 Posts: 2
|
Posted: Sun May 23, 2010 4:16 pm Post subject: |
|
|
slt pourrais tu nous donné BaseController.php ? |
|
Back to top |
|
Gowser Smarty Pro
Joined: 19 Feb 2008 Posts: 104 Location: Nantes (France)
|
Posted: Wed Jun 02, 2010 3:08 pm Post subject: |
|
|
Bonjour,
Concernant le BaseController :
Le BaseController n'est qu'un controller abstrait vide (par défaut dans nos projets, abstrait car il ne doit pas être instancié vu qu'il ne correspond à rien) qui permet d'y saisir des fonctions qui seront disponible pour tous les controller.
Donc le BaseController sera par défaut au début d'un projet :
Code: | <?php
// abstract pour éviter toute instance et de n'être utilisé que grace à un extend
abstract class BaseController{
}
?> |
A vous après d'y rajouter des fonctionnalités disponible pour toutes les classes, par exemple une fonction qui converti une date en mktime (par exemple !!) :
Code: | <?php
// abstract pour éviter toute instance et de n'être utilisé que grace à un extend
abstract class BaseController{
// protected pour éviter toute utilisation hors d'un extend de cette classe
// fonction qui converti de jj/mm/aaaa en mktime
protected function convertionMktime($date){
$dateTemp = explode('/', $date);
return mktime(0, 0, 0, $dateTemp[1], $dateTemp[0], $dateTemp[2]);
}
}
?> |
Grace à cela, la fonctionnalité convertionMktime sera disponible dans tous les controller en l'appelant comme il suit :
Code: | <?php
class UnController extends BaseController{
public function uneFonction(){
// si vous n'avez pas une autre fonction appelée 'convertionMktime' dans ce controller
self::convertionMktime('01/01/2010');
// si vous avez une autre fonction appelée 'convertionMktime' dans ce controller
parent::convertionMktime('01/01/2010');
}
}
?> |
|
|
Back to top |
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|
|