构建页眉和页脚的最佳方法是什么?你应该从控制器调用它,还是从视图文件中包含它?我正在使用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 load->view('header'); ?>The data from the controller
load->view('footer'); ?>
我已经看到它完成了两种方式,但是在我走得太远之前想要选择.
实际上,在我自己研究了这个之后,我得出结论,在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
您也可以这样尝试 - 定义默认视图模板,然后根据控制器传递的变量(我的示例中的"内容")提取内容.
在你的控制器中:
$data['content'] = 'your_controller/index'; // more code... $this->load->vars($data); $this->load->view('layouts/default');
然后为所有页面定义默认布局,例如views/layouts/default.php
// doctype, header html etc.= $this->load->view($content) ?>// footer html etc.
那么你的视图可以只包含纯内容,例如views/your_controller/index.php可能只包含从控制器/数据数组传递的变量
= $archives_table ?> = $pagination ?> // etc.
有关CI wiki/FAQ的更多详细信息 - (问:如何在视图中嵌入视图?嵌套模板?...)