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 相关文章推荐
在mysql数据库原有字段后增加新内容
Nov 26 PHP
php添加文章时生成静态HTML文章的实现代码
Feb 17 PHP
解析:使用php mongodb扩展时 需要注意的事项
Jun 18 PHP
php中time()和mktime()方法的区别
Sep 28 PHP
PHP技术开发微信公众平台
Jul 22 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
Mar 22 PHP
php抽象方法和抽象类实例分析
Dec 07 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 PHP
asp.net和php的区别点总结
Oct 10 PHP
laravel 如何实现引入自己的函数或类库
Oct 15 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
多文件上载系统完整版
2006/10/09 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
python连接mongodb密码认证实例
2018/10/16 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
通过cmd进入python的步骤
2020/06/16 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
原装进口全世界:天猫国际
2016/08/03 全球购物
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
消防工作实施方案
2014/06/09 职场文书
党性心得体会
2014/09/03 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技