2008-10-07 94 views
15

什麼是構建頁眉和頁腳的最佳方式?你應該從控制器全部調用它還是從視圖文件中包含?我使用的是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

回答

9

你也可以這樣嘗試 - 定義一個默認的視圖模板,然後根據控制器傳遞的變量(在我的例子中爲'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

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 
4

我認爲你正在做它的第一種方式是清潔的。僅僅從知道即將呈現的角度來看。而不是必須進入視圖文件才能找到其餘的。

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); 
    } 
} 

使用基本控制器,你可以在你的個人頁面控制器達到非常乾淨的代碼對頁面上的元素(允許在兩個視圖和控制器代碼重用)獨立意見。你所需要做的就是在你的基本控制器中定義你的通用頁面的'部分'(你可能試圖稱之爲'片段')作爲函數。

如果基本控制器應該開始不受控制地增長(這可能發生在大型站點上),您可以通過將它們放置在子類中來重新排列它的一些不太常用的功能,並讓相應的頁面控制器擴展它們而不是原始基地控制器。

享受!

/延羅蘭

相關問題