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