2010-09-16 59 views
0

我生成使用函數從數據庫表中的菜單,我已經放在這個在擴展基礎控制器類:笨動態菜單/ MY_Controller問題

<?php 

class MY_Controller extends Controller { 

    public function __construct() 
    { 
     parent::Controller(); 
    } 

    public function category_menu() 
    { 
     $this->load->model('category_model', 'category'); 
     $categories = $this->category->get_categories(); 

     $menu ="<ul class=\"menu_body\" id=\"nav_categories\">\n"; 
     foreach($categories->result() as $row) 
     { 
      $menu .= "\t<li>" . anchor('listing/view' . $row->url, $row->name) . "</li>\n"; 
     } 
     $menu .= "</ul>\n"; 

     return $menu; 

    } 
} 

那麼自然我的控制器看起來像〜

<?php 

class Site extends MY_Controller { 

    function __construct() 
    { 
     parent::__construct(); 
    } 

    function index() 
    { 
     $data['menu'] = $this->category_menu(); 
     $this->load->view('view', $data); 
    } 
} 

這確實有效,但是對於〜每個〜頁面/視圖來說,這樣做似乎效率不高?

或者這僅僅是CI/MVC的限制,沒有其他的方法。

感謝您的任何洞察力

回答

2

這樣做的更好的方法是在視圖中呈現內容。你可以有部分模板,你不需要做字符串追加控制器:

$categories = $this->category->get_categories(); 
$data['menu'] = $this->load->view('menu', array('data'=>$categories), TRUE); 
$this->load->view('view', $data); 

真正在調用查看告訴函數返回渲染的內容,而不是把它放入緩衝區。然後你可以將它傳遞給'view'。您還可以獲取類別並將其傳遞到視圖的「視圖」中,然後從中加載部分模板。

+0

感謝關於不在控制器中追加字符串的提示。但是,這是否意味着我需要爲每個**「頁面」執行此操作。我很希望有一種自動填充$菜單視圖的方法。有點像'$ this-> category_menu();'直接在視圖中,所以當視圖被調用時,類別被填充。希望這有道理 – Ross 2010-09-16 22:01:18

+0

有點實驗我想我已經破解了,謝謝。 – Ross 2010-09-16 22:23:48

2

如果你的菜單條目將不會被改變太多可以或許緩存結果數組(序列化到文件,內存緩存,無論),並用它來建立你的菜單,而不是在每個頁面加載查詢數據庫。那麼只有當緩存無效時纔會查詢數據庫。

這樣,您應該每隔幾分鐘就將緩存過期一次,以便從數據庫中獲取新數據,或者確保無論何時從別處更新菜單結構(例如CMS),都會使緩存無效(刪除文件,刪除memcache密鑰等),以便下次您撥打category_menu()即可獲得最新數據。

一點題外話,肯Struys提出了一個非常有效的一點還有,你應該考慮一下。控制器和視圖的重點是你可以將你的代碼與你的html分開。

+0

很好的一點,沒有考慮到。菜單條目不會經常更新,所以這看起來像一個很有前途的選項。謝謝。 – Ross 2010-09-16 22:24:29