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 相关文章推荐
我的论坛源代码(九)
Oct 09 PHP
PHP的SQL注入实现(测试代码安全不错)
Feb 27 PHP
php中将网址转换为超链接的函数
Sep 02 PHP
Thinkphp的volist标签嵌套循环使用教程
Jul 08 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
CI框架的安全性分析
May 18 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
PHP获取文本框、密码域、按钮的值实例代码
Apr 19 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
利用Laravel生成Gravatar头像地址的优雅方法
Dec 30 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
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
Python中生成器和yield语句的用法详解
2015/04/17 Python
快速了解Python中的装饰器
2018/01/11 Python
python获取中文字符串长度的方法
2018/11/14 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
Python中zip函数如何使用
2020/06/04 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
优秀团员个人的自我评价
2013/10/02 职场文书
计算机应用与科学个人的自我评价
2013/11/15 职场文书
社区包粽子活动方案
2014/01/21 职场文书
会计顶岗实习心得
2014/01/25 职场文书
大学生毕业鉴定
2014/01/31 职场文书
新任教师自我鉴定
2014/02/24 职场文书
校园安全演讲稿
2014/05/09 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
工作检讨书范文
2015/01/23 职场文书
光荣之路观后感
2015/06/12 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python