[英]Two controllers for one view, CodeIgniter?
嘿伙計們,我是CodeIgniter的新手,需要一些幫助。 我有一個格式化帖子內容區域的控制器。 問題是我還需要創建一個包含動態組的側邊欄,以及一個包含最新帖子的右側列。 這並不難,我遇到的問題是我想要每個頁面上的側欄和右欄,我不想重新編碼相同的位來獲取每個控制器中的數據。
沒有復制/粘貼,最好的方法是什么?
有很多方法可以做到這一點。
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"); ?>
Codeigniter將呈現該頁面,然后包含它。
4)AJAX ..我使用這個,如果“模板”內容中的內容不太重要,如橫幅,建議相關項目列表等。
使用PHP生成靜態HTML頁面,例如side_bar.html ...然后您可以將其包含在其他頁面上。
你可以看看HMVC 。 它特別適合您所談論的“小部件”類型區域。
基本上你要做的是創建兩個完整的MVC結構 - 一個用於側邊欄和右列,包括控制器,模型(如果需要)和局部視圖。 然后,您可以直接從主視圖調用此控制器,將所需內容提取到頁面中。
要在視圖中實際調用它,只需將以下內容放在標記的任何位置即可顯示側邊欄:
<?php echo modules::run('module/sidebar/index'); ?>
索引不是必需的,但我把它放在那里證明你可以使用modules::run()
調用不同的方法。 您還可以將無限數量的參數傳遞給modules::run()
。
在代碼點火器中, $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添加額外的參數。
我不確定您的問題是在視圖中,還是在(動態)數據中顯示在該視圖的(公共部分)中。 如果它是后者(似乎建議使用短語'我不想重新編碼相同的位來獲取每個控制器中的數據'),那么你有幾個選項。 例如。
將邏輯放在控制器外部的某個函數中,作為幫助器或在某個模型內部獲取“公共”數據,並從控制器中調用它。
讓您的控制器繼承您自己的自定義控制器,實現該數據收集功能。
將兩個控制器重構為一個控制器,每個場景具有不同的功能。
1 - 使用以下代碼在庫文件夾中創建自定義庫類
if (!defined('BASEPATH')) exit('No direct script access allowed');
class LoadView{
function __construct(){
$this->CI =& get_instance();
}
function load_view($page){
$this->CI->load->view('header');
$this->CI->load->view('sidebar');
$this->CI->load->view($page);
$this->CI->load->view('footer');
}
}
2 - 現在像這樣在你的控制器中加載這個庫
$this->load->library('loadview');
3 - 現在調用庫方法並簡單地插入頁面名稱,您不必一次又一次地包含頁眉,側邊欄和頁腳,因為它們將被庫動態包含。
$this->loadview->load_view('about.php');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.