Smarty Forum Index Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon.

Débuter de zéro

 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Language: French
View previous topic :: View next topic  
Author Message
persto
Smarty n00b


Joined: 18 Jan 2010
Posts: 2

PostPosted: Mon Jan 18, 2010 8:56 pm    Post subject: Débuter de zéro Reply with quote

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
View user's profile Send private message
Gowser
Smarty Pro


Joined: 19 Feb 2008
Posts: 104
Location: Nantes (France)

PostPosted: Wed Jan 20, 2010 8:14 am    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail
persto
Smarty n00b


Joined: 18 Jan 2010
Posts: 2

PostPosted: Mon Jan 25, 2010 8:48 pm    Post subject: Reply with quote

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 Wink
Back to top
View user's profile Send private message
nlefebrve
Smarty n00b


Joined: 06 May 2010
Posts: 2

PostPosted: Sun May 23, 2010 4:16 pm    Post subject: Reply with quote

slt pourrais tu nous donné BaseController.php ?
Back to top
View user's profile Send private message Send e-mail
Gowser
Smarty Pro


Joined: 19 Feb 2008
Posts: 104
Location: Nantes (France)

PostPosted: Wed Jun 02, 2010 3:08 pm    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail
Display posts from previous:   
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Language: French All times are GMT
Page 1 of 1

 
Jump to:  
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
Protected by Anti-Spam ACP