为Codeigniter添加Smarty模板引擎的支持,网上方法都很详细,但是有些注意事项没有提到,这两天闲下来了,把具体步骤和注意事项再理一理。相信有这个需求的人对Codeigniter和Smarty都有一定了解,就对这两个东西不做介绍了。直接进入正题。
一、安装准备
1、Codeigniter,下载地址(下载最新版就好了)
2、Smarty,下载地址(下载最新版就好了)
3、codeigniter-smarty,下载地址 。这是个什么呢?它是一个Smarty的插件,它的作用是让Smarty可以支持Codeigniter,就这么简单。
二、基本原理
将Smarty集成到Codeigniter 中,
- 首先我们需要安装Codeigniter和Smarty,并且它们能够正常工作,这个毫无疑问。
- 其次我们需要为Smarty安装"codeigniter-smarty"插件,让Smarty有能力支持Codeigniter。
- 而后我们需要为Codeigniter创建一个自定义类库,通过类库,我们可以将Smarty和Codeigniter集成到一起去。(这是所有步骤的关键)
- 最后验证安装成功与否。
三、安装Codeigniter
Codeigniter是一个轻量级的PHP框架,它采用MVC的思想来组织PHP程序。安装很简单,直接将下载的安装包解压后,放到你的服务器目录下即可。具体步骤如下:
1、解压缩Codeigniter安装包,得到如下内容:
2、将这个目录直接上传到你的服务器的根目录下即可,然后访问:http://localhost。如果你看到下边的页面,说明你成功了。
其他说明:如果你希望修改配置等,请参考官方手册:http://codeigniter.org.cn/user_guide/installation/index.html。上述步骤是最简单安装方式,但是如果上边你安装成功了,那么相信其他的问题都可以以此为起点一点点征服。
四、安装Smarty
Smarty是比较著名的模板引擎,并且功能很强大,带缓存等。Smarty安装也是仅需要两个步骤,解压和上传。
1、将下载的Smarty安装包解压缩,得到下边目录。
2、在Codeigniter的system目录下建立libs/smarty目录
3、将smarty目录中的libs文件夹,上传到新建的Smarty目录下,形成如下目录结构
其他说明:如果你需要更高级的安装,请参看:http://www.smarty.net/docs/zh_CN/installing.smarty.basic.tpl
五、为Smarty安装插件codeigniter-smarty
codeigniter-smarty是一个Smarty插件,它为Smarty提供Codeigniter支持。安装类似于Smarty其他插件的安装,安装和Codeigniter一毛钱关系都没有。分为两步,解压和上传。
1、解压缩codeigniter-smarty,得到如下目录结构:
2、进入codeigniter-smarty/libs/smarty/libs/plugins,然后将所有文件复制到localhost/system/libs/smarty/libs/plugins目录下,就是把codeigniter-smarty中plugins中的东西都复制到smarty的plugins中,这样就完事了。
六、为Codeigniter添加Smarty支持(关键步骤)
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Smarty Class
*
* @package CodeIgniter
* @subpackage Libraries
* @category Smarty
* @author Kepler Gelotte
* @link http://www.coolphptools.com/codeigniter-smarty
*/
//注意这个地方的路径必须能够找到和你的Smarty安装路径一致
require_once( BASEPATH.'libs/smarty/libs/Smarty.class.php' );
class CI_Smarty extends Smarty {
function CI_Smarty()
{
parent::Smarty();
$this->compile_dir = APPPATH . "views/templates_c";
$this->template_dir = APPPATH . "views/templates";
//如下四行是配置config和cache目录,还有模板的起止标志
$this->config_dir = APPPATH . "config";
$this->cache_dir = APPPATH . "cache";
$this->left_delimiter = "<!--{";
$this->right_delimiter = "}-->";
$this->assign( 'APPPATH', APPPATH );
$this->assign( 'BASEPATH', BASEPATH );
log_message('debug', "Smarty Class Initialized");
}
function __construct()
{
parent::__construct();
$this->compile_dir = APPPATH . "views/templates_c";
$this->template_dir = APPPATH . "views/templates";
//如下四行是配置config和cache目录,还有模板的起止标志
$this->config_dir = APPPATH . "config";
$this->cache_dir = APPPATH . "cache";
$this->left_delimiter = "<!--{";
$this->right_delimiter = "}-->";
$this->assign( 'APPPATH', APPPATH );
$this->assign( 'BASEPATH', BASEPATH );
// Assign CodeIgniter object by reference to CI
if ( method_exists( $this, 'assignByRef') )
{
$ci =& get_instance();
$this->assignByRef("ci", $ci);
}
log_message('debug', "Smarty Class Initialized");
}
/**
* Parse a template using the Smarty engine
*
* This is a convenience method that combines assign() and
* display() into one step.
*
* Values to assign are passed in an associative array of
* name => value pairs.
*
* If the output is to be returned as a string to the caller
* instead of being output, pass true as the third parameter.
*
* @access public
* @param string
* @param array
* @param bool
* @return string
*/
function view($template, $data = array(), $return = FALSE)
{
foreach ($data as $key => $val)
{
$this->assign($key, $val);
}
if ($return == FALSE)
{
$CI =& get_instance();
if (method_exists( $CI->output, 'set_output' ))
{
$CI->output->set_output( $this->fetch($template) );
}
else
{
$CI->output->final_output = $this->fetch($template);
}
return;
}
else
{
return $this->fetch($template);
}
}
}
// END Smarty Class
上述代码,一方面是将Smarty和Codeigniter进行集成,提供一个公共的类库,以方便调用在Codeigniter中调用Smarty,另一方面其实是对Smarty进行配置(还记得在使用Smarty模板的时候,需要配置那四个路径吗?这里是一样的道理)。
3、让Codeigniter自动加载Smarty类库,方便调用。在codeigniter的config目录下,修改autoload.php中的$autoload['libraries'],自动加载类库smarty,如图:
OK,到此我们已经完成了集成。如果你是按照上边没有改动就完成了的话,那恭喜你,你已经将Smarty和Codeigniter集成到一起了。这样肯定是不放心的,来做一下简单的测试。
七、测试框架
1、测试Smarty框架
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Helloworld extends CI_Controller{
function __construct(){
parent::__construct();
}
public function index(){
$this->smarty->testInstall();//大家都懂得
}
}
(2)、在浏览器输入:http://localhost/helloworld
2、测试使用Smarty框架
<h1>Hello,<!--{$name}--></h1>
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Test extends CI_Controller{
function __construct(){
parent::__construct();
}
public function index($page='index'){
$this->smarty->assign('name', 'forevernull');
$this->smarty->view('index.tpl');
}
}
八、总结
一直觉得挺简单的,写出来真的不容易。其实这两个框架的使用是很灵活的,我只是抛砖引玉,如果你对上述过程熟悉了,你可以更改任何配置。如果你能够读到这里,我真的很佩服你!
九、参考资料
1、CodeIgniter+Smarty - Perfect Together