2010-10-27 57 views
0

嗨我在Codeigniter中遇到钩子问题。我已经为'post_controller'写了挂钩,它调用Controller函数并加载模板(布局视图模板)。它对所有正常情况都适用。但现在我需要做一个自定义的错误页面。所以我重写show_404()函数。在这个函数中,我使用get_instance();函数获取CI对象。使用CI对象我调用一个函数来设置布局参数。现在我遇到的问题是,当我尝试在我的自定义异常类的show_404()函数中加载视图时,视图是没有得到加载作为post_controller挂钩没有得到执行。我尝试了很多东西,但失败了。 任何人都可以请建议我任何方式来做到这一点。或任何其他方式来呈现自定义404页面。强制CodeIgniter执行钩子功能?

function show_404($page = ''){ // error page logic 

    header("HTTP/1.1 404 Not Found"); 
$heading = "404 Page Not Found"; 
    $message = "The page you requested was not found "; 
$CI =& get_instance(); 
$metadata[AppContants::META_TITLE] = '404 Page Not Found | Door and Window'; 
$metadata[AppContants::META_KEYWORDS] = ''; 
$metadata[AppContants::META_DESCRIPTION] = ''; 
$CI->setMeta($metadata); 
$params['LAYOUT_MAINVIEW']='404_page'; 
$CI->renderView($params);// this is the function in my controller which sets the parameter for my template.Or it would also be very helpful if i can load the view directly as show below. 
$CI->load->view('404_page'); // Loading view directly. 

} 

回答

0

看看this link。本质上你可能想创建一个错误控制器,然后子类CI_Router将所有错误请求路由到该控制器,在那里你可以添加钩子或加载你选择的控制器并间接执行钩子。

编辑:问题很可能是您发送的响应标题(404) - 很多浏览器会用自己的404页面替换服务器返回的任何内容。尝试删除header()电话,看看会发生什么。 $CI->load->view()应该按预期工作。另外,如果renderView()不是全局函数,则可能需要使用对包含该方法的特定控制器的引用。

+0

谢谢mway的链接。我也经历过这之前也。我想这是在控制器处于路由级别时执行,即在索引文件执行后。我的问题是,我需要调用show_404()函数在许多基于数据操作的条件下,即如果数据被返回或不是。因此,我已经去覆盖show_404()。如果我在我的视图加载后使用$ CI-> output-> get_output()函数show_404()函数将视图内容打印在数组()中,问题是我无法呈现视图内容。 – sagar27 2010-10-27 06:41:33

+0

你能发表一些代码吗? '$ this-> load-> view(...)'不应该给你一个问题... – mway 2010-10-27 06:48:57

+0

我已经更新我的问题它将如何有用。请让我知道你是否需要一些更多的细节代码。 – sagar27 2010-10-27 07:23:54