Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-05-2010 15:56:48

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

[Zend_Layout][1.10] Utiliser les helpers de vue dans template Smarty ?

Bonjour à tous,

Je débute avec Zend Framework et en intégrant Smarty avec Zend je me heurte à un problème.

En fait, j'ai une classe qui implémente Zend_View_Interface et se sert de Smarty. Dans le Bootstrap, j'ai le code suivant pour initialiser ma vue (j'utilise Zend_Layout).

Code:

    /**
     * Initialise la vue : Smarty.
     */
    protected function _initView()
    {
        // Créé la vue Smarty
        $view = new Sl_View_Smarty($this->getOption('smarty'));
        
        // Définit la variable définissant le chemin vers les scripts de vue
        $view->viewPath = $view->getEngine()->template_dir;
        
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
        $viewRenderer->setView($view)
                     ->setViewBasePathSpec($view->getEngine()->template_dir)
                     ->setViewScriptPathSpec(':controller/:action.:suffix')
                     ->setViewScriptPathNoControllerSpec(':action.:suffix')
                     ->setViewSuffix('tpl');
        
        $layoutOptions = $this->getOption('layout');
        
        //Définit l'inflecteur à utiliser par Zend_Layout
        $inflector = new Zend_Filter_Inflector(':script.:suffix');
        $inflector->addRules(array(':script' => array('Word_CamelCaseToDash', 'StringToLower'),
                                                      'suffix'  => $viewRenderer->getViewSuffix()));
         
        // Initialise les helpers MVC pour Zend_Layout
        Zend_Layout::startMvc(array('layoutPath' => $layoutOptions['layoutPath'],
                                    'view' => $view,
                                    'contentKey' => $layoutOptions['contentKey'],
                                    'inflector' => $inflector));

        
        return $view;
    }

Dans mon template 'layout.tpl', j'ai :

Code:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <title>{$pageTitle}</title>
    </head>

    <body>
        {* Entête de la page *}
        {include file="header.tpl"}
        <h1>Layout</h1>
        
        <p>
            <!-- Ici je veux afficher le contenu de la page qui correspond au script de l'action en cours
                   'index/index.tpl' par exemple  -->
            <!-- La syntaxe ici n'est pas la bonne car parsée par Smarty mais c'est l'équivalent utilisable
                   par Smarty que je souhaiterais connaitre -->
            {$this->layout()->content}
        </p>
        
    </body>
</html>

Je vois dans les fichiers de templates compilés par Smarty que 'layout.tpl', 'header.tpl' et 'index.tpl' sont bien compilés. Alors je me demande s'il y a moyen de récupérer le contenu le contenu de ce fichier pour l'afficher ?

Je sais que Google est mon ami et je n'ai pas manqué à faire appel à lui wink, en vain sad
Je me suis dis que j'avais plus de chance de faire appel à l'aide généreuse que pourrait me proposer les membres de ce forum big_smile

Au passage, si quelqu'un avait un moyen super d'intégrer Smarty à Zend correctement en conservant l'utilisation des aides de vue et de l'esprit Zend_Layout, je suis preneur smile

Hors ligne

 

#2 23-05-2010 08:27:53

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

Re: [Zend_Layout][1.10] Utiliser les helpers de vue dans template Smarty ?

Je n'ai jamais utilisé cette méthode pour intégrer smarty, mais elle me semble plus logique celle de la doc officielle (ou la mienne).
http://piranhaworld.free.fr/integrer-sm … ework.html

A+, Philippe


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

Hors ligne

 

#3 24-05-2010 15:01:36

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Layout][1.10] Utiliser les helpers de vue dans template Smarty ?

J'avais déjà vu cet article parmi tout un tas d'autres ; mais il y en a tellement que je ne savais pas trop lequel suivre.
Merci pour vos conseils, je vais suivre celui-ci !

Hors ligne

 

#4 25-05-2010 10:26:06

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Layout][1.10] Utiliser les helpers de vue dans template Smarty ?

J'ai mis en place la solution et elle fonctionne bien. Mais seulement voilà, je perds le système de Layout sad

J'ai vu cet article aussi Implementing Zend Layout and Smarty using Zend Framework MVC | anders.tyckr.com mais cela me paraît un peu complexe à mettre en place. De plus, l'article a plus de 2 ans. Est-ce selon vous la bonne solution pour intégrer proprement Smarty à Zend tout en conservant la gestion des aides de vues et de Zend_Form ?

N'y aurait-il pas de solution plus récentes et plus simple ? Selon-vous Smarty est-il la bonne solution pour gérer un système de layouts avec Zend Framework 1.10 ?

Hors ligne

 

#5 01-06-2010 10:41:02

rbittel
Nouveau membre
Date d'inscription: 01-06-2010
Messages: 2

Re: [Zend_Layout][1.10] Utiliser les helpers de vue dans template Smarty ?

J'ai trouvé une solution qui fonctionne :
J'ai récupérer la version Zend_View_Smarty : http://framework.zend.com/manual/en/zen … ripts.html
Je l'ai modifiée pour qu'elle étende la classe Smarty (class Zend_View_Smarty extends Smarty implements Zend_View_Interface )

Code:

<?php
include_once 'Smarty/Smarty.class.php';

class Zend_View_Smarty extends Smarty implements Zend_View_Interface {

   

    /**
     * Constructor
     *
     * @param string $tmplPath
     * @param array $extraParams
     * @return void
     */
    public function __construct($tmplPath = null, $extraParams = array()) {
   
        if (null !== $tmplPath) {
            $this->setScriptPath($tmplPath);
        }

        foreach ($extraParams as $key => $value) {
            $this->$key = $value;
        }
  
    }

    /**
     * Return the template engine object
     *
     * @return Zend_View_Smarty
     */
    public function getEngine() {
        
        return $this;
    }

    /**
     * Set the path to the templates
     *
     * @param string $path The directory to set as the path.
     * @return void
     */
    public function setScriptPath($path) {
        if (is_readable($path)) {
           
            $this->template_dir = $path;
            return;
        }

        throw new Exception('Invalid path provided');
    }

    /**
     * Retrieve the current template directory
     *
     * @return string
     */
    public function getScriptPaths() {
        return array($this->template_dir);
    }

    /**
     * Alias for setScriptPath
     *
     * @param string $path
     * @param string $prefix Unused
     * @return void
     */
    public function setBasePath($path, $prefix = 'Zend_View') {
        return $this->setScriptPath($path);
    }

    /**
     * Alias for setScriptPath
     *
     * @param string $path
     * @param string $prefix Unused
     * @return void
     */

    public function addBasePath($path, $prefix = 'Zend_View') {
        return $this->setScriptPath($path);
    }

    /**
     * Assign a variable to the template
     *
     * @param string $key The variable name.
     * @param mixed $val The variable value.
     * @return void
     */
    public function __set($key, $val) {
        parent::assign($key, $val);
    }

    /**
     * Allows testing with empty() and isset() to work
     *
     * @param string $key
     * @return boolean
     */
    public function __isset($key) {
        return (null !== parent::get_template_vars($key));
    }

    /**
     * Allows unset() on object properties to work
     *
     * @param string $key
     * @return void
     */
    public function __unset($key) {
        parent::clear_assign($key);
    }

    /**
     * Assign variables to the template
     *
     * Allows setting a specific key to the specified value, OR passing
     * an array of key => value pairs to set en masse.
     *
     * @see __set()
     * @param string|array $spec The assignment strategy to use (key or
     * array of key => value pairs)
     * @param mixed $value (Optional) If assigning a named variable,
     * use this as the value.
     * @return void
     */
    public function assign($spec, $value = null) {
   
        if (is_array($spec)) {
            parent::assign($spec);
            return;
        }

        parent::assign($spec, $value);
    }

    /**
     * Clear all assigned variables
     *
     * Clears all variables assigned to Zend_View either via
     * {@link assign()} or property overloading
     * ({@link __get()}/{@link __set()}).
     *
     * @return void
     */
    public function clearVars() {
        parent::clear_all_assign();
    }

    /**
     * Processes a template and returns the output.
     *
     * @param string $name The template to process.
     * @return string The output.
     */
    public function render($name) {
        // Assign layout to view
        $layout =  Zend_Layout::getMvcInstance();
        parent::assign('layout', $layout);

        return parent::fetch($name);
    }


}

Dans le layout.tpl on récupère le content par  {$layout->content}

Hors ligne

 

#6 01-06-2010 11:01:24

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Layout][1.10] Utiliser les helpers de vue dans template Smarty ?

Merci rbittel pour ta solution. Je m'empresse de la tester smile

Hors ligne

 

#7 02-06-2010 14:16:46

rbittel
Nouveau membre
Date d'inscription: 01-06-2010
Messages: 2

Re: [Zend_Layout][1.10] Utiliser les helpers de vue dans template Smarty ?

J'ai due rajouter une méthode pour pouvoir appeler les helper :

Code:

class Zend_View_Smarty extends Smarty implements Zend_View_Interface {
  .......

 /**
     * Method to call zend view helpers
     * @param <type> $method
     * @param <type> $arguments
     * @return <type> retur
     */
    public function __call($method, $arguments){
       
        if(isset($this->_tpl_vars[$method] ) ){
          
            $object = $this->_tpl_vars[$method];
            $class = new ReflectionObject($object);
            $methode = $class->getMethod($method);
            $result = $methode->invokeArgs($object,$arguments);
            return $this->_tpl_vars[$method];

        }else{
           
           $classname = "Zend_View_Helper_".ucfirst($method);
          
           if(class_exists  ( $classname)){
               
                $object = new $classname();
                $class = new ReflectionObject($object);
                $methode = $class->getMethod($method);
                $result = $methode->invokeArgs($object,$arguments);

                $this->_tpl_vars[$method] = $object;
                return $this->_tpl_vars[$method];
           }else{
               throw new Zend_View_Exception("$classname Dont't exist in current application");
           }

            
        }
        
    }
   ....
}

Dans ton Bootstrap.php par exemple

Code:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{
  ....

  protected function _initViewHelpers()
    {

        $layout =  Zend_Layout::getMvcInstance();
        $view = $layout->getView();
        $view->doctype('XHTML1_STRICT');
        $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
        $view->headTitle(' Tutoriel Zend Framework');
        
      
        
    }

....
}

Ensuite, dans la vue layout.tpl

Code:

{$doctype}
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
       
        {$headMeta}
        {$headTitle}
    </head>

    <body>
        
        <h1>Layout</h1>

        <p>
          
         {$layout->content}
         
        </p>

    </body>
</html>

Dernière modification par rbittel (02-06-2010 14:17:37)

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