Configurar Smarty en Yii Framework

Smarty Logo

Ayer os comentaba como instalar Yii desde 0. La necesidad de poder añadirle Smarty a este Framework, me hizo dar varias vueltas por Google para ver si alguien lo había resuelto, y después de un rato, llegué a la conclusión de que hasta la fecha, nadie lo había publicado en la red.

Así que, me puse manos a la obra y generé esta pequeña extensión para poder utilizar este gestor de plantillas con Yii. El código creado es:

CSmartyViewRenderer.php

<?php
/**
 * CSmartyViewRenderer class file.
 *
 * @author Manel Pérez
 * @license http://www.yiiframework.com/license/
 */

/**
 * CSmartyViewRenderer implements a view renderer that allows users to use a template syntax similar to SMARTY templates.
 *
 * To use CSmartyViewRenderer, configure it as an application component named "viewRenderer" in the application configuration /protected/config/main.php
 * <pre>
 * array(
 *     'components'=>array(
 *         ......
 *         'viewRenderer'=>array(
 *             'class'=>'CSmartyViewRenderer',
 *         ),
 *     ),
 * )
 * </pre>
 *
 * @author Manel Pérez
 * @version $Id: CSmartyViewRenderer.php 433 2009-03-16 22:59:17Z manel.perez $
 * @package system.web.renderers
 * @since 1.0
 */

require_once "Smarty/Smarty.class.php";

class CSmartyViewRenderer extends CViewRenderer
{
	private $_input;
	private $_output;
	private $_sourceFile;
	private $_smarty;

	function __construct()
	{
		$this->_smarty = new Smarty();
	}

	/**
	 * Parses the source view file and saves the results as another file.
	 * This method is required by the parent class.
	 * @param string the source view file path
	 * @param string the resulting view file path
	 */
	protected function generateViewFile($sourceFile,$viewFile)
	{
		$this->_output = $this->_smarty->get($sourceFile);

		file_put_contents($viewFile,$this->_output);
	}

	/**
	 * Renders a view file.
	 * This method is required by {@link IViewRenderer}.
	 * @param CBaseController the controller or widget who is rendering the view file.
	 * @param string the view file path
	 * @param mixed the data to be passed to the view
	 * @param boolean whether the rendering result should be returned
	 * @return mixed the rendering result, or null if the rendering result is not needed.
	 */
	public function renderFile($context,$sourceFile,$data,$return)
	{
		if(!empty($data)) {
			if (is_array($data) || is_object($data)){
				foreach($data as $key=>$value) {
					if (is_array($value)) {
						if (is_a($value[0], "CActiveRecord")) {
							foreach ($value as $valKey=>$valRec) {
								$att[] = $valRec->getAttributes();
							}

							$this->_smarty->assign($key, $att);
						} else {
							$this->_smarty->assign($key, $value);
						}
					} else {
						$this->_smarty->assign($key, $value);
					}
				}
			} else {
				//GENERIC Data assign
				$this->_smarty->assign("__DATA__", $data);
			}
		}

		if(!is_file($sourceFile) || ($file=realpath($sourceFile))===false)
			throw new CException(Yii::t('yii','View file "{file}" does not exist.',array('{file}'=>$sourceFile)));
		$viewFile=$this->getViewFile($sourceFile);
		if(@filemtime($sourceFile)>@filemtime($viewFile))
		{
			$this->generateViewFile($sourceFile,$viewFile);
			@chmod($viewFile,$this->filePermission);
		}
		return $context->renderInternal($viewFile,$data,$return);
	}
}
?>

¿Cómo hacemos que este código funcione? Aquí os dejo los pasos para hacer que Smarty y Yii vayan de la mano hacia un mundo de color y alegría:

  1. Descargamos el último código estable de la página oficial de Smarty y lo descomprimimos en la carpeta /path/to/application/framework/web/renders/
  2. Damos permisos 777 a la carpeta /path/to/framework/framework/web/renders/Smarty/templates_c
  3. Modificamos el fichero /path/to/framework/[ApplicationName]/protected/config/main.php añadiendo el siguiente código al array:
    'viewRenderer'=>array(
            	'class'=>'CSmartyViewRenderer',
    	),
  4. Por último, le diremos a Yii qual es el nuevo render modificando el archivo /path/to/framework/framework/YiiBase.php, buscamos “‘CPradoViewRenderer'” y dejamos el código de la siguiente manera:
    //'CPradoViewRenderer' => '/web/renderers/CPradoViewRenderer.php',
    'CSmartyViewRenderer' => '/web/renderers/CSmartyViewRenderer.php',

Con esto, deberíamos tener funcionando Smarty en Yii… ahora nos queda modificar nuestros templates para que sigan la sintaxis propuesta por Smarty, y crear nuestros propios plugins que nos permitan interactuar con los helpers del framework.

One thought on “Configurar Smarty en Yii Framework

Comments are closed.