0

我有一个挂钩的功能:

public function checkIfLogged() {
    $this->CI = & get_instance();
    if(!$this->CI->session->userdata('logged') ){
        $this->CI->load->view('common/home');
        exit;
    }
}

我的问题是$this->CI->load->view('common/home');根本没有加载模板文件。有什么原因吗?

我正在使用 post_controller_constructor 挂钩。

谢谢,彼得

4

2 回答 2

2

实际问题是您使用exit. 加载视图时,其输出将添加到输出类 ( system/core/Output.php)。最终的视图数据然后$OUT->_display();通过system/core/CodeIgniter.php.

既然你把它扔exit在那里,脚本就会停止,并且永远不会调用那个显示方法。

我真的不知道你想用这个钩子做什么(如果用户退出或其他东西,它看起来像显示一个指定的页面),但最快的解决方案是返回视图的输出并回显它直接从钩子上。

public function checkIfLogged() {
    $this->CI = & get_instance();
    if(!$this->CI->session->userdata('logged') ){
        exit($this->CI->load->view('common/home', null, true));
    }
}

我不鼓励使用display_override钩子,因为您的整个控制器代码将在钩子甚至有机会检查特定会话数据之前运行(并且您的控制器甚至可能覆盖该会话数据,从而产生意外结果)。

您甚至可以考虑使用基本控制器 (MY_Controller) 而不是钩子。根据您的情况/所需的功能,它可能更合适。

于 2013-05-13T22:37:01.240 回答
1

pre_system

在系统执行期间很早就被调用。此时仅加载了基准和钩子类。没有发生路由或其他过程。

预控制器

在调用任何控制器之前立即调用。所有基类、路由和安全检查都已完成。

post_controller_constructor

在您的控制器实例化后立即调用,但在任何方法调用发生之前。

post_controller

在您的控制器完全执行后立即调用。

显示覆盖

覆盖 _display() 函数,用于在系统执行结束时将最终页面发送到 Web 浏览器。这允许您使用自己的显示方法。请注意,您需要使用 $this->CI =& get_instance() 引用 CI 超级对象,然后通过调用 $this->CI->output->get_output() 可以获得最终数据

缓存覆盖

使您能够调用自己的函数,而不是输出类中的 _display_cache() 函数。这允许您使用自己的缓存显示机制。

post_system

在最终呈现的页面发送到浏览器后调用,在最终数据发送到浏览器后系统执行结束时调用。

所以

我认为您正在寻找的是display_override

但你也可以看看这里CodeIgniter 必须在最后一步加载视图吗?

于 2013-05-13T09:02:47.807 回答