Configurar Smarty en Yii Framework
Publicado en Frameworks, Programación el 2 de May de 2009 por Manel Pérez MataTags: PHP, Smarty, Yii
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)
-
{
-
foreach($data as $key=>$value) {
-
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);
-
}
-
}
-
-
throw new CException(Yii::t(‘yii’,‘View file "{file}" does not exist.’,array(‘{file}’=>$sourceFile)));
-
$viewFile=$this->getViewFile($sourceFile);
-
{
-
$this->generateViewFile($sourceFile,$viewFile);
-
}
-
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:
- 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/
- Damos permisos 777 a la carpeta /path/to/framework/framework/web/renders/Smarty/templates_c
- Modificamos el fichero /path/to/framework/[ApplicationName]/protected/config/main.php añadiendo el siguiente código al array:
-
‘viewRenderer’=>array(
-
‘class’=>‘CSmartyViewRenderer’,
-
),
-
- 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.














(1 votes, average: 4.00 out of 5)
(4.33 out of 5)
October 11th, 2009 10:44
Hay una manera más correcta de integrar esta clase que he desarrollado con Yii. Aquí os dejo el enlace a la página del fórum de Yii que habla de ello.
http://www.yiiframework.com/forum/index.php?/topic/4424-using-yii-with-smarty/page__view__findpost__p__23593