控制器
<?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>
答案 0 :(得分: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);
$this->_ci_cached_vars = $_ci_vars;
CodeIgniter有一个变量兑现,一旦你使用load->view()
方法,变量将被缓存在一个数组中,第二次使用load->view()
导致合并cached
变量和{{如果存在变量,则将结果缓存为新数组(包含旧变量)。
因此,停止使用new
将是解决方案;)
答案 1 :(得分:0)
给定的答案可能适用于单个视图,当从多个子视图中组装视图时,整个视图的任何数据都会被上述修复删除。
对我来说有用的是,如果不需要子视图,请将这些数据项明确设置为null
。
例如,子视图需要$a
,$b
和$c
。
第一次渲染子视图时,我们传递$data['a'=>'whatever', 'b'=>'whatever', 'c'=>'whatever']
并正确呈现视图。
我们第二次传递$data['a'=>'whatever']
时,$ b和$ c会在子视图中使用第一次调用的数据进行渲染。
如果我们通过$data['a'=>'whatever', 'b'=>null, 'c'=>null]
, b 和 c ,则不会在子视图中进行渲染。
当然,假设您在子视图中使用数据之前检查数据是否为空。