A travers cet article, nous allons voir comment ce concevoir une architecture MVC avec Smarty en générateur de vue au travers d’un projet que je mène, il s’agit d’un site d’emploi de petite annonce.
La toute première chose à faire est d’aller sur le site de Smarty afin de télécharger la dernière version stable, au moment de la rédaction de l’article c’est la version 3.1.12 (http://www.smarty.net/files/Smarty-3.1.12.zip).
Bien entendu il vous faut de quoi faire tourner un serveur sur votre ordinateur en local comme Wamp.
Pendant que votre version de Smarty télécharge, créons un nouveau dossier qui contiendra tout notre projet à l’intérieur du dossier www de Wamp. Mon dossier s’appellera « pixyjob« . A l’intérieur de ce dossier voici les dossiers que vous devrez créer :
- config
- controllers
- core
- logs
- tpl
- web
Et à l’intérieur du dossier web vous devrez également créer les dossiers suivants :
- css
- img
- js
- tools
Normalement à ce stade, votre téléchargement de Smarty devrait avoir fini. Décompresser donc votre archive sur votre disque dur. Copiez le dossier « libs » et collez dans web/tools/ et renommez le « smarty« .
A la racine de votre dossier « pixyjob » créer un document index.php que nous allons éditer tout de suite.
C’est ce fichier « index.php » qui va permettre de faire fonctionner toute notre architecture MVC, d’appeller les vues, controllers et modèles correspondant à ce dont on a besoin, ce fichier est la clé.
A l’intérieur de votre fichier, définissiez le code fichier php avec les balises adéquate et on y va mettre un include afin de charger l’environnement à l’aide du fichier config_init.php que l’on créera plus tard.
<?php // Initialisation de l'environnement include('./config/config_init.php'); ?>
On va maintenant définir le routing, à savoir comment on doit charger nos controllers, on pense notamment bien à prévoir le cas si c’est une action ou une page qui est requise. (Code à inclure dans votre index.php avant la balise de fermerture de php » ?> » )
// Gestion de Routing if (isset($_GET['action']) && file_exists(_CTRL_.'action/'.str_replace('.', '', $_GET['action']).'.php')) include(_CTRL_.'action/'.$_GET['action'].'.php'); if (isset($_GET['page']) && file_exists(_CTRL_.str_replace('.', '', $_GET['page']).'.php')) include(_CTRL_.$_GET['page'].'.php'); else include(_CTRL_.'index.php');
Et maintenant on va lui définir l’empacement des templates, le header, le footer et bien entendu la page qui sera demandé.(Code à inclure dans votre index.php avant la balise de fermerture de php » ?> » )
// Affichage des templates $smarty->display(_TPL_ . 'header.tpl'); if (isset($_GET['page']) && file_exists(_TPL_.'pages/'.str_replace('.', '', $_GET['page']).'.tpl')) $smarty->display(_TPL_.'pages/'.$_GET['page'].'.tpl'); else $smarty->display(_TPL_ . 'pages/home.tpl'); $smarty->display(_TPL_ . 'footer.tpl');
Ce qui signifie que sur chaque page le header.tpl et footer.tpl seront toujours affichés, et le contenu est par défaut pages/home.tpl et si jamais on a une page demandé et que le fichier existe, c’est celui ci qui sera affiché.
Vous remarquez l’extension .tpl propre à Smarty pour ses vues (templates).
On va maintenant s’occuper de créer nos fichiers de configuration. Rendez-vous au sein de votre dossier config/ et créons un fichier nommé « defines.inc.php » à l’intérieur nous allons définir les chemins relatifs
<?php // Si on a pas ces infos, rien ne peut fonctionner : die if (!isset($_SERVER['DOCUMENT_ROOT'])) die(); // Define de la racine du site define('_PATH_', $_SERVER['DOCUMENT_ROOT'].'/'); // Define du dossier Coeur define('_CORE_', _PATH_ . 'core/'); // Define du dossier des Controleurs define('_CTRL_', _PATH_ . 'controllers/'); // Define du dossier des Configs define('_CONFIG_', _PATH_ . 'config/'); // Define du dossier des TPL define('_TPL_', _PATH_ . 'tpl/'); // Define du dossier des logs define('_LOGS_', _PATH_ . 'logs/');
?>
Maintenant on va créer un fichier « config_init.php » dont on a déjà mentionné l’appel via un include dans notre index.php, à l’intérieur de ce fichier de config on va tout initialiser pour que le système tourne parfaitement.
A l’intérieur de ce fichier on va démarrer la session, charger Smarty, inclure tout le « coeur » du projet pour que toute les classes soit chargées, on va également y mettre une connexion à la base de donnée et pour finir on va créer notre instance de Smarty.
// Initialisation de la session session_start(); header("Cache-Control: no-cache"); // Chargement Smarty et Defines require('defines.inc.php'); require(_PATH_ . 'web/tools/smarty/Smarty.class.php'); // Chargement du coeur $files = scandir(_CORE_); foreach ($files as $filename) { if (is_file(_CORE_.$filename)) require_once(_CORE_.$filename); } // Connexion Database try { $bdd = new PDO("mysql:host=localhost;dbname=pixyjob", "root", ""); $bdd->query("SET NAMES UTF8"); } catch (Exception $e) { echo "Problème de connexion à la base de donnée PixyJob..."; die(); }
// Initialisation Smarty $smarty = new Smarty();
Si plus tard vous avez besoin d’inclure une Application Facebook pour gérer un Facebook connect ou autre, c’est ici que vous devrez inclure la configuration à Facebook.
Maintenant la première chose à faire avant que votre architecture fonctionne on va encore créer un premier controller, et quelques vus car sans celà rien ne marchera car dans notre fichier index.php.
Donc rendez-vous dans votre dossier « controllers » et créez un fichier nommé index.php, ensuite dans votre dossier « tpl » nous allons créer deux fichiers, footer.tpl et header.tpl et dans votre dossier « tpl/pages » créons index.tpl.
Maintenant votre architecture est prête. Le code qui se trouvera dans footer.tpl et header.tpl sera affiché sur toutes vos pages.
Editons donc notre header.tpl, voici le code que j’y ai mis
<!DOCTYPE html> <html lang="fr"> <head> <title>PixyJob</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" href="/web/css/base.css" media="screen" /> <link rel="shortcut icon" href="/web/images/favicon.ico" /> <!-- On importe jQuery --> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script> </head> <body> <div> Ceci est notre header </div>
Maintenant on va éditer notre footer.tpl pour lui mettre la balise de fermeture du code HTML
<div> Ceci est notre footer </div> </body> </html>
Et maintenant dans notre index.tpl nous allons y mettre
<div> Le contenu de notre page index.tpl </div>
Victoire, l’architecture est en place et fonctionne.
Maintenant si vous n’êtes pas habituées des architectures MVC vous devez vous demandez comment on fait transiter des variables php vers Smarty ?
Tout simplement, si on veut récupérer des variables dans notre vues « index » nous allons devoir mettre du code dans notre controllers « index », logique jusque là.
Imaginons que dans notre controllers index.php nous ayons ceci
<?php //On crée une variable qui a pour valeur '15' $maVariable = 15; //On envoie la variable à la vue avec un smarty->assign $smarty->assign('nomDeMaVariableSousSmarty', $maVariable); ?>
Comme vous le voyez on viens d’envoyer à Smarty $maVariable, pour récupérer cette variable sous Smarty elle s’appellera : nomDeMaVariableSousSmarty.
Dans votre vue index.tpl vous pouvez éditer votre fichier et modifier votre texte en :
Ma variable vaut {$nomDeMaVariableSousSmarty} , le nom que vous avez défini précédé d’un $ et tout ceci entre accolades.
Sauvegarder et vérifier, Bingo ça marche.
On se retrouve très vite pour la partie 2 où l’on créera des classes et des fonctions pour les faire intervenir dans notre projet.
Pour faire vos pages il faut comprendre et retenir ces choses importantes :
Lorsque vous créer une nouvelle vues, le controller doit avoir exactement le même nom car c’est notre index.php principal qui va appeler le controllers portant le nom de la vue automatiquement.
-Dans vos core, vos classes et fonctions qui vous permettront de faire vos traitement de données.
-Dans vos controllers, du code php qui fera des appels aux classes stocké dans notre « core » pour avoir les éléments désirées et on les enverra à a vue sous forme de « variable smarty » pour les afficher.
-Dans vos vues (tpl/pages) il faut uniquement du code HTML et JS
Très interessant…j’utilise Smarty depuis quelques temps mais je ne l’ai jamais orienté poo / MVC…
Un très bon tuto simple et efficasse où nous allons pouvoir faire des merveilles avec…
A quand la partie 2 ?? terriblement préssé d’avoir mon MVC opérationnel ^^
La partie 2 arrive début Janvier 2013 🙂
Tu pourras exploiter ton petit système crée 🙂
Salut Matthebest62,
La deuxième partie de ce tutorial est en ligne :
http://fredods.com/creer-votre-site-avec-smarty-partie-2/
ahhh genial ! j’avou que j’adore smarty depuis plusieur année et créer un MVC avec synfonie ou zend ne m’emballe pas particulièrement…un peu trop gros pour moi…bien que super puissant, j’adore la simplicité de smarty ^^ !
super comme boulot…encore merci a toi ^^
C’est sur que c’est plus gros comme Framework a prendre en main avec les méthodos imposés !
Mais pour des sites de petites – moyennes envergures, tu verras que ce Framework fera bien l’affaire 🙂
Bonjour
Merci pour ce tuto c’est très génial…
cependant, j’ai pas arrivé à trouver la deuxième partie qui complète la première partie
Bonjour
La seconde partie du tutoriel est en cours de rédaction et devrai paraître prochainement afin de vous aider a créer vos premiers modèle et controllers
Je vous écrirai un email pour vous informer de sa mise en ligne
Cordialement
Fredods
Salut Olesu,
La deuxième partie de ce tutorial est en ligne :
http://fredods.com/creer-votre-site-avec-smarty-partie-2/
Bonjour,
Merci pour ce tuto bien expliquer… mais j’aurai quelques questions.
1 . Le fichier core est bien vide? parce que j’ai une erreur au niveau de $files = scandir(_CORE_);
2 . Quand on créer un nouveau controller et un nouveau tpl quelle fichier doit t’on appeler dans l’url le controller ou le tpl ?
Cordialement
Subzeros
Bonjour Subzeros,
Pour répondre à tes questions :
1 – Oui à la fin de notre tutorial le dossier core est vide car nous n’avons pas encore crée de class à l’intérieur (Ca sera dans la suite du chapitre)
2 – Pour appeller tes pages c’est ainsi index.php?page=clients qui appellera automatiquement le controller clients.php et le template clients.tpl
Après tu peux te créer un htacess pour avoir de plus url du genre
RewriteRule ^clients$ index.php?page=clients[L]
La suite du tutorial arrive en vidéo pour que ce soit plus facile pour tout le monde 🙂
Cordialement,
Fredods
Salut Subzeros,
La deuxième partie de ce tutorial est en ligne :
http://fredods.com/creer-votre-site-avec-smarty-partie-2/
Merci pour ta réponse ;). Impatient de voir la vidéo ^^
La partie 2 est elle toujours en cours de création? Excellent tuto j’ai hate de lire la suite
Bonjour Zazze,
Oui la deuxième partie est en finition, il me manque deux trois screenshoot à faire et à publier l’article
Bonne Journée
Salut Zaze,
La deuxième partie de ce tutorial est en ligne :
http://fredods.com/creer-votre-site-avec-smarty-partie-2/
Super ! merci pour ce tuto 😉
Par contre sans la deuxième partie ça va être chaud d’avancer.
Bonjour Dave,
La deuxième partie est toujours en cours d’écriture, j’essaye de la publier au plus vite.
Salut Dave,
La deuxième partie de ce tutorial est en ligne :
http://fredods.com/creer-votre-site-avec-smarty-partie-2/
Pour ma part une erreur, qu’elle erreur j’ai fait ?
[function.require]: Failed opening required ‘C:/wamp/www//web/tools/smarty/Smarty.class.php’
(include_path=’.;C:\\php\\pear’) in C:\\wamp\\www\\test\\config\\config_init.php on line 8
require(« C:\wamp\www\test\web\tools\smarty\Smarty.class.php »);
Comme tu le voies :
Tu n’a pas défini ton dossier « test » dans tes configs
Il faut que dans ton defines.inc.php à cette ligne
// Define de la racine du site
define(‘_PATH_’, $_SERVER[‘DOCUMENT_ROOT’].’/’);
Tu mettes ton dossier comme ceci
// Define de la racine du site
define(‘_PATH_’, $_SERVER[‘DOCUMENT_ROOT’].’/tondossier/’);
Bonjour, je cherchais un moyen d’optimiser mon développement, d’avoir une base pour ne pas repartir de zéro a chaque fois, et le MVC et smarty me semblait la bonne méthode. Votre tuto est intéressant, le problème est que j’ai une erreur 500 ! je ne comprend pas pourquoi ! Avez vous deja vu ce problème?
Bonjour Benjamin,
L’erreur 500 provient d’une erreur interne du serveur.
Vous bossez en local sur votre poste ou sur votre FTP ?
Bonjour, je cherchais un moyen d’optimiser mon développement, d’avoir une base pour ne pas repartir de zéro a chaque fois, et le MVC et smarty me semblait la bonne méthode. Votre tuto est intéressant, le problème est que j’ai une erreur 500 ! je ne comprend pas pourquoi ! Avez vous deja vu ce problème?
Bonjour Benjamin,
L’erreur 500 provient d’une erreur interne du serveur.
Vous bossez en local sur votre poste ou sur votre FTP ?
Bonjour,
Je débute et je m’essaye à SMARTY en espérant que grâce à votre tutoriel je vais y arriver 🙂
Je ne suis pas sûr, mais pour ma part, le footer et le contenu du template ne voulais pas s’afficher seul le header s’affichait, en cherchant je crois avoir vu une petite erreur dans le tuto :
Dans la partie ci dessous vous indiquer « $smarty->display(_TPL_ . ‘pages/home.tpl’); »
// Affichage des templates
$smarty->display(_TPL_ . ‘header.tpl’);
if (isset($_GET[‘page’]) && file_exists(_TPL_.’pages/’.str_replace(‘.’, », $_GET[‘page’]).’.tpl’))
$smarty->display(_TPL_.’pages/’.$_GET[‘page’].’.tpl’);
else
$smarty->display(_TPL_ . ‘pages/home.tpl’);
$smarty->display(_TPL_ . ‘footer.tpl’);
Par la suite vous dîtes :
« ensuite dans votre dossier « tpl » nous allons créer deux fichiers, footer.tpl et header.tpl et dans votre dossier « tpl/pages » créons index.tpl. »
Ne faut-il pas créer un fichier home.tpl ? ou changer home.tpl par index.tpl ?
Merci
c’est dans le fichier index.php en racine qui faut changer home.tpl par index.tpl
Dommage qu’il n y a pas de suite au tutoriel.
MERCI, et ce n’est aps pour rien si c’est en majuscule.
INFINIMENT MERCI.
😉
merci infiniment
Salut, j’essaye de faire une page de login qui renverra directement sur un dashboard.
Je voudrais savoir comment procéder avec ton architecture MVC parceque je n’y arrive pas du tout a structurer tout ça.
Merci de ton aide par avance.
Bonjour Theca,
Tu dois gérer ces redirections au niveaux des « actions »
qlq’un peut m’aider ?
Warning: require_once(C:/wamp64/www/web/tools/smarty/Smarty.class.php): failed to open stream: No such file or directory in C:\wamp64\www\pixyjob\config\config_init.php on line 5
L’erreur t’indique que il ne peut pas exécuter l’instruction en ligne 5 de ton fichier
Il ne trouve rien dans ce dossier C:\wamp64\www\pixyjob\config\config_init.php on line 5
Salut à vous !
J’ai suivi votre cours mais j’ai cette « jolie » erreur :
Fatal error: Smarty error: the $compile_dir ‘templates_c’ does not exist, or is not a directory. in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\web\tools\smarty\Smarty.class.php on line 1100
Je ne sais pas quoi faire dépuis je suis bloqué du coup je n’ai plus le goût de suivre la partie 2 de votre cours.
J’espère que vous avez une solution pour moi.
Merci !
bonjour je commences mes premiers pas sur smarty mais j’ai un petit eurreur au niveau du dossier config