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中的cookie
Nov 26 PHP
PHP编码规范-php coding standard
Mar 16 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
PHP stripos()函数及注意事项的分析
Jun 08 PHP
php实现简单洗牌算法
Jun 18 PHP
解析PHP中一些可能会被忽略的问题
Jun 21 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
Oct 20 PHP
yii2控制器Controller Ajax操作示例
Jul 23 PHP
php实现给二维数组中所有一维数组添加值的方法
Feb 04 PHP
Yii2中添加全局函数的方法分析
May 04 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
Sep 04 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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
jQuery中调用WebService方法小结
2011/03/28 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
js实现自定义路由
2017/02/04 Javascript
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
python 批量修改/替换数据的实例
2018/07/25 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
Html5 localStorage入门教程
2018/04/26 HTML / CSS
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
心得体会范文
2014/01/04 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
护理工作个人总结
2015/03/03 职场文书
卡特教练观后感
2015/06/08 职场文书
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸