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实现框架(一)
Oct 09 PHP
隐藏你的.php文件的实现方法
Mar 19 PHP
php md5下16位和32位的实现代码
Apr 09 PHP
php 动态执行带有参数的类方法
Apr 10 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
基于PHP生成简单的验证码
Jun 01 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
zend框架实现支持sql server的操作方法
Dec 08 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
laravel admin实现分类树/模型树的示例代码
Jun 10 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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
web前端开发也需要日志
2010/12/09 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
Less 安装及基本用法
2018/05/05 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
javascript实现数字时钟效果
2021/02/06 Javascript
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
win10系统中安装scrapy-1.1
2016/07/03 Python
Python 查看文件的读写权限方法
2018/01/23 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
读群众路线心得体会
2014/03/07 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
爱心捐款感谢信
2015/01/20 职场文书
党员自我评价范文2015
2015/03/03 职场文书
具结保证书范本
2015/05/11 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书
Redis命令处理过程源码解析
2022/02/12 Redis