2011-09-19 70 views
4

我使用CodeIgniter並在網站上有一個菜單,需要從數據庫中讀取城市列表。如果只有一兩頁,這很簡單 - 我加載模型並從控制器調用一個函數,並將數據傳遞到視圖中。在CodeIgniter的每個頁面上創建一個數據庫生成的菜單?

但是,如果我想在每一頁上,這意味着我必須不斷複製相同的代碼到每一個控制器功能,並將數據傳遞到視圖。 (請注意,我正在使用包含菜單的單獨「標題」視圖。)

什麼是自動加載每個頁面加載一些數據並將其提供給我的視圖的最佳方式?

回答

10

創建一個新的根控制器類,如MY_Controller

您可以瞭解如何在這裏:https://ellislab.com/codeigniter/user-guide/general/core_classes.html

然後讓所有的控制器繼承了該類。

MY_Controller添加這樣的函數:

function show_view_with_menu($view_name, $data) { 
    $menu_data = $this->menu_model->get_menu(); // load your menu data from the db 
    $this->load->view('header', $menu_data); // display your header by giving it the menu 
    $this->load->view($view_name, $data); // the actual view you wanna load 
    $this->load->view('footer'); // footer, if you have one 
} 

每當你通常做加載一個視圖,而不是這樣做:

$this->show_view_with_menu('view_for_this_controller', $data); 
+0

謝謝,這是一種享受!我也剛剛意識到,它對於任何*有頁眉和頁腳的情況非常有用,這樣我就可以調用一個函數,而不是在每個控制器中加載頁眉/主/頁腳。 – DisgruntledGoat

+1

該鏈接已更改爲http://ellislab.com/codeigniter/user-guide/general/core_classes.html – karmafunk

+0

我把這個MY_Controller放在application/core文件夾中,它擴展了CI_Controller。在我的應用程序/控制器文件夾中,我有一個Testing_controller文件,它擴展了這個MY_Controller文件。但我不能不使用它自動加載它。爲什麼會發生?在文檔中他們不會告訴我們自動加載或需要它。 – Yasitha

0

您可以定義自己的Application_Controller,它可以擴展爲CI_Controller。所有你自己的控制器然後擴展你的Application_Controller而不是CI_Controller

在您的Application_Controller__construct()中,您將介紹您以前在各處複製和粘貼的代碼。

+2

http://www.wikihow.com/Use-You're-and-Your – cenanozen

+0

@cenanozen:eugh。 – Matt

0

我的解決辦法只是爲了創造處理這些顯示器類的東西。一個簡化的版本:

class Display 
{ 
    public function load_pages($name, $data = array()) { 
     $CI =& get_instance(); 

     // Top and header templates 
     $CI->load->view('header.php', $data); 

     // Default to loading the one template file 
     $CI->load->view($name, $data); 

     // Footer template 
     $CI->load->view('footer.php'); 
    } 
} 

我把它做票友的東西,比如設置默認值(網頁標題,meta標籤)和加載JS/CSS等它的工作原理就像一個快捷方式,無需複製/粘貼我加載的常規模板,但也允許我定義一個自定義模板設置,如果需要的話,不像如果你有它自動擴展你的控制器類。

我沒有必要,但你也可以在這個類中指定不同的功能來加載網站的不同部分,如load_admin_pages()或其他一些。在我的情況下,我只是通過設置一個前綴參數來處理這個前綴參數,這個前綴參數是前綴到文件路徑中的,並且獲得了我當前項目所需的參數。

相關問題