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 相关文章推荐
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 PHP
打造计数器DIY三步曲(中)
Oct 09 PHP
php截取字符串并保留完整xml标签的函数代码
Feb 06 PHP
PHP内存使用情况如何获取
Oct 10 PHP
PHP导出Excel实例讲解
Jan 24 PHP
解读PHP的Yii框架中请求与响应的处理流程
Mar 17 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
php实现跨域提交form表单的方法【2种方法】
Oct 17 PHP
jQuery+php简单实现全选删除的方法
Nov 28 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
Dec 24 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
PHP操作Redis常用命令的实例详解
Dec 23 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木马攻击防御之道
2008/03/24 PHP
11个PHP 分页脚本推荐
2011/08/15 PHP
PHP实现异步调用方法研究与分享
2011/10/27 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
PHP树-不需要递归的实现方法
2016/06/21 PHP
jQuery Ajax 实例全解析
2011/04/20 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
Python单链表简单实现代码
2016/04/27 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
浅谈Pytorch中的torch.gather函数的含义
2019/08/18 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
python实现字典嵌套列表取值
2019/12/16 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
女大学生毕业找工作的自我评价
2013/10/03 职场文书
拉丁舞学习者的自我评价
2013/10/27 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
商务考察邀请函模板
2015/02/02 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
Java并发编程必备之Future机制
2021/06/30 Java/Android
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL