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读取IMAP邮件
Oct 09 PHP
发挥语言的威力--融合PHP与ASP
Oct 09 PHP
javascript,php获取函数参数对象的代码
Feb 03 PHP
关于尾递归的使用详解
May 02 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 PHP
php批量删除cookie的简单实现方法
Jan 26 PHP
php实现session自定义会话处理器的方法
Jan 27 PHP
PHP下载生成的csv文件及问题总结
Aug 06 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
Apr 07 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
PHP常用字符串函数小结(推荐)
Aug 05 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
Oct 03 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 IF ELSE简化/三元一次式的使用
2011/08/22 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
python使用str &amp; repr转换字符串
2016/10/13 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
Python程序暂停的正常处理方法
2019/11/07 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
实体的生命周期
2013/08/31 面试题
中学生自我鉴定
2014/02/04 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
政协委员个人总结
2015/03/03 职场文书
企业法人代表证明书
2015/06/18 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
血轮眼轮回眼特效 html+css
2021/03/31 HTML / CSS
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
Golang数据类型和相互转换
2022/04/12 Golang