Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-11-2007 16:12:17

Psykocrash
Membre
Date d'inscription: 23-11-2007
Messages: 28

[Article] Intégrer Smarty au Zend Framework

Bonjour tout le monde smile

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 big_smile, 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) :

Code:

<?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 smile

Dernière modification par Psykocrash (23-11-2007 16:15:33)

Hors ligne

 

#2 23-11-2007 17:27:24

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Article] Intégrer Smarty au Zend Framework

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

 

#3 23-11-2007 17:49:16

Psykocrash
Membre
Date d'inscription: 23-11-2007
Messages: 28

Re: [Article] Intégrer Smarty au Zend Framework

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 wink

Hors ligne

 

#4 23-11-2007 17:53:23

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Article] Intégrer Smarty au Zend Framework

Faut chercher dans la rubrique tuto: http://www.kitpages.fr/zf_integrerSmarty.php

Hors ligne

 

#5 23-11-2007 17:55:35

Psykocrash
Membre
Date d'inscription: 23-11-2007
Messages: 28

Re: [Article] Intégrer Smarty au Zend Framework

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

 

#6 23-11-2007 17:57:53

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [Article] Intégrer Smarty au Zend Framework

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


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#7 23-11-2007 17:59:27

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Article] Intégrer Smarty au Zend Framework

Difficile de faire plus clair...

J'ai lu trop vite... la fatigue du vendredi soir...

Hors ligne

 

#8 23-11-2007 18:30:36

Psykocrash
Membre
Date d'inscription: 23-11-2007
Messages: 28

Re: [Article] Intégrer Smarty au Zend Framework

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

 

#9 23-11-2007 19:02:27

Psykocrash
Membre
Date d'inscription: 23-11-2007
Messages: 28

Re: [Article] Intégrer Smarty au Zend Framework

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

 

#10 24-11-2007 10:54:33

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Article] Intégrer Smarty au Zend Framework

suite à plusieurs interventions dans les forum j'ai posté ça sur mon blog
http://sekaijin.ovh.org/?p=13
A+JYT

Hors ligne

 

#11 24-11-2007 19:51:21

Psykocrash
Membre
Date d'inscription: 23-11-2007
Messages: 28

Re: [Article] Intégrer Smarty au Zend Framework

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 :

Code:

<?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 :

Code:

<?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 smile

Amusez vous bien !

Dernière modification par Psykocrash (24-11-2007 20:05:33)

Hors ligne

 

#12 25-11-2007 16:39:08

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Article] Intégrer Smarty au Zend Framework

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

 

#13 26-11-2007 21:36:22

jedisct1
Nouveau membre
Lieu: Paris
Date d'inscription: 26-11-2007
Messages: 3
Site web

Re: [Article] Intégrer Smarty au Zend Framework

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.


--
-Frank.

Hors ligne

 

#14 27-11-2007 09:28:31

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Article] Intégrer Smarty au Zend Framework

ne pas utiliser le @ c'est très consommateur
il suffit de faire un if is_readable(md5($content))

A+JYT

Hors ligne

 

#15 28-11-2007 16:21:31

Psykocrash
Membre
Date d'inscription: 23-11-2007
Messages: 28

Re: [Article] Intégrer Smarty au Zend Framework

Salut smile

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

Code:

<?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 :

Code:

class Zend_Controller_Action_With_Smarty extends Zend_Controller_Action 
{
    public function init()
    {
        $this->view->addFilter('Smartyfilter');
        parent::init();
    }
}

Merci qui ? tongue

Dernière modification par Psykocrash (28-11-2007 16:24:53)

Hors ligne

 

#16 28-11-2007 17:51:06

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [Article] Intégrer Smarty au Zend Framework

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


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#17 28-11-2007 17:58:29

Psykocrash
Membre
Date d'inscription: 23-11-2007
Messages: 28

Re: [Article] Intégrer Smarty au Zend Framework

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 ?? tongue

Hors ligne

 

#18 29-11-2007 08:58:05

jedisct1
Nouveau membre
Lieu: Paris
Date d'inscription: 26-11-2007
Messages: 3
Site web

Re: [Article] Intégrer Smarty au Zend Framework

Psykocrash a écrit:

Salut smile

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 ?


--
-Frank.

Hors ligne

 

#19 29-11-2007 09:58:53

Geoffrey
Membre
Lieu: 63
Date d'inscription: 12-04-2007
Messages: 140
Site web

Re: [Article] Intégrer Smarty au Zend Framework

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

 

#20 29-11-2007 11:18:26

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Article] Intégrer Smarty au Zend Framework

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

 

#21 29-11-2007 14:34:40

Psykocrash
Membre
Date d'inscription: 23-11-2007
Messages: 28

Re: [Article] Intégrer Smarty au Zend Framework

jedisct1 a écrit:

Psykocrash a écrit:

Salut smile

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

 

#22 29-11-2007 15:31:43

jedisct1
Nouveau membre
Lieu: Paris
Date d'inscription: 26-11-2007
Messages: 3
Site web

Re: [Article] Intégrer Smarty au Zend Framework

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.


--
-Frank.

Hors ligne

 

#23 29-11-2007 16:27:41

Psykocrash
Membre
Date d'inscription: 23-11-2007
Messages: 28

Re: [Article] Intégrer Smarty au Zend Framework

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages