本帖最后由 marlboro 于 2014-6-28 11:41 编辑
在我们实际开发过程中,有很多公用的部分,如header,footer,或者侧边栏,或者其他,每个页面都复制粘贴header,footer显然不可能,我之前做项目看到我们网站别人自己封装的一个简单的方法,方法如下: public funcition show($view) { $this -> load -> view('header'); $this -> load -> view($view); $this -> load -> view('footer'); } //然后页面调用$this -> show($view),很显然这种方法不灵活,只是实现头部,中间和底部这种简单的布局,如果要实现不同的布局肯定不好,当然我们可以根据这种方法重新进行封装,设置多个参数进行灵活运用,这里就不多说了,看到很多种的方法,ci的简洁灵活导致10个人搭出来的框架有9种完全不同的框架结构。 好了,步入正题,在yii中有自带的layout布局,用起来很方便,在ci中我们也可以模仿yii进行layout布局,可以灵活的实现不同的布局(ci以前的老版本是不带layout的,很久没有用,不知道新版本有没,如果有那我是班门弄斧了{:soso_e153:}) 1.libraries新建一个Layout.php的扩展类: <?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Layout {
public $layout;
function __construct($params = array('main')) {//本来是想在controller中加载这个类的时候顺便给构造函数传参设置要加载的布局文件,结果看文档好像$this -> load -> library('**','**')的第二个参数必须得是数组才能给构造函数传参,也许可以传字符串吧,有时间我再试试
$this->layout = 'layouts' . DIRECTORY_SEPARATOR . $params[0];
} function view($view, $data = null, $flag = false) {
$ci = &get_instance();
$data['content'] = $ci->load->view($view, $data, true);//这里的第三个参数true代表不输出,如果是false就会输出,默认是false,和thinkphp里的display和assign类似,这里用第三个参数来控制
if ($flag) {
$view = $ci->load->view($this->layout, $data, true);
return $view;
} else {
$ci->load->view($this->layout, $data, false);
}
}
}
?> 2.在view下创建layouts文件夹来存放layout视图,在layouts文件夹下新建默认layout视图文件main.php,这个布局 文件就是我们网站的公用部分: <!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8"> <title>这是layout的默认视图</title> </head> <body> <h1>这是layout布局</h1> <div>这里是header</div> <div>这里是侧边栏</div> <div> <?php echo $content; ?><!--$content其实就是我们页面不共用的view,在上面的layout类里的view方法 里第一句$data['content']里把content传递给了布局页面,这个位置可以随便放,放在最下面我们的view 文件里的内容就显示在最下面,所以更加灵活--> </div> <div>这里是底部</div> </body> </html> 3.在控制器controller中调用封装好的layout中view方法: class Helloworld extends CI_Controller { public function __construct() { parent::__construct(); $this->load->library('layout',array('main'));//加载layouts下的main文件,可以写其他的布局文件,如$this->load->library('layout',array('hello'));表示加载layouts下的hello布局文件,默认$this->load->library('layout')不传参表示加载默认的布局文件,在layout扩展类的构造方法中已经设置了默认参数main } public function test() { $data['test'] = 'ci模拟layout'; $this->layout->view('content', $data); } } ?> 4.views中新建content.php如下,这个是我们的view文件,就是网站不公用的部分: <h2>content视图</h2> <?php echo $test; ?><!--这个就是test方法中的$data['test']传递过来的,具体在layout的 view方法里的$data['content'] = $ci->load->view($view, $data, true);这个就是把我们 视图文件赋值给变量$data['content'];然后把$data['content']传递给layout下的视图,在 layout的视图文件里通过$content输出-->
|