Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour.
Je débute avec ZendFramework et je suis tombé sur une documentation expliquant comment intégrer Smarty à ZF.
J'ai plusieurs fois utilisé PHPTAL, j'avoue que j'apprécie ce moteur de template, et j'aimerai pouvoir l'intégrer à ZF.
Première question : est-ce une bonne idée ?
Seconde question : existe-t'il une doc à ce sujet ?
Si NON à la seconde question :
Troisième question : est-ce possible de se baser sur la doc Smarty/ZF pour intégrer PHPTAL à ZF ?
Merci d'avance
Hors ligne
Bonjour,
A priori, c'est assez simple de te baser sur une documentation ZF & smarty pour l'adapter à PHPTAL.
Tu peux utiliser http://www.kitpages.fr/zf_integrerSmarty.php
ou celui de la doc officielle (mais moins détaillé) : http://framework.zend.com/manual/en/zen … .interface
Cordialement,
Philippe Le Van
Hors ligne
Je te remercie. Je regarderai tout ça ce soir.
Pour revenir à la première question : est-ce une bonne idée ? ou du moins une idée intéressante ? ou une idée qui va me mener droit dans le mur ?
Hors ligne
Je ne connais pas PHPTAL, mais je fais ça avec Smarty... Donc sur le principe, je ne trouve pas que ça soit une mauvaise idée.
Par contre si tu veux utiliser les view helpers du ZF, tu vas devoir complexifier un peu le système pour qu'ils s'intègrent bien (c'est a priori assez simple à faire).
A+, Philippe
Hors ligne
salut j'ai déjà fais ça
fichier /library/Fast/Views
<?php /** * * @author Jean-Yves Terrien * */ Zend_Loader::loadClass('Fast_View'); class Fast_View_Phptal extends Fast_View { private $_tal; protected $_suffix = 'xhtml'; /** * Constructeur * * @param string $tmplPath * @param array $extraParams * @return void */ public function __construct() { parent::__construct(); $this->setScriptPath(dirname(dirname(dirname(dirname(__FILE__)))) . '/application/views/phptal/'); set_include_path(realpath('library/TemplatesEngines/PhpTal') . PATH_SEPARATOR . get_include_path()); require_once 'PHPTAL.php'; // create a new template object $this->_tal = new PHPTAL(); /* @var PHPTAL $template */ } public function getSuffix() { return $this->_suffix; } /** * Assign a variable to the view * * @param string $key The variable name. * @param mixed $val The variable value. * @return void */ public function __set($key, $val) { if ('_' != substr($key, 0, 1)) { #Fastidf_Debug::show('__set '. $key, $val); $this->_tal->$key = $val; return; } throw new Zend_View_Exception('Setting private or protected class members is not allowed', $this); } /** * E_NOTICE for nonexistent values * * @param string $key * @return null */ public function __get($key) { if (isset($this->_tal->$key)) { return $this->_tal->$key; } else { trigger_error('Template\'s key "' . $key . '" does not exist', E_USER_NOTICE); } return null; } public function __isset($key) { $vars = get_object_vars($this->_tal); // TODO : tester récursivement la présence de la clé demandée return true; } public function __unset($key) { unset($this->_tal->$key); } public function clearVars() { $this->_tal = new stdClass(); } /** * Assign variables * */ public function assign($spec, $value = null) { if (!is_array($spec)) { $spec = array($spec=>$value); } foreach ($spec as $key=>$val) { if ('_' == substr($key, 0, 1)) { throw new Zend_View_Exception('Setting private var is not allowed', $this); } if ($this->_tal == null) { throw new Zend_View_Exception('ETS not defined', $this); } $this->_tal->$key = $val; } return; } /** * Includes the view script in a scope with only public $this variables. * * @param string The view script to execute. */ protected function _run() { $name = func_get_arg(0); $this->_tal->setTemplate($name); /* $this->_tal->setTemplate(dirname(dirname($name)) . '/main.xhtml'); $this->_tal->content = $name; $this->_tal->templatesDir = dirname(dirname($name)) . '/'; */ echo $this->_tal->execute(); } }
placer phptal dans /library/TemplatesEngines/PhpTal
voici ma méthode setViewEngine de mon front contrôler dérivé de Zend_Controler_Front
public static function setViewEngine ($name = null) { $className = ucfirst($name); if (null == $className) { $className = 'Zend_View'; $suffix = 'phtml'; } else { if (substr($className, 0, 10) != 'Fast_View_') { $className = 'Fast_View_' . $className; } } try { Zend_Loader::loadClass($className); self::$_instance->_view = new $className(); self::$_instance->_templateEngine = strtolower($name); if (!isset($suffix)) $suffix = self::$_instance->_view->getSuffix(); self::$_instance->_view->setEncoding(Fast_Registry::getParameters()->get('encoding', 'ISO-8859-1')); self::$_instance->_view->setEscape(Fast_Registry::getParameters()->get('escape', 'htmlentities')); $viewManager = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $viewManager->setView(self::$_instance->_view)->setViewSuffix($suffix); } catch (Exception $e) { Zend_Loader::loadClass('Fast_Exception_View'); throw new Fast_Exception_View(Fast_Exception_View::INVALID_ENGINE. $className); } }
elle me permet de choisir mon moteur de template
dans le ini de mes controller (Fast_Controller_Action dérivé de Zend_Controller_Action pour ne pas toujours le réécrire) je fixe le path pour la recherche des fichier de vues (et le maintemplate en effet j'utilise un maintemplate qui inclus des template de contenu)
$this->initView(); if (class_exists('Fast_View')&&($this->view instanceof Fast_View)) { $viewBaseDir = $this->view->getStandardBaseDir(); $sufix = $this->view->getSuffix(); } else { $viewBaseDir = 'script'; $sufix = 'phtml'; } $this->view->setMainTemplate($this->view->getScriptPath(null).'main.'.$sufix); //Ajouter le chemin vers les templates du module pour les contenus $this->view->setScriptPath(dirname($this->getFrontController()->getControllerDirectory($this->_request->getModuleName())) . '/views/'.$viewBaseDir.'/');
il n'y a rien à changer dans les contrôleurs j'utilise phtml, ets smarty, ophp et phptal
sur simple changement d'un paramètre de config c'est l'un ou l'autre des moteur qui est utilisé.
tu peux regarder sur http://sekaijin.ovh.org j'ai posté un article "utiliser le moteur de son choix"
A+JYT
Hors ligne
Allez hop, je n'ai pas encore eu le temps de m'occuper de ça, je m'y mets dès maintenant !
EDIT : Petite question : j'ai appliqué ceci http://framework.zend.com/manual/fr/zen … dular.html pour différencier partie publique et partie privée de mon site.
Est-ce qu'il y a des risques de conflits avec l'adaptation PHPTAL ? Car pour l'instant je bloque avec l'exemple de sekaijin
Dernière modification par neojick (18-04-2008 01:15:34)
Hors ligne
J'ai adapté l'aide de sekaijin pour intégrer PHPTAL, j'ai fais des modifs pour que tout soit hors de la partie accessible via le navigateur, cependant j'ai un dernier soucis par rapport à mon arborescence.
Mes contrôleurs sont dans un dossiers modules, et j'ai deux parties : site et admin
En direct, tout marche très bien pour appeler QUE la partie de site
//Fast_Controller_Front::run(dirname(dirname(__FILE__)) . '/application/modules/site/controllers');
Alors qu'avec setControllerDirectory pour mon arborescence, j'ai un message d'erreur et j'ai l'impression de ne plus passer par la Class Fast de sekaijin
$frontController = Fast_Controller_Front::getInstance(); $frontController->setControllerDirectory(array( 'default' => dirname(dirname(__FILE__)) . '/application/modules/site/controllers', 'admin' => dirname(dirname(__FILE__)) . '/application/modules/admin/controllers' )); $frontController->dispatch();
Voici le message d'erreur qui me fait penser que je ne passe plus dans FAST !
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in C:\xampp\htdocs\monsite\library\ZendFramework\library\Zend\Controller\Dispatcher\Standard.php:249 Stack trace: #0 C:\xampp\htdocs\wmonsite\library\ZendFramework\library\Zend\Controller\Front.php(914): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 C:\xampp\htdocs\monsite\html\index.php(52): Zend_Controller_Front->dispatch() #2 {main} thrown in C:\xampp\htdocs\monsite\library\ZendFramework\library\Zend\Controller\Dispatcher\Standard.php on line 249
Dernière modification par neojick (20-04-2008 12:02:12)
Hors ligne
Je.... crois que j'ai réussi.... !
Suffisais simplement de fusionner les deux :
Fast_Controller_Front::run(array( 'default' => dirname(dirname(__FILE__)) . '/application/modules/site/controllers', 'admin' => dirname(dirname(__FILE__)) . '/application/modules/admin/controllers' ));
Hors ligne