2012-09-02 24 views
4

我有一個查看器幫助器函數,它可以將主要內容加載在頁腳/頁眉旁邊。當我在主內容視圖中爲變量共享相同名稱的標題加載數組的關鍵字時發生了錯誤/意外行爲 - 爲標題和主要內容加載了相同的數組。加載視圖時CodeIgniter出現意外的行爲

我認爲這是正常的,因爲相同的$data陣列被髮送到標題和主要內容井(如前所述)。所以這個變量自然會出現在兩個視圖中。但是,那並不完全如此。在將數據發送到標題後,我將$data變量取消設置,然後在我想將一些數據發送到主視圖時重新創建該變量 - 但問題仍然沒有解決。

我爲這個bug /意外的行爲,一個簡單的例子:

考慮這一觀點,命名爲test

<?php 
echo $some_data; 

而這個控制器:

class Test extends CI_Controller { 

    function index() { 

    $data['some_data'] = 'Some data.'; 
    $this->load->view('test', $data); 
    /* 
    * Output: 
    * Some data. 
    */ 
    unset($data); 
    unset($data['some_data']);//Just to make sure it's not PHP's fault. 
    $this->load->view('test'); 
    /* 
    * Output: 
    * Some data. 
    * 
    * Even though the $data variable is unsetted AND not passed! 
    */ 

    $different_data = array(); 

    $this->load->view('test', $different_data);  
    /* 
    * Output: 
    * Some Data. 
    * 
    * Still outputs the same thing, even though 
    * I'm sending different array(and the $data array is unstted). 
    * 
    */ 

    } 
} 

注意:整個代碼將輸出Some data.三次。

來解決這個問題的唯一辦法是發送一個不同的陣列和設置陣列鍵(這是some_data)到別的東西,將覆蓋舊的。

所以,這是一個錯誤或CodeIgniter的帥哥所做的?

回答

1

這是正常現象。

一旦設置了變量,它們就會在控制器類及其視圖文件中變得可用。發送$this->load->view()中的數組與調用視圖文件之前直接發送數組到$this->load->vars()相同。這可以簡化大多數使用控制器中多個視圖的人的操作。如果您在單個控制器中使用多個視圖文件,並希望它們各自擁有自己的一組變量,則需要手動清除視圖調用之間的$this->load->_ci_cached_vars數組。

在裝載機A類代碼註釋描述出另一種情況,這是爲什麼所需的默認行爲:

//You can either set variables using the dedicated $this->load_vars() 
//function or via the second parameter of this function. We'll merge 
//the two types and cache them so that views that are embedded within 
//other views can have access to these variables. 
0

這是一個CodeIgniter問題。您發送的變量似乎被緩存,直到您覆蓋它們。我自己也遇到過這個問題,可以驗證它。

$this->load->view('test', array('some_data' => NULL));

+0

該解決方案是對於簡單的情況(如示例)罰款,但我有動態變量傳遞,所以手動取消它們對我來說效率不高。 – Abdulaziz

+0

或$ this-> load-> vars('some_data',NULL); – Aurel

2

我們曾經像你和我們外國人同事同樣的問題找到了解決辦法:

如果file:codeigniter \ system \ core \ Loader。PHP

找到代碼:(我想行號爲806):

$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);

,並糾正到:

$this->_ci_cached_vars = $_ci_vars;

問候

+0

必須這樣做,因爲$ this - > _ ci_cached_vars受保護。不過,更好的解決方案是創建MY_Loader並擴展該方法。 –

相關問題