2011-02-17 151 views
0

我想知道如何在MVC框架,特別是CodeIgniter中實現像PHP功能一樣的asp.net「用戶控件」。MVC的「用戶控件」PHP

爲了更好地解釋我想要什麼,這裏的一些指導:

  • 一個.NET用戶控件是一個文件,既ASPX和代碼(C#/ VB),提供跨落實每一個頁面功能它(比如購物車)。它很容易添加到母版頁,該母版頁是該網站中每個其他頁面的容器。

  • 在MVC結構中,頁面由加載視圖的控制器加載。我知道我可以在視圖中加載視圖,但是如何爲「跨站點視圖」提供控制器代碼而不必在每個主控制器上重複它?

例子:我有一個加載從數據庫分類成一個選擇列表中的視圖,這種觀點是對每個頁面的頂部。正如我不應該(我不確定是否有可能)從視圖中訪問我的類別模型,我可以在哪裏放置代碼來加載此數據,而無需在每個控制器的每個函數中重複該代碼?

回答

1

如果你想避免在每個控制器中重複代碼,那麼簡單地擴展CI_Controller類,並在實例化時執行新控制器類中的所有設置......並讓所有常規控制器都繼承自New_Controller

+0

感謝您的評論。我一直這樣做,但似乎並不正確。我最終將得到一個巨大的New_Controller文件,來自各處的代碼都混在一起,並從其他控制器類繼承。似乎很笨拙。 – noinstance 2011-02-17 16:59:58

+0

@nosuchnick - 沒有規則說你應該只有*一個*這樣的控制器 - 你可以有一個`Base_Controller`包含一些公共代碼,然後是一個`Shopping_Controller`,專門用於購物車的常用功能和數據,以及另一個`Shopping_Specials_Controller`,增加了一些專門的功能......並且所有這些都與`Admin_Controller`(它也從`Base_Controller`繼承)分開 - 所以你只能加載你需要的東西。 – 2011-02-17 17:12:25

0

正如肖恩所說,如果功能是在控制器級別,你應該擴展CI_Controller。 可能某些功能應該處於視圖級別,因此可以使用加載程序視圖來幫助您保持每個頁面的全局佈局幷包含常用功能。這是這樣的:

[觀點] layout.php中:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es"> 
<head> 
     <?php 
      $this->load->view('meta', $data); 
     ?> 
</head> 
    <body> 
     <div id="wrapper"> 

      <?php 
      $this->load->view('header', $data); 
      ?> 
      <div id="contents"> 

       <?php include ('menu_izq.php'); ?> 

       <div id="page"> 
        <?php $this->load->view($page, $data); ?> 
        <div class="clear"></div> 
       </div> 
      </div> 
      <div style="clear: both;"></div> 
      <?php $this->load->view('footer');?> 
     </div> 
    </body> 
</html> 

在你的控制器,你應該總是加載這個視圖和參數數組中傳遞內容的真實觀點的價值,就像

$data['page'] = 'incidents'; // this is the real contents 
    $stylesheets[] = '/scripts/jscalendar-1.0/skins/aqua/theme.css'; 
    $data['stylesheets'] = $stylesheets; 
    $scripts[] = '/scripts/jscalendar-1.0/calendar.js'; 
    $scripts[] = 'https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'; 
    $scripts[] = '/scripts/autoNumeric-1.4.1.js'; 
    $scripts[] = '/scripts/autoLoader.js'; 
    $data['scripts'] = $scripts; 
    $this->load->view('container',$data); 
0

我對母版頁的工作量很少,主要是在Sharepoint中,但如果您想要一個front.master頁來這麼說,然後在該上下文中加載所有其他頁面,最好的辦法是創建一個新庫作爲視圖處理程序,在語法上設計它來加載t他在主人的次要觀點。

由一個簡單的類:

class MasterViewTemplate 
{ 
    public $master = "v1.php"; 
    private $data = array(); 

    public function __set($key,$value) 
    { 
     $this->data[$key] = $value; 
    } 

    public function __get($key) 
    { 
     return $this->data[$key]; 
    } 

    public function setMaster($master) 
    { 
     $this->master = $master; 
    } 

    public function display($page) 
    { 
     //Load the master file 
     //Load the inner $page file 
     //Inject the page contents into the master 
    } 
} 

這是那種你一直在尋找的東西。