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 相关文章推荐
一个用于MySQL的PHP XML类
Oct 09 PHP
PHP4.04简明安装
Oct 09 PHP
动态生成gif格式的图像要注意?
Oct 09 PHP
解决中英文字符串长度问题函数
Jan 16 PHP
php执行sql语句的写法
Mar 10 PHP
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 PHP
PHP中开启gzip压缩的2种方法
Jan 31 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
分享php邮件管理器源码
Jan 06 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 PHP
PHP迭代器和生成器用法实例分析
Sep 28 PHP
php命令行模式代码实例详解
Feb 26 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
PHP版 汉字转码的实现详解
2013/06/09 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
Dom 是什么的详细说明
2010/10/25 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
js编写选项卡效果
2017/05/23 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
基于python的汉字转GBK码实现代码
2012/02/19 Python
python测试驱动开发实例
2014/10/08 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
局域网定义和特性
2016/01/23 面试题
酒店门卫岗位职责
2013/12/29 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
视光学专业自荐信
2014/06/24 职场文书
2014年向国旗敬礼活动总结
2014/09/27 职场文书
团队会宣传标语
2014/10/09 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
2014年销售经理工作总结
2014/12/01 职场文书
工程部文员岗位职责
2015/02/04 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
Node与Python 双向通信的实现代码
2021/07/16 Javascript