4

我有一个查看器辅助函数,可以在页脚/页眉旁边加载主要内容。当我为主要内容视图中的变量加载相同名称的标题的数组键时,发生错误/意外行为 - 为标题和主要内容加载了相同的数组。

我认为这很正常,因为相同的$data数组也被发送到标题和主要内容(如前所述)。所以变量自然会出现在两个视图中。但是,好吧,情况并非完全如此。我$data在将数据发送到标头后取消设置变量,然后在我想将一些数据发送到主视图时重新创建它 - 但问题仍然没有解决。

我为这个错误/意外行为做了一个简单的例子:

考虑这个视图,命名为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 的家伙制造的东西?

4

3 回答 3

2

我们遇到了和你一样的问题,我们的 Alien 同事找到了解决方案:

如果文件:codeigniter\system\core\Loader.php

找到代码:(我认为行号是 806):

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

并将其更正为:

$this->_ci_cached_vars = $_ci_vars;

最好的祝福

于 2014-12-04T11:34:52.617 回答
1

这是预期的行为。

一旦设置了变量,它们就可以在控制器类及其视图文件中使用。发送一个数组与调用视图文件之前$this->load->view()直接发送一个数组相同。$this->load->vars()这简化了大多数人在控制器中使用多个视图的事情。如果您在单个控制器中使用多个视图文件并希望它们各自拥有自己的一组变量,则需要手动清除$this->load->_ci_cached_vars视图调用之间的数组。

Loader 类中的代码注释描述了另一种情况,说明了为什么这是所需的默认行为:

//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.
于 2012-09-02T16:19:21.297 回答
0

这是一个 CodeIgniter 问题。您发送的变量似乎会被缓存,直到您覆盖它们。我自己也遇到过,可以验证。

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

于 2012-09-02T16:07:48.813 回答