Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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).
/** * 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 :
<!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 , en vain
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
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
Hors ligne
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
Hors ligne
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
J'ai mis en place la solution et elle fonctionne bien. Mais seulement voilà, je perds le système de Layout
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
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 )
<?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
Merci rbittel pour ta solution. Je m'empresse de la tester
Hors ligne
J'ai due rajouter une méthode pour pouvoir appeler les helper :
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
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
{$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
Pages: 1