CI框架集成Smarty的方法分析


Posted in PHP onMay 17, 2016

本文实例讲述了CI框架集成Smarty的方法。分享给大家供大家参考,具体如下:

因为CI自带的模板功能不是很方便,所以大家普遍采用集成Smarty的方式来弥补CI这方面的不足。

本人在网上看了不少CI集成Smarty的教程,包括咱们CI论坛里面的一个精华帖子

http://codeigniter.org.cn/forums/forum.php?mod=viewthread&tid=10345。

自己对比了一下这些教程,我认为下面这个方案是所有里面最优秀的,强烈推荐给大家(当然也是我自己采取的方案)

出处:

http://www.cnmiss.cn/?p=261

原文里面的一些错误,我在本文里面已经做了修正

下面说下我认为它更加优秀的原因,对比下这个方案和我们论坛的方案,你会发现,这个方案多了一点就是它扩展了核心类,

它将Smarty类方法assign和display扩展到Ci的控制器中,所以我们在CI中使用Smarty的时候可以像这样使用:

public function index()
{
    //$this->load->view('welcome_message');
    $data['title'] = '标题';
    $data['num'] = '123456789';
    //$this->cismarty->assign('data',$data); // 也可以
    $this->assign('data',$data);
    $this->assign('tmp','hello');
    //$this->cismarty->display('test.html'); // 也可以
    $this->display('test.html');
}

通过对核心控制器类的简单扩展,大家在CI中使用Smary的时候和直接使用Smarty的用法习惯是一样的,这是一个很大的优点啊。

而且从核心类库的扩展来看,大家也可以看出该文作者对于CI框架的理解是很好的。

根据这篇文章,我不仅成功集成了Smaty,而且也进一步加强了对于CI的理解。

而且该方案将Smarty的配置文件放到了CI框架的config目录下,对于两者,使用都很规范。

最终实现了"CI和Smaty的无缝结合"。

下面开始是具体教程: // 我在原文的基础上做了一些修改,更正了原文的一些错误 注意下文中有'//'的地方,是我自己修改过的地方,或是自己又增加的地方。

CI版本:2.1.4 // (本文发布时使用的版本)

Smarty版本:Smarty-2.6.26 // 因为我之前用这个版本,为了照顾自己的使用习惯,这里没有使用最新的Smaty版本,大家理解了扩展原理,可以选择自己想用的Smatry版本。

1、到相应站点下载Smarty的源码包; // 我这里用的是 Smarty-2.6.26

2、将源码包里面的libs文件夹copy到CI的项目目录下面的libraries文件夹下,并重命名为Smarty-2.6.26;//

3、在项目目录的libraries文件夹内新建文件Cismarty.php,里面的内容如下:

<?php
if(!defined('BASEPATH')) EXIT('No direct script asscess allowed');
require_once( APPPATH . 'libraries/Smarty-2.6.26/libs/Smarty.class.php' );
class Cismarty extends Smarty {
  protected $ci;
  public function __construct(){
    $this->ci = & get_instance();
    $this->ci->load->config('smarty');//加载smarty的配置文件
    //获取相关的配置项
    $this->template_dir  = $this->ci->config->item('template_dir');
    $this->complie_dir  = $this->ci->config->item('compile_dir');
    $this->cache_dir   = $this->ci->config->item('cache_dir');
    $this->config_dir   = $this->ci->config->item('config_dir');
    $this->template_ext  = $this->ci->config->item('template_ext');
    $this->caching    = $this->ci->config->item('caching');
    $this->cache_lifetime = $this->ci->config->item('lefttime');
  }
}

4、在项目目录的config文件夹内新建文件smarty.php文件,里面的内容如下:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$config['theme']    = 'default';
$config['template_dir'] = APPPATH . 'views';
$config['compile_dir'] = FCPATH . 'templates_c';
$config['cache_dir']  = FCPATH . 'cache';
$config['config_dir']  = FCPATH . 'configs';
$config['template_ext'] = '.html';
$config['caching']   = false;
$config['lefttime']   = 60;

5、在入口文件所在目录新建文件夹templates_c、cache、configs;

6、在项目目录下面的config目录中找到autoload.php文件
修改这项

$autoload['libraries'] = array('Cismarty');
//目的是:让系统运行时,自动加载,不用人为的在控制器中手动加载

7、在项目目录的core文件夹中新建文件MY_Controller.php 内容如下: // 扩展核心控制类

<?php if (!defined('BASEPATH')) exit('No direct access allowed.');
class MY_Controller extends CI_Controller { // 原文这里写错
  public function __construct() {
    parent::__construct();
  }
  public function assign($key,$val) {
    $this->cismarty->assign($key,$val);
  }
  public function display($html) {
    $this->cismarty->display($html);
  }
}

配置完毕

使用方法实例:

在控制器中如:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends MY_Controller { // 原文这里写错
  public function index()
  {
    //$this->load->view('welcome_message');
    $data['title'] = '标题';
    $data['num'] = '123456789';
    //$this->cismarty->assign('data',$data); // 亦可
    $this->assign('data',$data);
    $this->assign('tmp','hello');
    //$this->cismarty->display('test.html'); // 亦可
    $this->display('test.html');
  }
}

然后再视图中:试图文件夹位于项目目录的views之下:

新建文件test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{ $test.title}</title> //( 原文是 <title>{$test['title']}</title>,是错误的写法,也有可能是Smarty版本的原因)
<style type="text/css">
</style>
</head>
<body>
{$test.num|md5} // 原文这里也写错了
<br>
{$tmp}
</body>
</html>

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php5.3 废弃函数小结
May 16 PHP
关于PHP内存溢出问题的解决方法
Jun 25 PHP
php代码审计比较有意思的例子
May 07 PHP
PHP在网页中动态生成PDF文件详细教程
Jul 05 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
Laravel 5.0 发布 新版本特性详解
Feb 10 PHP
php实现发送微信模板消息的方法
Mar 07 PHP
分享PHP计算两个日期相差天数的代码
Dec 23 PHP
win7安装php框架Yii的方法
Jan 25 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
php微信公众号开发之图片回复
Oct 20 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
May 17 #PHP
CI框架中redis缓存相关操作文件示例代码
May 17 #PHP
Yii2如何批量添加数据
May 17 #PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 #PHP
php截取视频指定帧为图片
May 16 #PHP
PHP中常用的数组操作方法笔记整理
May 16 #PHP
PHP获取用户访问IP地址的5种方法
May 16 #PHP
You might like
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
php实现mysql同步的实现方法
2009/10/21 PHP
php中使用临时表查询数据的一个例子
2013/02/03 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
jQuery 全选效果实现代码
2009/03/23 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
wxPython中listbox用法实例详解
2015/06/01 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
查环查孕证明
2014/01/10 职场文书
个人自荐书怎么写
2015/03/26 职场文书
施工安全保证书
2015/05/09 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL