Hi, I want to share about smarty view renderer that made by samdark (thanks to samdark)
http://www.yiiframework.com/extension/smarty-view-renderer/
but when I use it, it have a bug I thing, the variable that will used to be displayed in smarty template must pass or declared through controller.
eg:
in protected/components/Controller.php
Class Controller extends CController {
public $title;
public $body;
// etc…
}
then after we declare variable in controller we can use it in smarty template with:
{$this->title} or {$this->body}
it is works fine, but I thing it is not simple way to implement. because we must declared some var before.
I have made some change into SmartyViewRenderer to get more easly in implementation.
so my SmartyViewRenderer Script changed into like this
<?php
/**
* Smarty renderer for Yii
*
* Copy latest version of Smarty (libs contents) to vendors/Smarty/.
*
* Add the following to your config file 'components' section:
*
* 'viewRenderer'=>array(
* 'class'=>'application.extensions.Smarty.CSmartyViewRenderer',
* 'fileExtension' => '.tpl',
* //'pluginsDir' => 'application.smartyPlugins',
* //'configDir' => 'application.smartyConfig',
* ),
*
* @author Alexander Makarov <sam@rmcreative.ru>
* @link http://www.yiiframework.com/
* @link http://www.smarty.net/
*
* @version 0.9
*/
class CSmartyViewRenderer extends CApplicationComponent implements IViewRenderer {
public $fileExtension='.html';
public $filePermission=0755;
public $pluginsDir = null;
public $configDir = null;
private $smarty;
/**
* Component initialization
*/
function init(){
Yii::import('application.vendors.*');
require_once('Smarty/Smarty.class.php');
$this->smarty = new Smarty();
$this->smarty->template_dir = Yii::app()->getViewPath();
$compileDir = Yii::app()->getRuntimePath().'/smarty/compiled/';
// create compiled directory if not exists
if(!file_exists($compileDir)){
mkdir($compileDir, $this->filePermission, true);
}
$this->smarty->compile_dir = $compileDir;
$this->smarty->plugins_dir[] = Yii::getPathOfAlias('application.vendors.Smarty.plugins');
if(!empty($this->pluginsDir)){
$this->smarty->plugins_dir[] = Yii::getPathOfAlias($this->pluginsDir);
}
if(!empty($this->configDir)){
$this->smarty->config_dir = Yii::getPathOfAlias($this->configDir);
}
$this->smarty->assign("TIME",sprintf('%0.5f',Yii::getLogger()->getExecutionTime()));
$this->smarty->assign("MEMORY",round(Yii::getLogger()->getMemoryUsage()/(1024*1024),2)." MB");
}
//I add assign function
public function assign($k,$v){
$this->smarty->assign($k,$v);
}
/**
* 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) {
// current controller properties will be accessible as {this.property}
//$data['this'] = $context;
// check if view file exists
if(!is_file($sourceFile) || ($file=realpath($sourceFile))===false)
throw new CException(Yii::t('yii','View file "{file}" does not exist.', array('{file}'=>$sourceFile)));
//assign data
// ini ternyata masalahnya kalo dipake maka untuk akses variabel menggunakan $this
//$this->smarty->_tpl_vars = $data;
$this->assign('content',$data['content']); //and I add this script
$this->assign('this',$context); //and I add this script
return $this->smarty->fetch($sourceFile);
}
}
so to use this further. eg: in your action
public function actionIndex(){
Yii::app()->getViewRenderer()->assign('title',"My Title");
$this->render('index');
}
so in view file: you just write {$title} to display
I hope will be useful for everyone.
thank for all and sorry about my english if hard to understand <img src='http://www.yiiframework.com/forum/public/style_emoticons/default/biggrin.gif' class='bbc_emoticon' alt=':D' />