Home >Backend Development >PHP Tutorial >Detailed explanation of how to use smarty templates in PHP based on Yii framework
The first method
It is a bit troublesome to generate views according to the YII system method, and I think it is easier to use smarty. Tried adding smarty templates.
date_default_timezone_set("PRC"); class PlaceController extends CController { protected $_smarty; function __construct(){ parent::__construct('place');//需要一个参数来调用父类的构造函数,该参数为控制器ID $path = Yii::getPathOfAlias('application');//获得protected文件夹的绝对路径 include (dirname($path).DIRECTORY_SEPARATOR.'Smarty'.DIRECTORY_SEPARATOR.'Smarty.class.php');//smarty所在路径 $this->_smarty = new Smarty(); $this->_smarty->template_dir = dirname($path).DIRECTORY_SEPARATOR.'template'.DIRECTORY_SEPARATOR;//模板路径 }
The main problem is the execution conflict of automatically loaded classes.
YII registered an autoloading class spl_autoload_register(array('YiiBase','autoload')), SMARTY also registered an autoloading class, spl_autoload_register('smartyAutoload'), YII registered first, so when encountering an When specifying a class name, YII's custom auto-loading class function is executed first. For each class name in SMARTY, YII's auto-loading class function is also called first. However, if the conditions for YII auto-loading are not met, If so, SMARTY's auto-loading class function will be executed. However, SMARTY's class name does conform to the logical statement of YII's auto-loading class when automatically loading the class. The result is that YII will definitely not be able to find the class to be included using the Include statement. arrive.
The solution is: when the SMARTY class is automatically loaded, jump out of the automatic loading function defined in YII, so that the SMARTY loading function will be executed.
The specific implementation is to modify the autoload function in the YIIBase class and add the following code
public static function autoload($className) { // use include so that the error PHP file may appear if(preg_match('/smarty/i', $className)){ //只要类名包含smarty的,无论大小写,都返回,这样就跳出了YII自动加载类而去执行 SMARTY的自动加载类函数了 return; } YII自动加载类代码 }
so that the smart template can be used in each Action.
public function actionIndex(){ $this->_smarty->assign('test', '测试'); $this->_smarty->display('create.html'); }The second method:
Put the smarty template plug-in in the extensions folder under protected and create a CSmarty class file with the following content
<?php require_once(Yii::getPathOfAlias('application.extensions.smarty').DIRECTORY_SEPARATOR.'Smarty.class.php'); define('SMARTY_VIEW_DIR', Yii::getPathOfAlias('application.views')); class CSmarty extends Smarty { const DIR_SEP = DIRECTORY_SEPARATOR; function __construct() { parent::__construct(); $this->template_dir = SMARTY_VIEW_DIR; $this->compile_dir = SMARTY_VIEW_DIR.self::DIR_SEP.'template_c'; $this->caching = true; $this->cache_dir = SMARTY_VIEW_DIR.self::DIR_SEP.'cache'; $this->left_delimiter = '<!--{'; $this->right_delimiter = '}-->'; $this->cache_lifetime = 3600; } function init() {} } ?>
Then create the template_c required by samrty , cache and other folders.
The next step is the configuration part
Open protected/config/main.php and add it to the components array
'smarty'=>array( 'class'=>'application.extensions.CSmarty', ),
Finally, use Yii::app()->smarty directly in the action to try it out Smarty now. If it is troublesome to use Yii::app()->smarty every time in the action, you can add
protected $smarty = ''; protected function init() { $this->smarty = Yii::app()->smarty; }
to the Controller under components and then use $this-> directly in the action. smarty uses smarty.
For more detailed explanations of how to use smarty templates in PHP based on the Yii framework, please pay attention to the PHP Chinese website!