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 相关文章推荐
一个简单的自动发送邮件系统(一)
Oct 09 PHP
支持oicq头像的留言簿(一)
Oct 09 PHP
PHP页面间参数传递的四种方法详解
Jun 09 PHP
php使用exec shell命令注入的方法讲解
Nov 12 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
php获取用户浏览器版本的方法
Jan 03 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
Jan 05 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 PHP
ThinkPHP中html:list标签用法分析
Jan 09 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
PHP JWT初识及其简单示例
Oct 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
php中namespace use用法实例分析
2016/01/22 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
Yii2 RESTful中api的使用及开发实例详解
2016/07/06 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
php中上传文件的的解决方案
2018/09/25 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
微信小程序webview实现长按点击识别二维码功能示例
2019/01/24 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
python中迭代器(iterator)用法实例分析
2015/04/29 Python
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
python中实现控制小数点位数的方法
2019/01/24 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
python 高阶函数简单介绍
2021/02/19 Python
农林环境专业求职信
2014/03/13 职场文书
高一学生评语大全
2014/04/25 职场文书
村党支部书记承诺书
2014/05/29 职场文书
公司应聘自荐书
2014/06/14 职场文书
医学求职自荐信
2014/06/21 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python
Python实战之疫苗研发情况可视化
2021/05/18 Python