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 相关文章推荐
PHP在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
一个php作的文本留言本的例子(五)
Oct 09 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
php下统计用户在线时间的一种尝试
Aug 26 PHP
php启动时候提示PHP startup的解决方法
May 07 PHP
PHP连接SQLServer2005方法及代码
Dec 26 PHP
PHP中提问频率最高的11个面试题和答案
Sep 02 PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 PHP
浅析PHP中的i++与++i的区别及效率
Jun 15 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
May 23 PHP
smarty模板的使用方法实例分析
Sep 18 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
10个实用的PHP正则表达式汇总
2014/10/23 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
基于JQuery的密码强度验证代码
2010/03/01 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
Express.JS使用详解
2014/07/17 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
分享python数据统计的一些小技巧
2016/07/21 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
软件测试工程师结构化面试题库
2016/11/23 面试题
会计电算化专业毕业生自荐信
2013/12/20 职场文书
个人承诺书怎么写
2014/05/24 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
公司活动总结怎么写
2014/06/25 职场文书
体育课外活动总结
2014/07/08 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis