CI的layout实现

在我们实际开发过程中,有很多公用的部分,如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;

    function __construct($params = array('main')) {// ci比较坑,本来是想在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输出


好了,这样是不是很灵活,和yii的布局在使用上是不是很相似


相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页