PHP 基于Yii框架中使用smarty模板的方法详解


Posted in PHP onJune 13, 2013

第一种方法
按照YII系统的办法生成视图觉得有点麻烦,觉得用smarty更省事。尝试着把smarty模板加进来了。

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;//模板路径
}

主要一个问题是自动加载类执行冲突的问题
YII注册了一个自动加载类spl_autoload_register(array('YiiBase','autoload')),SMARTY也注册了一个自动加载类,spl_autoload_register('smartyAutoload'),YII 注册在前,这样在遇到一个类名的时候,先执行的是YII的自定义自动加载类的函数,对应SMARTY里的每个类名而言,也是先调用YII的自动加载类的函 数,但是如果不符合YII自动加载的条件的话,就会执行SMARTY的自动加载类的函数,然而,SMARTY的类名在自动加载类的时候,确符合了YII自 动加载类的逻辑语句,结果就是YII使用Include语句要包含的类肯定找不到。
解决的办法是:当SMARTY的类自动加载的时候,跳出在YII定义的自动加载函数,这样就会执行SMARTY的加载函数。
具体实现是,修改YIIBase类里面的autoload函数,增加如下代码
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自动加载类代码
}

这样就可以在每个Action里使用smarty模板了。
public function actionIndex(){
$this->_smarty->assign('test', '测试');
$this->_smarty->display('create.html');
}

第二种方法:
在protected下的extensions文件夹放入smarty模板插件,并建立CSmarty类文件,内容如下
<?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() {}  
    }  
    ?>

然后建立samrty所需的template_c,cache等文件夹。
接下来是配置部分
打开protected/config/main.php在components数组中加入
'smarty'=>array(
    'class'=>'application.extensions.CSmarty',
),

最后在action中直接用Yii::app()->smarty就可以试用smarty了。如果每次在action中使用Yii::app()->smarty比较麻烦的话,可以在components下的Controller中可以加入
protected $smarty = '';
protected function init() {
       $this->smarty = Yii::app()->smarty;
 }

然后在action中就直接可以用$this->smarty使用smarty了。
PHP 相关文章推荐
特详细的PHPMYADMIN简明安装教程
Aug 01 PHP
php 404错误页面实现代码
Jun 22 PHP
elgg 获取文件图标地址的方法
Mar 20 PHP
drupal 代码实现URL重写
May 04 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
Yii框架上传图片用法总结
Mar 28 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
PHP迭代器和生成器用法实例分析
Sep 28 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
Jun 13 #PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
Jun 13 #PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 #PHP
深入php socket的讲解与实例分析
Jun 13 #PHP
PHP数据类型的总结分析
Jun 13 #PHP
如何用C语言编写PHP扩展的详解
Jun 13 #PHP
探讨:如何编写PHP扩展
Jun 13 #PHP
You might like
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
使用php来实现网络服务
2009/09/15 PHP
php开启openssl的方法
2014/05/15 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
laravel model 两表联查示例
2019/10/24 PHP
jQuery 获取对象 定位子对象
2010/05/31 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
python中怎么表示空值
2020/06/19 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
应届生护士求职信
2013/11/01 职场文书
数学检讨书1000字
2014/02/24 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
春节慰问简报
2015/07/21 职场文书
员工旷工检讨书
2015/08/15 职场文书
学生会主席任命书
2015/09/21 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python