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 has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
php 求质素(素数) 的实现代码
Apr 12 PHP
php cli模式学习(PHP命令行模式)
Jun 03 PHP
PHP中鲜为人知的10个函数
Feb 28 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
Mar 27 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
Yii2创建控制器(createController)方法详解
Jul 23 PHP
php基于闭包实现函数的自调用(递归)实例分析
Nov 11 PHP
PHP PDO操作MySQL基础教程
Jun 05 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 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
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
python 图片验证码代码分享
2012/07/04 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
代码详解django中数据库设置
2019/01/28 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
python+selenium+PhantomJS抓取网页动态加载内容
2020/02/25 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
高级运动鞋:GREATS
2019/07/19 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
群众路线教育实践活动心得体会
2014/03/07 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
2016情人节宣传语
2015/07/14 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python