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 类商品秒杀计时实现代码
May 05 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
php字符串分割函数explode的实例代码
Feb 07 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
Dec 02 PHP
分享下php5类中三种数据类型的区别
Jan 26 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
php实现简单爬虫的开发
Mar 28 PHP
PHP中时间加减函数strtotime用法分析
Apr 26 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
Centos7安装swoole扩展操作示例
Mar 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
javascript中length属性的探索
2011/07/31 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
js实现的切换面板实例代码
2013/06/17 Javascript
Jquery多选框互相内容交换的实例代码
2013/07/04 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
javascript定时器完整实例
2015/02/10 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
ES6新数据结构Map功能与用法示例
2017/03/31 Javascript
获取url中用&amp;隔开的参数实例(分享)
2017/05/28 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
python字典排序实例详解
2015/05/20 Python
python基础知识小结之集合
2015/11/25 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
运行python提示no module named sklearn的解决方法
2020/11/29 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
2014年中学生检讨书大全
2014/10/09 职场文书
Pillow图像处理库安装及使用
2022/04/12 Python