Navigation

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Philippe Le Van (@plv) Dernière mise à jour : 09 August 2007

Utiliser smarty avec le ZF

Introduction

Ce tutoriel suppose que vous connaissez déjà les technologies Smarty et Zend Framework.

Smarty est un moteur de template en PHP. Il est simple et intuitif et permet à un graphiste de faire le design d'un site dynamique grâce à une très bonne séparation du code et des pages HTML d'un site.

Le Zend Framework apporte déjà un système de vue (avec Zend_View), mais il n'est pas aussi simple et intuitif à utiliser pour des graphistes, et il sépare beaucoup moins bien la partie graphique de la partie code d'un projet.

Ce tutoriel indique comment utiliser une classe Kitpages_View_Smarty en remplacement de la classe Zend_View afin d'utiliser smarty comme moteur de rendu pour le Zend Framework.

La classe Kitpages_View_Smarty

Voilà le code de la classe Kitpages_View_Smarty qui va arriver en remplacement de la classe Zend_View.

Cette classe implémente l'interface Zend_View_Interface et permet de relier de façon transparente le code de votre application avec smarty.

Toutes les méthodes de Zend_View_Interface sont codées. On peut donc utiliser Kitpages_View_Smarty de façon transparente à la place de Zend_View, par contre, toutes les données envoyées à la vue sont en fait envoyées à smarty.

Nous verrons dans le paragraphe suivant comment utiliser cette vue.

<?php
/*
 * Created on 20 juin 07
 *
 * @author Philippe Le Van (http://www.kitpages.fr)
 * @copyright 2005-2007
 */
Zend_Loader::loadClass("Zend_View_Interface");
 
class Kitpages_View_Smarty implements Zend_View_Interface {
 
    protected $_smarty = null;
    /**
     * Sets the template engine object
     *
     * @return smarty object
     */
    public function setEngine($smarty) {
        $this->_smarty = $smarty;
    }
    /**
     * Return the template engine object, if any
     * @return mixed
     */
    public function getEngine() {
        return $this->_smarty;
    }
 
    public function setScriptPath($path) {
        // nothing to do... in smarty...
    }
 
    /**
     * 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)) {
            require_once 'Zend/View/Exception.php';
            throw new Zend_View_Exception(
                'Setting private var is not allowed',
                $this);
        }
        if ($this->_smarty == null) {
            require_once 'Zend/View/Exception.php';
            throw new Zend_View_Exception(
                'Smarty not defined',
                $this);
        }
        $this->_smarty->assign($key,$val);
        return;
    }
 
    public function __get($key) {
        if ('_' == substr($key, 0, 1)) {
            require_once 'Zend/View/Exception.php';
            throw new Zend_View_Exception(
                'Setting private var is not allowed',
                $this);
        }
        if ($this->_smarty == null) {
            require_once 'Zend/View/Exception.php';
            throw new Zend_View_Exception(
                'Smarty not defined',
                $this);
        }
        return $this->_smarty->get_template_vars($key);
    }
 
    /**
     * Allows testing with empty() and
     * isset() to work
     *
     * @param string $key
     * @return boolean
     */
    public function __isset($key) {
        $vars = $this->_smarty->get_template_vars();
        return isset($vars[$key]);
    }
 
    /**
     * Allows unset() on object properties to work
     *
     * @param string $key
     * @return void
     */
    public function __unset($key) {
        $this->_smarty->clear_assign($key);
    }
 
    /**
     * Assign variables (other method)
     *
     */
    public function assign($spec, $value = null) {
        if (!is_array($spec)) {
            $spec = array($spec=>$value);
        }
        foreach ($spec as $key=>$val) {
            if ('_' == substr($key, 0, 1)) {
                require_once 'Zend/View/Exception.php';
                throw new Zend_View_Exception(
                    'Setting private var is not allowed',
                    $this);
            }
            if ($this->_smarty == null) {
                require_once 'Zend/View/Exception.php';
                throw new Zend_View_Exception(
                    'Smarty not defined', $this);
            }
            $this->_smarty->assign($key,$val);
        }
        return;
 
    }
 
    /**
     * 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() {
        $this->_smarty->clear_all_assign();
    }
 
    /**
     * Processes a view script and returns the output.
     *
     * @param string $name The script script name to process.
     * @return string The script output.
     */
    public function render($name) {
        return $this->_smarty->fetch($name);
    }
 
    /**
     * Retrieve all view script paths
     * unused (smarty...)
     * @return array
     */
    public function getScriptPaths() {}
 
    /**
     * Set a base path to all view resources
     * unused (smarty...)
     * @param  string $path
     * @param  string $classPrefix
     * @return void
     */
    public function setBasePath($path, $classPrefix='Zend_View'){
    }
 
    /**
     * Add an additional path to view resources
     * unused (smarty...)
     * @param  string $path
     * @param  string $classPrefix
     * @return void
     */
    public function addBasePath($path, $classPrefix='Zend_View'){
    }
 
}
?>

Utiliser Kitpages_View_Smarty à la place de Zend_View

Pour utiliser Kitpages_View_Smarty, il faut suivre les étapes suivantes :

  • Désactiver le ViewRenderer
  • Créer une instance de smarty
  • Créer une instance de Kitpages_View_Smarty
  • Indiquer que Kitpages_View_Smarty doit utiliser l'instance de smarty créée en 2.
  • Indiquer au controller la vue à utiliser à l'aide d'un helper

Dans index.php, on arrive au code suivant (à insérer avant le dispatch) :

<?php
// [...]
$controller->setParam("noViewRenderer",true);
 
// initialiser smarty
include_once "Smarty.class.php";
$smarty = new Smarty();
$smarty->template_dir = TEMPLATE_DIR.'/views/scripts/';
$smarty->compile_dir = LOG_DIR.'/smarty/templates_c/';
$smarty->config_dir = LOG_DIR.'/smarty/configs/';
$smarty->cache_dir = LOG_DIR.'/smarty/cache/';
 
// init viewRenderer
Zend_Loader::loadClass("Kitpages_View_Smarty");
$view = new Kitpages_View_Smarty();
$view->setEngine($smarty);
 
// initialiser le helper
Zend_Loader::loadClass(
    "Kitpages_Controller_Action_Helper_ViewManager"
);
$viewManager = new Kitpages_Controller_Action_Helper_ViewManager();
$viewManager->setView($view);
Zend_Controller_Action_HelperBroker::addHelper($viewManager);
 
//[...]
?>

Code du helper

Voilà le code du helper... (il est assez basique.)

<?php
/*
 * Created on 20 juin 07
 *
 * @author Philippe Le Van (http://www.kitpages.fr)
 * @copyright 2005-2007
 */
class Kitpages_Controller_Action_Helper_ViewManager
    extends Zend_Controller_Action_Helper_Abstract {
    private $_view = null;
    public function setView($view) {
        $this->_view = $view;
    }
    public function init()
    {
        $this->getActionController()->view = $this->_view;
    }
}
?>

Utiliser la vue dans une action

Pour utiliser la vue dans une action, on utilise les méthodes standard du Zend Framework:

<?php
Zend_Loader::loadClass("Zend_Controller_Action");
class IndexController extends Zend_Controller_Action {
    public function indexAction() {
        $this->view->message = "test de message";
        echo $this->view->render("index/index.tpl");
    }
}
?>

La vue elle même : un template smarty

La vue est donc un template smarty on ne peut plus standard :

<html>
<body>
Bonjour, voilà le message en paramètre :<br/>
{$message}
</body>
</html>

Conclusion

J'espère que ce tutoriel vous aidera si vous souhaitez faire cohabiter smarty et le Zend Framework.

N'hésitez pas à me signaler toute erreur dans ce tutorial.

Commentaires

Ajouter un commentaire