Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour tout le monde
J'ai commencé à utiliser le Zend Framework depuis quelques jours, et je trouve le Zend_View peut performant. J'ai donc décidé d'utiliser Smarty comme à mon habitude. J'ai lu l'article de kitpages.fr à ce sujet mais il faut ajouter des classes et changer quelques paramètres, ce qui ne colle pas avec ma façon de faire. Je préfère de loin la simplicité. C'est pourquoi, pour mon tout premier post sur ce forum , je partage avec vous ma façon d'intégrer Smarty au Zend Framework.
1. Arborescence
Comme vous le savez sans doute, les vues sont placées dans le dossier /views/scripts/[contrôleur]/.
Nous allons donc placer nos fichiers .tpl dans les mêmes dossiers que les vues.
2. Initialiser Smarty
Après avoir inclus le fichier principal de Smarty, créez une instance de ce dernier et configurez la comme vous le voulez par rapport à l'arborescence que vous avez choisi. Seulement, ne donnez aucune valeur à $smarty->template_dir.
Pour pouvoir accéder facilement à smarty, gardez le dans le registre de Zend :
Zend_Registry::set('Smarty', $smarty);
3. Lier Smarty au Zend Framework
Vous allez maintenant créer le fichier /views/scripts/[contrôleur]/index.phtml requis pour ne pas vous retrouver avec une exception levée.
Un rapide récapitulatif avant de continuer :
- Smarty configuré
- Fichiers .tpl placés dans /views/scripts/[contrôleur]/
- Fichier /views/scripts/[contrôleur]/index.phtml créé (fichier vide !)
Dernière étape : Ouvrez chacun de vos contrôleurs (exemple: IndexController.php) et ajoutez dans la méthode init() la ligne suivante :
Zend_Registry::get('Smarty')->template_dir = [APPLICATION_DIRECTORY] . '/views/scripts/[contrôleur actuel]/';
Par exemple, pour le contrôleur index (emplacement : C:/application) :
<?php class IndexController extends Zend_Controller_Action { public function init() { Zend_Registry::get('Smarty')->template_dir = 'C:/application/views/scripts/index/'; } } ?>
Ensuite, vous n'avez plus qu'à utiliser Smarty comme vous avez l'habitude de le faire (en passant bien sur par Zend_Registry::get('Smarty')).
Voila, j'espère que ce petit article vous sera utile.
Si vous trouvez des erreurs, n'hésitez pas à me le faire savoir pour que je corrige ça. Idem, si vous ne comprenez pas un passage, dites le moi savoir et j'essayerais de vous donner plus d'informations pour vous aider.
Bon coding, et amusez vous bien avec le Zend Framework
Dernière modification par Psykocrash (23-11-2007 16:15:33)
Hors ligne
le sujet a déjà été aborté et il y a sur ce forum des proposition de méthode pour intégrer Smarty directement dans la vue sans avoir d'appel particulier à faire.
ces approche propose purement et simplement de se passer du script phtml et ne demande pas de code particulier dans le contrôleur
en clair une appli écrite avec ZF sur le mode standard peut passer sous smarty ou autre moteur de template sans changer une seul linge des contrôlleurs juste en remplaçant les fichiers phtml par des fichier tpl
A+JYT
Hors ligne
Est ce que tu pourrais me donner le lien vers le topic en question ? Je ne le trouve pas et suis réellement intéressé.
Merci d'avance
Hors ligne
Faut chercher dans la rubrique tuto: http://www.kitpages.fr/zf_integrerSmarty.php
Hors ligne
Psykocrash a écrit:
J'ai lu l'article de kitpages.fr à ce sujet mais il faut ajouter des classes et changer quelques paramètres, ce qui ne colle pas avec ma façon de faire.
Difficile de faire plus clair...
Hors ligne
Bonjour Psykocrash,
Ton approche est effectivement plus simple que celle de mon tuto, par contre, l'avantage de ma méthode, c'est que les actions (genre indexAction) utilisent tjrs la syntaxe $this->view->toto = "titi" et echo $this->view->render.
Donc le jour où tu veux changer de système de template, c'est sensé marcher de façon transparente.
(bon, je veux bien t'accorder qu'on ne change pas de système de template tous les 2 jours...)
A+, Philippe
Hors ligne
Je vais finalement utiliser ta méthode, Philippe. Bien qu'elle demande plus de code, je la trouve, après réflexion, plus "propre" que la mienne dans le sens où ce que je propose requière de créer des fichiers vides pour éviter les exceptions.
Dernière modification par Psykocrash (23-11-2007 18:31:05)
Hors ligne
Ahhh non. Après avoir testé, il faut, même avec ta méthode, laisser ls fichiers .phtml vides. Bon bin je reviens à la simplicité.
PS : Il n'y aurait pas un moyen de désactiver l'appel automatique des fichiers .phtml ? Ce serait bête qu'ils n'aient pas pensé à ça...
Hors ligne
suite à plusieurs interventions dans les forum j'ai posté ça sur mon blog
http://sekaijin.ovh.org/?p=13
A+JYT
Hors ligne
Je crois avoir enfin trouvé le meilleur moyen d'intégrer Smarty !!!!
Fatigué des systèmes D, je me suis plongé dans le code source du framework pour comprendre le fonctionnement de Zend_View et, lors de mon excursion, je suis tombé sur des méthodes que je n'avais pas remarqué en lisant la documentation officielle. Peut parce qu'elles n'y sont tout simplement pas, ou alors je suis passé à côté. Peu importe...
Pour ne pas faire durer le suspense plus longtemps, je vous explique comment j'ai fait : j'ai codé un filtre. Les filtres prennent des données et les traitent à la volée. J'ai donc écrit un filtre qui récupère le contenu du fichier .phtml et qui le parse avec Smarty avant de renvoyer le contenu parsé. Je me suis heurté à quelques problèmes du côté du framework comme du côté de Smarty. J'ai un peu buché pour comprendre comment zf voulait qu'un filtre soit écrit (cad nom de la classe et emplacement), et comment le passer à Zend_View (dois-je passer le nom de la classe ? une instance ? l'adresse du filtre ? ...). J'ai donc ajouté des lignes de debug au framework pour lui faire cracher ce qu'il attendait de moi. Ensuite, j'ai eu un problème avec Smarty. Il ne traite que des fichiers, on ne peut pas lui passer de données. Du coup, j'ai fait en sorte de créer un fichier temporaire dans lequel j'écris les données à parser, je lui passe l'adresse du fichier, récupère le résultat, et supprime le fichier.
Ces explications faites, place à la pratique :
Fichier /views/filters/Smartyfilter.php :
<?php /** * Class for parsing views with Smarty. * * @author Psykocrash (SERRAJ Younes) * @copyright Copyright (c) 2007 SERRAJ Younes. * @license http://framework.zend.com/license/new-bsd New BSD License */ require_once 'Zend/Filter/Interface.php'; class Zend_View_Filter_Smartyfilter implements Zend_Filter_Interface { /** * Filter to parse data with Smarty. * * @param string $content The data to parse. * @return string The parsed data. */ public function filter($content) { $file_name = tempnam(__TEMP_DIRECTORY__, 'smarty-fetch_'); file_put_contents($file_name, $content); $parsed_content = Zend_Registry::get('Smarty')->fetch($file_name); unlink($file_name); return $parsed_content; } } ?>
La constante __TEMP_DIRECTORY__ correspond à l'adresse d'un dossier dans lequel seront créés les fichiers temporaires dont on a parlé plus haut.
Ensuite, rendons nous dans le contrôleur :
<?php class IndexController extends Zend_Controller_Action { public function init() { $this->view->addFilter('Smartyfilter'); } public function indexAction() { Zend_Registry::get('Smarty')->assign('variable', 'hahahaha !!'); $this->render(); } } ?>
C'est tout.
-> Comment ça c'est tout ?
<- Oui, c'est tout
Amusez vous bien !
Dernière modification par Psykocrash (24-11-2007 20:05:33)
Hors ligne
Simple, mais es ce efficace en terme de perf? Je veux dire le fait de créer un fichier et de le supprimer à chaque rendu de vue, c'est pas trop lourd?
Hors ligne
Mr.MoOx a écrit:
Simple, mais es ce efficace en terme de perf? Je veux dire le fait de créer un fichier et de le supprimer à chaque rendu de vue, c'est pas trop lourd?
On peut éviter de recréer le fichier temporaire de deux façons :
1) utiliser md5($content) pour le nom du fichier. Puis on tente le fetch() (avec un @ devant pour éviter le warning), si le résultat est vide et seulement dans ce cas, on crée le fichier et on retente le fetch(). Cela évite aussi de créer des tonnes de fichiers Smarty compilés (un à chaque appel avec les fichiers temporaires qui changent sans cesse de nom)
2) utiliser des resources Smarty (register_resource). Il ne semble pas y avoir de limite sur la taille des noms de templates, on peut se servir de $content comme nom de template et utiliser une fonction qui recopie ce nom dans la source. Ainsi, il n'y a besoin d'utiliser aucun fichier temporaire.
Pour faire encore plus "smarty" tu peux appeler Zend_View::setViewSuffix('tpl') pour utiliser des templates avec l'extension .tpl.
Maintenant, as-tu réussi à utiliser le cache (Zend_Cache) avec Smarty employé comme un filtre ? Il semble que les caches de type Output ne fonctionnent tout simplement pas lorsqu'un filtre est défini.
Hors ligne
ne pas utiliser le @ c'est très consommateur
il suffit de faire un if is_readable(md5($content))
A+JYT
Hors ligne
Salut
Je reviens tout frais d'un petit saut à la montagne, et comme cadeau, je vous ai concocté une version améliorée de ma solution qui, cerise sur le gâteau, n'a plus besoin de passer par des fichiers temporaires. C'est parti !!!!
Fichier : /views/filters/Smartyfilter.php
<?php /** * Class for parsing views with Smarty. * * @author Psykocrash (SERRAJ Younes) * @copyright Copyright (c) 2007 SERRAJ Younes. * @license http://framework.zend.com/license/new-bsd New BSD License */ require_once 'Zend/Filter/Interface.php'; class Zend_View_Filter_Smartyfilter implements Zend_Filter_Interface { /** * Filter to parse data with Smarty. * * @param string $content The data to parse. * @return string The parsed data. */ public function filter($content) { return Zend_Registry::get('Smarty')->fetch('content:' . $content); } } /** * Function that pass template files to Smarty on the fly. * * @author Psykocrash (SERRAJ Younes) * @copyright Copyright (c) 2007 SERRAJ Younes. * @license http://framework.zend.com/license/new-bsd New BSD License */ function Smarty_Resource_Content ($resource_type, $resource_name, &$template_source, &$template_timestamp, &$smarty_obj) { if($resource_type == 'content') { $template_source = $resource_name; $template_timestamp = time(); return true; } else return false; } Zend_Registry::get('Smarty')->default_template_handler_func = 'Smarty_Resource_Content'; ?>
Et pour compléter le tout :
class Zend_Controller_Action_With_Smarty extends Zend_Controller_Action { public function init() { $this->view->addFilter('Smartyfilter'); parent::init(); } }
Merci qui ?
Dernière modification par Psykocrash (28-11-2007 16:24:53)
Hors ligne
Salut,
Ils proposent une solution pour intégrer smarty dans la doc officielle (je me demande quand ils ont ajouté ça...)
http://framework.zend.com/manual/fr/zen … .templates
A+, Philippe
Hors ligne
Elle y est depuis déjà quelques jours, mais est-ce que c'est intégrable dans le Zend_Controller_Action ?
et j'ai le droit de dire que ma solution reste quand même plus simple que la leur ??
Hors ligne
Psykocrash a écrit:
Salut
Je reviens tout frais d'un petit saut à la montagne, et comme cadeau, je vous ai concocté une version améliorée de ma solution qui, cerise sur le gâteau, n'a plus besoin de passer par des fichiers temporaires. C'est parti !!!!
C'est la solution que j'utilisais, mais toujours avec le même soucis : impossible d'utiliser Zend_Cache (output) dans les templates. As-tu une solution ?
Hors ligne
philippe a écrit:
Ils proposent une solution pour intégrer smarty dans la doc officielle (je me demande quand ils ont ajouté ça...)
Au moins depuis cet été, mais quand je l'avais essayé à l'époque je n'avais pas réussi à la faire marcher rapidement, je suis donc passé à ta version, et hop, ca a marché de suite donc je n'ai pas cherché plus loin.
Hors ligne
oui puis elle n'est pas très intéressante car il faut doubler le boulot faire et un script phtml et un fichier tpl, dan sla solution que j'utilise je remplace simplement le système de vues utilisant phtml part un autre utilisant smarty et ce sans rien changer dans les contrôleurs
par contre pour mes appli l'usage de cache n'est pas pertinent très très peu de partie non dynamique dans mes écrans
A+jyt
Hors ligne
jedisct1 a écrit:
Psykocrash a écrit:
Salut
Je reviens tout frais d'un petit saut à la montagne, et comme cadeau, je vous ai concocté une version améliorée de ma solution qui, cerise sur le gâteau, n'a plus besoin de passer par des fichiers temporaires. C'est parti !!!!C'est la solution que j'utilisais, mais toujours avec le même soucis : impossible d'utiliser Zend_Cache (output) dans les templates. As-tu une solution ?
Si je devais utiliser le cache, ce qui n'est pas le cas concernant l'application que je code en ce moment, j'utiliserais ceci :
http://framework.zend.com/manual/fr/zen … tends.html
(Voir la section 4.3.2. : Zend_Cache_Frontend_Output)
Hors ligne
Psykocrash a écrit:
Si je devais utiliser le cache, ce qui n'est pas le cas concernant l'application que je code en ce moment, j'utiliserais ceci :
http://framework.zend.com/manual/fr/zen … tends.html
(Voir la section 4.3.2. : Zend_Cache_Frontend_Output)
Oui mais justement ça semble être désactivé dès qu'un filtre est ajouté à la vue.
Hors ligne
Je n'ai rien trouvé à ce sujet dans la documentation, et comme je n'y ai jamais touché je ne te serais pas d'une grande aide. Mais si tu n'arrives pas à utiliser le cache de Zend... peut être que tu peux utiliser celui de Smarty ?
Hors ligne