构建页眉和页脚的最佳方法是什么?你应该从控制器调用它,还是从视图文件中包含它?我正在使用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 :(得分:13)
实际上,在我自己研究了这个之后,我得出结论,在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);
}
}
使用基本控制器,您可以在各个页面控制器中实现非常干净的代码,并为页面上的元素提供单独的视图(允许在视图和控制器中重用代码)。您需要做的就是将您的公共页面“部分”(您可能想要称之为“片段”)定义为基本控制器中的函数。
如果基本控制器应该开始不受控制地增长(这可能发生在大型站点上),你可以通过将它们放在子类中来重新安排它的一些不那么通用的函数,并让相应的页面控制器扩展它们而不是原始的基础控制器。
享受!
/ Jens Roland
答案 1 :(得分:10)
您也可以这样尝试 - 定义默认视图模板,然后根据控制器传递的变量(我的示例中的“内容”)提取内容。
在您的控制器中:
$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.
然后您的观看次数可以包含纯内容,例如views / your_controller / index.php可能只包含从控制器/数据数组传递的变量
<?= $archives_table ?>
<?= $pagination ?>
// etc.
More details on the CI wiki/FAQ - (问:如何在视图中嵌入视图?嵌套模板?...)
答案 2 :(得分:4)
我认为你做的第一种方式是更清洁。简单地从知道将要呈现的角度来看。而不是必须输入视图文件来找到其余的。
答案 3 :(得分:3)
在其他视图中调用视图是不好的做法。这可以是控制器视图混合的一种形式。 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