19

构建页眉和页脚的最佳方法是什么?你应该从控制器中调用它,还是从视图文件中包含它?我正在使用 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'); ?>

我已经看到它是双向的,但现在想在我走得太远之前做出选择。

4

4 回答 4

13

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

首先,定义一个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);
    }
}

使用基本控制器,您可以在各个页面控制器中实现非常干净的代码,并为页面上的元素提供单独的视图(允许在视图和控制器中重用代码)。您需要做的就是将您的公共页面“部分”(您可能会被称为“片段”)定义为基本控制器中的函数。

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

享受!

于 2009-01-24T19:49:17.657 回答
10

您也可以这样尝试——定义一个默认视图模板,然后根据控制器传递的变量(在我的示例中为“内容”)拉入内容。

在您的控制器中:

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

// more code...

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

然后为所有页面定义默认布局,例如views/layouts/default.php

// doctype, header html etc.

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

// footer html etc.

然后您的视图可以只包含纯内容,例如 views/your_controller/index.php 可能只包含从控制器/数据数组传递的变量

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

有关 CI wiki/FAQ 的更多详细信息——(问。如何在视图中嵌入视图?嵌套模板?...)

于 2008-10-07T15:04:04.023 回答
4

我认为你这样做的第一种方式更清洁。仅从将要呈现的知识的角度来看。而不必输入视图文件来查找其余部分。

于 2008-10-07T03:48:17.537 回答
3

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

例如:

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
于 2008-10-07T02:14:56.180 回答