marlboro 发表于 2014-6-28 11:36:21

layout

本帖最后由 marlboro 于 2014-6-28 11:41 编辑

在我们实际开发过程中,有很多公用的部分,如header,footer,或者侧边栏,或者其他,每个页面都复制粘贴header,footer显然不可能,我之前做项目看到我们网站别人自己封装的一个简单的方法,方法如下:publicfuncition 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;
    }    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输出-->

marlboro 发表于 2014-6-28 11:44:33

其实原理就是实现视图之间的嵌套吧,把不共用的部分嵌套进公用的部分,一般的思路都是这种,实现方法很多

foucs 发表于 2014-6-30 14:36:28

:D:D:D
页: [1]
查看完整版本: layout