我正在使用codeigniter并且有一个主视图,它根据我传递的参数调用另一个视图,所以例如我可能会从控制器传递这样的内容:
$data['view'] = 'login';
$this->load->view('main', $data);
这一切都很好,花花公子,但是,我试图传递我的错误页面同样好。在我的错误页面中,我有一些类似于我的控制器,我设置了一个视图,然后调用主视图。
如果我还没有处理任何视图,这可以正常工作,例如,如果我在控制器中遇到PHP错误。但是如果我在视图中出现错误,它将处理主视图两次(因此html / head / body标记两次)
如果我只是在没有主视图的情况下吐出错误页面,那么内容可以去任何地方,例如标题标签,所以我需要重新生成整个页面。
我知道它正在处理当前视图的中间,因此清除当前正在生成输出的内容的输出并不是真的有意义,但无论如何都要做到这一点。当错误页面命中时,意味着清除生成的任何内容,然后只输出错误页面中的内容?
答案 0 :(得分:1)
数据字符串是一个好主意,但我真的不想在应用程序中重写任何内容,我们必须有大约200个视图。
我最终在PHP中使用对象缓冲区并将其放在每个错误文件的顶部:
ob_end_clean();
ob_end_flush();
@ob_clean();
ob_start();
ob_clean();
//show code
exit();
答案 1 :(得分:0)
您可以通过将视图作为数据返回而不是将它们发送到浏览器来构建字符串:
$output = $this->load->view('my_view', $data, TRUE);
然后在最后,设置最终输出字符串:
$this->output->set_output($output);
答案 2 :(得分:0)
您可以在视图中调用视图。
所以,如果你在控制器中按照你的意思行事:
$data['view'] = 'login';
$this->load->view('main', $data);
然后在main.php视图文件中,您可以执行以下操作:
<? if(isset($view)):
$this->load->view($view);
endif;?>
如果您将多个值发送到该部分的主视图中,您也可以在那里使用嵌套的if或switch语句,并且我可能将它全部包装在容器div中,因为这就是我的角色。如果它抛出错误,你可以调整路径。