用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5070|回复: 2
收起左侧

[Web] layout

[复制链接]
发表于 2014-6-28 11:36:21 | 显示全部楼层 |阅读模式
本帖最后由 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输出-->


评分

参与人数 1威望 +5 收起 理由
Hex + 5 很给力!

查看全部评分

 楼主| 发表于 2014-6-28 11:44:33 | 显示全部楼层
其实原理就是实现视图之间的嵌套吧,把不共用的部分嵌套进公用的部分,一般的思路都是这种,实现方法很多

本版积分规则