CodeIgniter 2.1 问题,包含 show_404() 和 404_override

我已经使用CodeIgniter很长一段时间了,我目前正在为一个想要自定义404页面的客户做一个项目。一切都很好,效果很好。404_override

当访问者试图访问不存在的文章时,我的问题来了,我想调用该函数,但这向我显示了404页面,而不是404_override中编写的页面。show_404()"out of box"

我已经看到了一些针对旧版本的修复,但我无法让它在2.1中工作。因此,如果有人能帮助我摆脱这种情况,我将不胜感激。


答案 1

重定向是最干净的;加载视图也可以工作。

这里的问题是,show_404()通常在控制器加载后调用(毕竟必须告诉它显示404)。CI不喜欢在这一点上加载第二个控制器,这是主要的障碍。

最好的选择可能是扩展 Exceptions 类中的 show_404() 函数以重定向到 404 路由。如果没有重定向,您将无法显示视图或您知道在调用404之前具有所需的所有“额外数据”的内容(或者我想您也可以将其加载到 Exceptions类中)。在某些动态视图中,它可能会变得非常复杂。

您显然想要一些更高级的东西,而不仅仅是在错误文件夹中编辑404模板。我在尝试从该文件访问get_instance()时遇到问题,因为有时它在构建控制器之前加载。因此,如果您尝试该;),请小心

更新:下面是扩展 show_404() 函数以加载视图的工作示例

<?php
// application/core/MY_Exceptions.php
class MY_Exceptions extends CI_Exceptions {

    public function show_404()
    {
        $CI =& get_instance();
        $CI->load->view('my_notfound_view');
        echo $CI->output->get_output();
        exit;
    }
}

答案 2

我解决问题的快速方法是在我正在处理的项目中的自动加载帮助程序文件中创建一个函数。此帮助程序仅重定向到自定义 404 页面。所以我只是打电话而不是show_my_404()show_404()

function show_my_404(){   
    //Using 'location' not work well on some windows systems
    redirect('controller/page404', 'location');  
}

推荐