最佳实践:构建页眉和页脚的最佳方式是什么?

问题描述:

什么是构建页眉和页脚的最佳方式?你应该从控制器全部调用它还是从视图文件中包含?我使用的是CodeIgniter,我想知道最佳做法是什么。从控制器加载所有包含的视图文件,像这样?最佳实践:构建页眉和页脚的最佳方式是什么?

class Page extends Controller { 

    function index() 
    { 
     $data['page_title'] = 'Your title'; 
     $this->load->view('header'); 
     $this->load->view('menu'); 
     $this->load->view('content', $data); 
     $this->load->view('footer'); 
    } 

} 

或调用单一视图文件,并要求从那里页眉和页脚的观点:

//controller file  
class Page extends Controller { 

    function index() 
    { 
     $data['page_title'] = 'Your title'; 
     $this->load->view('content', $data); 

    } 

} 

//view file 

<?php $this->load->view('header'); ?> 

<p>The data from the controller</p> 

<?php $this->load->view('footer'); ?> 

我已经看到了这两种方式,但现在要选择我走的太远之前下了一条路。

+0

由于您的问题是关于笨 - 我只是想给你转发给Zend框架如何处理这样的:http://framework.zend.com/manual/en/zend.layout.html – leek 2008-10-07 03:33:26

你也可以这样尝试 - 定义一个默认的视图模板,然后根据控制器传递的变量(在我的例子中为'content')提取内容。

在你的控制器:

$data['content'] = 'your_controller/index'; 

// more code... 

$this->load->vars($data); 
$this->load->view('layouts/default'); 

然后为所有页面定义默认布局例如景色/布局/如default.php

// doctype, header html etc. 

<div id="content"> 
    <?= $this->load->view($content) ?> 
</div> 

// footer html etc. 

然后你的意见可以只包含纯内容例如意见/ your_controller/index.php文件可能包含刚刚从控制器/数据阵列

<?= $archives_table ?> 
<?= $pagination ?> 
// etc. 

More details on the CI wiki/FAQ传递的变量 - (?问:我如何嵌入视图中的观点嵌套模板...)

+0

我最喜欢这种方法是我可以摆脱我的IDE中关于在页眉和页脚片段中缺少结束标签和缺少开始标签的所有错误。太好了! – 2009-03-27 19:37:23

在其他视图中调用视图是一种糟糕的做法。这可能是控制器视图混合的一种形式。 CI中的视图函数允许您传递第三个参数,使其将视图输出返回为字符串。您可以使用它来创建复合视图。

例如:

class Page extends Controller { 
    function index() { 
     $data['page_title'] = 'Your title'; 

     $this->load->view('default_layout', array(
     'header' => $this->load->view('header' , array(), true), 
     'menu' => $this->load->view('menu' , array(), true), 
     'content' => $this->load->view('content', $data , true), 
     'footer' => $this->load->view('footer' , array(), true), 
    )); 
    } 
} 

default_layout.php

<? echo $header, $menu, $content, $footer; ?> 

您可能希望将页眉和页脚结合起来,使这样的一个模板。

class Page extends Controller { 
    function index() { 
     $data['page_title'] = 'Your title'; 

     $this->load->view('default_template', array(
     'menu' => $this->load->view('menu' , array(), true), 
     'content' => $this->load->view('content', $data , true), 
    )); 
    } 
} 

default_template.php

<html><head></head><body><span>Some Header HTML</span> // this is your header html 
<? echo $menu, $content; ?> 
<span>some footer HTML</span></body></html> // this is your footer html 

我认为你正在做它的第一种方式是清洁的。仅仅从知道即将呈现的角度来看。而不是必须进入视图文件才能找到其余的。

实际上,在对此进行了相当多的研究之后,我得出结论:在MVC中包含页眉和页脚的最佳做法是第三种选择 - 即扩展基本控制器。这会给你一个比htxt建议更大的灵活性,特别是如果你正在构建一个非常模块化的布局(不仅仅是页眉和页脚,还有侧栏面板,非静态菜单等)。

首先,定义一个Base_controller类,在该类中创建附加页元素(页眉,页脚等)的方法)到输出字符串:

class Base_controller extends Controller 
{ 
    var $_output = ''; 

    function _standard_header($data=null) 
    { 
     if (empty($data)) 
      $data = ...; // set default data for standard header here 

     $this->_output .= $this->load->view('header', $data, true); 
    } 

    function _admin_header($data=null) 
    { 
     if (empty($data)) 
      $data = ...; // set default data for expanded header here 

     $this->_output .= $this->load->view('admin_header', $data, true); 
    } 

    function _standard_page($data) 
    { 
     $this->_standard_header(); 
     $this->_output .= 
      $this->load->view('standard_content', $data, true); 
     echo $this->_output; // note: place the echo statement in a 
          // separate function for added flexibility 
    } 

    function _page_with_admin_header($data) 
    { 
     $this->_admin_header($data); 
     $this->_output .= 
      $this->load->view('standard_content', $data, true); 
     echo $this->_output; 
    } 
} 

然后,在您的页面控制器中,只需扩展基类并调用您的函数来构建页面。

class Page_controller extends Base_controller 
{ 
    function index() 
    { 
     $data = ...; // Set content data here 
     $this->_standard_page($data); 
    } 

    function admin() 
    { 
     $data = ...; // Set content and header data here 
     $this->_page_with_admin_header($data); 
    } 
} 

使用基本控制器,你可以在你的个人页面控制器达到非常干净的代码对页面上的元素(允许在两个视图和控制器代码重用)独立意见。你所需要做的就是在你的基本控制器中定义你的通用页面的'部分'(你可能试图称之为'片段')作为函数。

如果基本控制器应该开始不受控制地增长(这可能发生在大型站点上),您可以通过将它们放置在子类中来重新排列它的一些不太常用的功能,并让相应的页面控制器扩展它们而不是原始基地控制器。

享受!

/延罗兰