在codeigniter中取消设置子视图的视图变量

时间:2012-10-19 19:13:08

标签: php codeigniter codeigniter-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>

2 个答案:

答案 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/
  • 在#805行找到$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 ,则不会在子视图中进行渲染。

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