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 和 MySQL 开发的 8 个技巧
Oct 09 PHP
php下实现伪 url 的超简单方法[转]
Sep 24 PHP
php 变量未定义等错误的解决方法
Jan 12 PHP
php设计模式 Command(命令模式)
Jun 26 PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 PHP
关于初学PHP时的知识积累总结
Jun 07 PHP
使用php统计字符串中中英文字符的个数
Jun 23 PHP
php使用for语句输出三角形的方法
Jun 09 PHP
php判断是否为ajax请求的方法
Nov 29 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
php表单处理操作
Nov 16 PHP
php实例化对象的实例方法
Nov 17 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
Discuz 模板引擎的封装类代码
2008/07/18 PHP
php判断访问IP的方法
2015/06/19 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
python处理中文编码和判断编码示例
2014/02/26 Python
简单谈谈Python流程控制语句
2016/12/04 Python
python实现感知器
2017/12/19 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
导入tensorflow时报错:cannot import name 'abs'的解决
2019/10/10 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
平安工地汇报材料
2014/08/19 职场文书
2014年信访工作总结
2014/11/17 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
工程部部长岗位职责
2015/02/12 职场文书
2015年依法治校工作总结
2015/07/27 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android
Java 多线程协作作业之信号同步
2022/05/11 Java/Android