2

控制器

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Main extends CI_Controller 
{

    public function index()
    {
        $this->load->model('Event');
        $todays_events = $this->Event->get_todays_events();     

        $data = array(
            'todays_events' => $todays_events
        );
        $this->load->view('main/index', $data);
    }
}
?>

主/索引视图

<?php $this->load->view('partial/header'); ?>
<?php $this->load->view('components/calendar/mon_to_wed'); ?>
<?php $this->load->view('partial/footer'); ?>

组件/日历/mon_to_wed

(可以访问 $todays_events,这是为什么呢?)

<div id="calendar_today">
    <h1>Whats Happening</h1>
    <?php foreach($todays_events as $event) : ?>
        <?php var_dump($event); ?>
    <?php endforeach; ?>
</div>
4

2 回答 2

1

我已经阅读了 CodeIgniter 核心文件,虽然破解核心可能会解决这个问题,但存在另一种有助于防止在内部视图中定义变量的方法。

在第一个view文件中,执行以下指令:

foreach ($_ci_vars as $key => $value) $_ci_vars[$key]=NULL;

$this->load->view('your-inner-view', $_ci_vars);
$this->load->view('your-second-inner-view', $_ci_vars);
$this->load->view('your-third-inner-view', $_ci_vars);
// and so on...

如果我找到更好的解决方案,我会更新我的帖子

更新:

最后!我找到了真正的解决方案,最好创建自己的Loader类而不是使用默认类。执行以下说明:

  • Loader.php课程从复制/system/core/到您的/application/core/
  • $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);在第 805 行查找
  • 将该行更改/替换为$this->_ci_cached_vars = $_ci_vars;

CodeIgniter 有一个变量缓存,一旦你使用load->view()方法,变量将被缓存在一个数组中,第二次使用load->view()导致合并cached变量和new变量如果存在,然后将结果缓存为一个新数组(包含旧变量)。

因此,停止使用 ofarray_merge()将是解决方案;)

于 2012-10-19T22:20:46.073 回答
0

给定的答案可能适用于单个视图,当从多个子视图组装视图时,整体视图的任何数据都会被上述修复删除。

对我有用的是将子视图的这些数据项显式设置为null不需要它们。

例如,子视图期望$a和。$b$c

我们第一次渲染我们传递的子视图$data['a'=>'whatever', 'b'=>'whatever', 'c'=>'whatever']并且视图被正确渲染。

第二次通过时$data['a'=>'whatever'],$b 和 $c 会在子视图中使用第一次调用的数据进行渲染。相反,如果我们通过$data['a'=>'whatever', 'b'=>null, 'c'=>null],则bc不会在子视图中呈现。

这当然是假设您在子视图中使用数据之前检查数据是否为空。

于 2014-10-27T20:33:42.657 回答