|
之前用 symfony, 有components 功能,很好用 。
所谓components就是页面的局部比如 (页头 页脚 侧边栏) 等。
可以把模版切分部分,局部模版可以单独调用数据库 等一系列的展示逻辑,就像一个小型的mvc。
在网站任何页面调用就可以展示出来,很方便。
虽然CI 也可以在模版嵌套,如 $this->load->view("xxx"); 但是处理数据层得放到Controller里。
这样有点别扭,如果此块模版我想放到其他页面下必须在其他Controller里把这块的逻辑拿过来,
或者有的同学是放到Controller基类里,但有好多模版呢?都放到基类里?另外一些页面不需要的逻辑也会被加载。。。
于是有了想法,能不能让CI实现symfony 那样的模版呢? 只要在网站的任何页面的模版里调用一句话,就可以把数据和局部模版一同显示呢,
这样就实现了模版局部和其逻辑的独立。
找了找源代码,终于找到了实现方法。现在分享给大家!还望大家多提建议!
1.修改system/core/Common.php 底部添加一个系统函数 part (自己取名)
if ( ! function_exists('part'))
{
function part($mc,$params=array()){
$m=explode('/',$mc);
if($m[0]&&$m[1]){
$obj=&load_class(''.$m[0]);
$result= call_user_func_array(array(&$obj, $m[1]), $params);
echo $result;
}else{
echo 'part:nothing!';
}
}
}
2.在类库的目录里新建一个自定义类存放逻辑最好和Controller名对应便于管理(当然你可以建n多个类)
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Welcome{
public $CI;
function __construct(){
$this->CI=&get_instance();
}
//以下为模版局部header处理
function header($id,$index,$show,$close)
{
//加载模型
$this->CI->load->model('cla');
$ncla=& $this->CI->cla;
//做一些处理
............
//填充模版变量 演示用没有具体含义
$view['id']='666888666'.$id.$index;
$view['test1']='ddddd';
return $this->CI->load->view("header.php",$view,true);
}
//...以下可以添加更多个块。。。。
}
3.模版里使用函数 part
<html>
<head>...</head>
<body>
<?php part('Welcome/header',array('id'=>'222','index'=>1,'show'=>'','close'=>false));?>
正文内容。。。
<?php part('Welcome/footer',array('id'=>'222','index'=>1,'show'=>'','close'=>false));?>
</body>
</html>
到此为止我们就完成了CI局部模版的mvc,程序不够严谨大家可以完善一下
真的喜欢CI ,用了很多框架感觉CI简单高效,还有CI的url 反向解析的实现,以及url分段中如果有必填值为空的情况的解决方案,下期介绍给大家!谢谢!
|
评分
-
查看全部评分
|