PHP Yii框架中使用smarty模板

第一种方法

按照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了。

转载于:https://www.cnblogs.com/jyb2014/p/4121511.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

COM应用实例--获取桌面墙纸路径

COM应用实例--获取桌面墙纸路径&#xff1a;Win32控制台程序(C) /*功能&#xff1a; 获取桌面墙纸的路径&#xff0c;并建立一个该墙纸的快捷方式保存在指定路径说明&#xff1a; COM应用实例, Win32控制台程序 */ #include <iostream> #include <afx.h> #include …

React开发(145):目录规范:

config ├── config.js umi 配置目录 ├── plugin.config.js webpack插件配置目录 └── router.config.js 路由配置目录 src: 静态资源目录: assets 公共组件目录&#xff1a;common 业务组件目录: components 主框架目录&#xff1a;layouts 国际化目录&…

献给网页开发者的20款Firefox插件

毫无疑问&#xff0c;比起其他浏览器&#xff0c;Chrome虽有着明显的优势&#xff0c;但是它的劲敌Firefox却是很多前端攻城师和研发人员的挚爱&#xff0c;为了尽可能地提高用户体验&#xff0c;Firefox的社区在插件开发和运用上有着丰富的经验&#xff0c;说它是网站开发者的…

VC6重载字体对话框,去除颜色下拉框

为了去除字体对话框中的颜色下拉框&#xff0c;我们需要重载字体对话框类&#xff1a;CFontDialog 1. 创建一个MFC Class&#xff0c;继承自CFontDialog: // MyFontDialong.h : header file //// CMyFontDialong dialogclass CMyFontDialong : public CFontDialog {DECLARE_DY…

Mac系统下如何使用命令行方式启动MySQL

首先&#xff0c;先去官网下载MySQL&#xff0c;选择Mac版本的DMG格式的文件。 官网地址为&#xff1a;dev.mysql.com/downloads/mysql/5.7.html 然后下载后&#xff0c;直接双击对应的dmg格式的文件进行安装即可。接下来&#xff0c;我们可以先看下如何在系统偏好设置中启动M…

React开发(146):开发规范

1&#xff0c;编辑器尽量用 VSCode&#xff0c;然后装 Prettier 插件 简单的代码规范 2&#xff0c;缩进2个空格&#xff0c;如果是tab 也设置成2个空格 3&#xff0c;命名时尽量用英文&#xff0c;文件名&#xff0c;组件名等&#xff0c;单词多的可以大写简写。 4&#xff0…

禁止微信公众号页面上下滑动

data(){return {handler: function(e) {e.preventDefault();}, //阻止body滑动} }, methods: {closeTouch: function() {document.getElementsByTagName("body")[0].addEventListener("touchmove", this.handler, { passive: false }); //阻止默认事件}, o…

权限管理系统系列之序言

权限管理系统我相信每个系统都会需要&#xff0c;所以设计一个好的权限管理系统会在系统开发中起到至关重要的作用&#xff0c;节省人力成本和资源&#xff0c;可以不用每次都为权限设计煞费心机。可能每个公司对权限的设计大体相同&#xff0c;略有不同&#xff0c;但是都会不…

linux借助expect完成自动登录

From: http://www.cnblogs.com/sunss/archive/2010/12/23/1914763.html 在工作中&#xff0c;我需要把远程服务器上的文件&#xff0c;拷贝到本地&#xff0c;可是scp的时候必须输入密码&#xff0c;用here文档又不能实现&#xff0c;终于找到一个好东东&#xff0c;expect ,可…

android之隐示意图跳转启动另一个activity

主面板布局&#xff1a;layout/activity_main.xml <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android" android:layout_width"match_parent" android:layout_height"match_parent" android:orientation"…

linux培训课程第六天:ppt以及笔记

第六天授课大纲介绍&#xff1a;第十讲&#xff1a;引导服务器dhcp和NIS这里dhcp服务比较简单,说明一下&#xff0c;首先将dhcp做成功,然后有个dhcp中继,做起来很简单,最主要大家要理解&#xff0c;中继是处在怎样的环境中&#xff0c;你怎样去搭配,这个明白了&#xff0c;下面…

微信公众号 H5 页面中点击一个按钮调起手机的电话拨打功能

1、在H5页面中调起手机的电话拨打功能其实很简单就能实现&#xff1a; <a href"tel:13556891235">点击给我打电话</a>2、在H5页面中调起手机发送短信&#xff1a; <a href"sms:18688888888">发短信</a>3、要想实现点击一个按钮我…

React开发(147):开发注意

## 列表查询做法&#xff1a; 以下查询条件值包括&#xff1a;普通查询和高级查询 1. 首先普通查询和高级查询的值是不相互关联的。 2. 点击查询按钮时会重置 pageIndex 为1&#xff0c;否则查询结果有误差 2. 重置不会重置列表 title 的 sort 和 filter&#xff0c;也不会重置…

中国移动话费查询,短信查询,各种免费查询!以后别打10086了

发送YE/CXYE到10086,余额查询 发送CXBX到10086&#xff0c;查询当月套餐剩余短信条数。 发送CXGFX到10086&#xff0c;查询当月飞信GPRS套餐剩余流量。 发送CXGTC到10086&#xff0c;查询当月GPRS套餐剩余流量。 发送CXCCT到10086&#xff0c;查询当月超级畅听套餐剩余流量。 发…

用宏定义写出swap(x,y)

#include <stdio.h>// SWAP(x, y) 交换x,y的值 #define SWAP(x, y) \(y) (x) (y); \(x) (y) - (x); \(y) (y) - (x);int main() {int a 3-2, b 5*8;SWAP(a, b);printf("%d, %d\n", a, b);return 0; }运行结果&#xff1a; 40, 1

利用XML生成Excel

先用Excel将我们要生成的表格设计好&#xff1a; 然后另存为XML表格&#xff1a; 将生成的Book1.xml复制到项目中并打开: 找到Table节点&#xff0c;将节点的ss:ExpandedRowCount”2” 删除掉 往下会看到我们刚输入的标题了吧 <Row> <Cell ss:StyleID"s23"&…

httpsqs消息队列

安装&#xff1a; 在安装httpsqs之前要安装 libevent-2.0.12-stable.tar.gz和okyocabinet-1.4.47.tar.gz ulimit -SHn 65535 1、安装libevent-2.0.12-stable.tar.gz wget http://httpsqs.googlecode.com/files/libevent-2.0.12-stable.tar.gz##下载 tar zxvf libevent-2.0.1…

找出数组中重复的数

/*问题描述&#xff1a;数组a[N]&#xff0c;存放了1至N-1个数&#xff0c;其中某个数重复一次。写一个函数&#xff0c;找出被重复的数字.时间复杂度必须为O(N)&#xff0c;函数原型&#xff1a;int do_dup(int a[], int N) */#include <stdio.h>// 返回数组中重复的数 …