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 相关文章推荐
中英文字符串翻转函数
Dec 09 PHP
将文件夹压缩成zip文件的php代码
Dec 14 PHP
探讨:如何通过stats命令分析Memcached的内部状态
Jun 14 PHP
php5.5新数组函数array_column使用
Jul 08 PHP
在Win7 中为php扩展配置Xcache
Oct 08 PHP
php实现根据IP地址获取其所在省市的方法
Apr 30 PHP
php获取当前页面完整URL地址
Dec 30 PHP
浅谈PHP命令执行php文件需要注意的问题
Dec 16 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
零基础php编程好学吗
Oct 11 PHP
PHP高并发和大流量解决方案整理
Dec 24 PHP
PHP7 其他修改
Mar 09 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
一个颜色轮换的简单例子
2006/10/09 PHP
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
php的一个简单加密解密代码
2014/01/14 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
Python爬取京东的商品分类与链接
2016/08/26 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
一套VC试题
2015/01/23 面试题
一套带网友答案的.NET笔试题
2016/12/06 面试题
初任培训自我鉴定
2013/10/07 职场文书
高一地理教学反思
2014/01/18 职场文书
九年级体育教学反思
2014/01/23 职场文书
房地产项目策划书
2014/02/05 职场文书
党员大会主持词
2014/04/02 职场文书
单位工作证明范文
2014/09/14 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
《三国志》赏析
2019/08/27 职场文书
导游词之塘栖古镇
2019/12/04 职场文书
详解Vue的options
2021/05/15 Vue.js
JS实现简单九宫格抽奖
2022/06/28 Javascript