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

时间: 2024-10-09 20:18:31

PHP Yii框架中使用smarty模板的相关文章

使用Yii框架中遇到的三个问题

以下由我们在信易网络公司开发项目的时候终结出的一些经验 1.main.php文件中欲引入全局变量的问题 还原一下此问题:在Yii框架中,main.php一般会作为整个应用的配置文件,保存Application的各种参数,直接return数组.在使用的过程中,因为main.php文件一定会被Yii提前加载,所以将一些全局性的操作也放在了此文件,加载一些类操作啥的没有什么问题,当有一次加了一个全局变量,并且在其它地方使用global获取全局变量时,发现无论我如何努力都得到的是NULL.各种尝试后,终

Yii框架中使用mongodb扩展

前提条件:安装了mongodb数据库 安装了mongo的php驱动 下载Yii的mongo扩展: 下载链接:http://pan.baidu.com/s/1rPtx0 官方下载链接:https://github.com/canni/YiiMongoDbSuite 得到文件:YiiMongoDbSuite.tar.gz 解包,并将该文件放至应用的/protected/extensions文件夹下面 确保文件夹名称为:YiiMongoDbSuite 配置应用 1 vi /protected/conf

YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因

YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因在YII框架的使用过程中,我们可以使用foreach直接遍历findAll等方法返回的对象的属性为什么呢?其实这与CModel实现的接口相关,接下来我们看下其实现的整个过程对于一个我们定义的model,它会继承虚类CActiveRecord,CActiveRecord类继承于CModel,如下所示: class special extends CActiveRecord { } abstract class CAct

Yii 框架中安装 memcache 及配置和测试

安装php_memcache.dll扩展 1.首先将php_memcache.dll文件放入E:\server\php\ext目录下 (php_memcache.dll下载地址:http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/)   一定要根据自己的php版本以及Thread Safety来下载相应的php_memcache.dll,Thread Safety可以在   phpinfo()中查看,enabled表示ts版

YII框架中save()和insert()的用法差异

要了解YII框架中save()和insert()的用法差异,首先查看一下手册中关于两个方法的定义: http://www.yiichina.com/api/CActiveRecord#save-detail save() 方法 源码: framework/db/ar/CActiveRecord.php#784 保存当前的记录. 插入记录到数据表的一行, 如果它的isNewRecord属性为true(通常情况下使用的‘new’运算符来创建记录). 否则, 将被用于更新表中的相应行(通常情况下,使用

yii框架中关于控制器中filter过滤器和外部action的使用

在yii框架中,控制器的过滤器分为执行前和执行后,这里举例是在执行控制器前的过滤. 需要在components/文件夹下定义公共的TestAction.php文件,并且实现run()方法.这个action是各个控制器公用的. class TestController extends Controller { /** * 定义外部的action * @return array */ public function actions() { return array( 'testa' => array

Yii框架中使用PHPExcel导出Excel文件

最近在研究PHP的Yii框架,很喜欢,碰到导出Excel的问题,研究了一下,就有了下面的方法: 1.首先在config\main.php中添加对PHPExcel的引用,我的方式是这样: 1 2 3 4 5 6 7 8 // autoloading model and component classes     'import'=>array(                  'application.models.*',         'application.components.*',

Yii框架中如何使用Yii::t()实现文本信息翻译和文件翻译

1.设置本地化语言 在protected/config文件夹下的main.php中做如下设置: return array( 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'name'=>'My Web Application', 'sourceLanguage'=>'en_us', 'language'=>'zh_cn', 2.定义翻译文件 这里我使用的时通过PHP文件实现文本信息翻译(更多方法说明参考Yii框架官方

Yii框架中的SQL用法

Yii框架的SQL User::find()->all(); //返回所有用户数据: User::findOne($id); //返回 主键 id=1 的一条数据: User::find()->where(['name' => 'ttt'])->one(); //返回 ['name' => 'ttt'] 的一条数据: User::find()->where(['name' => 'ttt'])->all(); //返回 ['name' => 'ttt'