2010-04-08 73 views
0

假設我有一個擁有100個不同頁面的網站。每個頁面使用一個共同的頁眉和頁腳。標題內部是來自數據庫的一些動態內容。Codeigniter通用模板

我想避免必須在每個控制器中都有代碼,並且需要將此通用代碼傳遞到視圖中的操作。

function index() 
{ 
    // It sucks to have to include this on every controller action. 
    data['title'] = "This is the index page"; 
    data['currentUserName'] = "John Smith"; 

    $this->load->view("main_view", data); 
} 

function comments() 
{ 
    // It sucks to have to include this on every controller action. 
    data['title'] = "Comment list"; 
    data['currentUserName'] = "John Smith"; 

    $this->load->view("comment_view", data); 
} 

我意識到我可以重構代碼,以便公共部分位於單個函數中,並且該函數由動作調用。這樣做會減少一些痛苦,但仍然感覺不對,因爲我每次都必須打電話給那個功能。

解決這個問題的正確方法是什麼?

回答

0

我有類似的情況。我創建了一個'includes'文件夾,並在那裏放置了一個來自我的控制器的具有重複代碼的文件。然後在控制器只是include('/path/to/includeFile.php');

不知道這是否是「正確」的方式,但它適用於我。

+0

NO。這不好。不遵循MVC,通常是不好的做法。 – 2010-04-08 20:29:11

1

我一直在做的一個方法是擴展默認的控制器類。您可以在user guide中閱讀使用MY_Controller擴展類。這裏面擴展類可以包括的東西,你總是想要做的,喜歡的主要內容之前呈現的頁面頁眉模板或授權的用戶訪問等

class MY_Controller extends Controller { 

    function __construct() 
    { 
     parent::Controller(); 
     //code to always do goes here 
     echo 'Always print this comment'; 
     $this->load->view('partials/template_start'); 
    } 
} 

然後你可以有你的正常控制器類擴展這個通過使用

class MyControllerNameHere extends MY_Controller { 
    function __construct() 
    { 
     //setup here 
    } 
    function index() 
    { 
     echo 'Only print this bit when this method is called'; 
     $this->load->view('partials/MYPAGENAMEHERE'); 
    } 
} 

有這樣做的其他方式上課,我用上面和William's Concepts Codeigniter Template library的混合物。做一些搜索 - 有幾個解決方案給你。