在我们实际开发过程中,有很多公用的部分,如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的,很久没有用,不知道新版本有没)
1.libraries新建一个Layout.php的扩展类:
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Layout {
public $layout;
$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输出
好了,这样是不是很灵活,和yii的布局在使用上是不是很相似