簡體   English   中英

一個視圖的兩個控制器,CodeIgniter?

[英]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. 將邏輯放在控制器外部的某個函數中,作為幫助器或在某個模型內部獲取“公共”數據,並從控制器中調用它。

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

  3. 將兩個控制器重構為一個控制器,每個場景具有不同的功能。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM