2011-05-19 36 views
3

嗨,大家好,我是CodeIgniter的新手,需要一些幫助。我有一個控制器來格式化文章的內容區域。問題是我還需要創建一個包含動態組的邊欄和一個包含最近帖子的右欄。這並不難,我遇到的問題是我想要每個頁面上的側邊欄和右側列,並且我不想重新編碼相同的位來獲取每個控制器中的數據。一個視圖的兩個控制器,CodeIgniter?

沒有複製/粘貼的最好方法是什麼?

回答

8

有很多方法可以做到這一點。

1)模板:這是我在大多數情況下優先(因爲我的模板是複雜的),我使用類似渲染我認爲到一個變量:

$content = $this->load->view('myview', $page_data, true); 

然後,我把它加載到模板解析器(僅供參考,你可以將其加載到另一種觀點太)是這樣的:

$this->load->library('parser'); 
$data = array(
     'page_title' => 'My Page Title', 
     'page_content' => $content, 
     'side_bar' => side_bar(), // function which generates your side bar 
     'right_col' => right_col() // function which generates your right column 
     ); 
$this->parser->parse('my_template', $data); 

那麼你的模板是這樣的:

<html> 
<head> 
<title>{page_title}</title> 
</head> 
<body> 
    <div>{side_bar}</div> 
    <div>{page_content}</div> 
    <div>{right_col}</div> 
</body> 
</html> 

2)負載在你的另外一個觀點:(假設你的菜單是一個視圖不是一個控制器)事情是這樣的:

<?php $this->load->view('menu_view'); ?> 

3)PHP包括:你究竟是如何做到這一點在純PHP(只包括它指向一個控制器,它返回菜單中的URL),事情是這樣的:

<?php include("/common/sidebar"); ?> 

笨都會使該網頁,然後包括它。

4)AJAX ..如果「模板」內容中的內容不太重要,比如橫幅,建議的相關項目列表等,我會使用它。

+0

嗨。我有類似的問題(需要加載視圖和動態邊欄)。你能再解釋一下這個模板嗎? – GroundZero 2014-06-18 16:11:44

+0

你可以在這裏閱讀:http://ellislab.com/codeigniter/user-guide/libraries/parser.html 但基本上我只是把我的視圖渲染成一個變量,然後用它作爲模板中的主體 – icchanobot 2014-07-03 06:13:09

2

你可以看看HMVC。它特別適用於你正在談論的「widget」類型區域。

基本上你要做的是創建兩個完整的MVC結構 - 一個用於你的側欄和右欄,包括一個控制器,一個模型(如果需要)和一個局部視圖。然後,您可以直接從主視圖調用此控制器以將所需內容拖入頁面。

要真正從視圖中調用它,只需將在標記下,無論你想在側邊欄顯示:

<?php echo modules::run('module/sidebar/index'); ?>

不是必需的索引,但我把它放在那裏證明您可以使用modules::run()調用不同的方法。您也可以將無限數量的參數傳遞給modules::run()

+0

你能舉一個簡單的例子嗎? – Ben 2011-05-19 01:19:22

+0

添加示例。它基本上就是你習慣的,你只是把頁面上的可顯示區域分解成模塊。您構建一個僅包含有問題模塊標記的局部視圖,然後調用該視圖。 – 2011-05-19 01:25:38

3

使用PHP生成靜態HTML頁面,如side_bar.html ... 然後,您可以將其包含在其他頁面上。

1

我不確定您的問題是在視圖中還是在(動態)數據顯示在該視圖的(通用部分)中。 如果是後者(好像建議'我不想重新編碼相同的位來獲取每個控制器中的數據'這個短語),那麼您有幾種選擇。例如。

  1. 把邏輯獲得控制器之外的一些功能的「共同」的數據,作爲輔助或一些模型中,並從您的控制器調用它。

  2. 使您的控制器繼承自己的自定義控制器,實現該數據收集功能。

  3. 將您的兩個控制器重構爲一個控制器,併爲每個場景配備不同的功能。

2

在代碼點火器,還有一個可選的第三個參數爲$this->load->view,讓你返回渲染視圖作爲一個字符串,又可以用於分配。你可以做的就是創建一個主模板,具有所有的公用部分,是一個非常簡單的例子:

<html> 
<head> 
</head> 
<body> 
<?php echo $sidebar; ?> 
<?php echo $content; ?> 
<?php echo $right_column; ?> 
</body> 
</html> 

然後您可以創建在您的控制器中的私有函數來填充您的公用部分的動態內容,

private function BuildTemplate($view, $data) { 
    // Generate sidebar content 
    $sidebar_data['...'] = 'blah blah'; 
    $master_data['sidebar'] = $this->load->view('sidebar', $sidebar_data, true); 

    // Generate right column data 
    $right_data['...'] = 'blah blah'; 
    $master_data['right_column'] = $this->load->view('right_column', $right_data, true); 

    // Now load your content 
    $master_data['content'] = $this->load->view($view, $data, true); 

    // Merge it into the master template and return it 
    return $this->load->view('master' $master_data, true); 
} 

然後在適當的控制器方法:

public function index() { 
    $data['...'] = 'blah'; 
    echo $this->BuildTemplate('index', $data); 
} 

這將拉都在一起並與您的內容和主模板將它們結合起來您。如果你想添加諸如頁面特定的標題或腳本之類的東西,你可以選擇添加額外的參數到BuildTemplate。

相關問題