2011-12-07 22 views
16

Tôi đã làm việc với CodeIgniter cho khá trong một giờ và Tôi hiện đang làm một dự án cho một khách hàng mà muốn có một tùy chỉnh trang. Mọi thứ đều ổn và 404_override nó hoạt động rất tốt.CodeIgniter 2.1 vấn đề với show_404() và 404_override

Sự cố của tôi xuất hiện khi khách truy cập cố gắng truy cập bài viết không tồn tại Tôi muốn gọi hàm show_404() nhưng điều này cho tôi thấy trang 404 "out of box" 404 chứ không phải trang 404_override.

Tôi đã thấy một số bản sửa lỗi cho các phiên bản cũ hơn, nhưng tôi không thể làm cho nó hoạt động trong 2.1. Vì vậy, nếu bất cứ ai có thể giúp tôi ra khỏi điều này tôi sẽ thực sự biết ơn.

Trả lời

20

Chuyển hướng là sạch nhất; tải chế độ xem cũng có thể hoạt động.

Vấn đề ở đây là show_404() thường được gọi là SAU bộ điều khiển của bạn đã được tải (một cái gì đó phải cho biết nó hiển thị 404 sau khi tất cả). CI không thích tải một bộ điều khiển thứ hai tại thời điểm đó, đó là trở ngại chính.

Tùy chọn tốt nhất của bạn có thể là mở rộng hàm show_404() trong lớp Exceptions để chuyển hướng đến tuyến 404 của bạn. Nếu không có một chuyển hướng, bạn sẽ bị mắc kẹt khi hiển thị một khung nhìn hoặc thứ gì đó mà bạn biết có tất cả "dữ liệu bổ sung" cần trước khi gọi 404 (hoặc tôi đoán bạn cũng có thể tải nó trong lớp Exceptions). Nó có thể thực sự phức tạp trong một số quan điểm năng động.

Bạn rõ ràng muốn một thứ gì đó tiên tiến hơn là chỉ chỉnh sửa mẫu 404 trong thư mục lỗi. Tôi đã có vấn đề cố gắng để truy cập get_instance() từ tập tin đó, như đôi khi nó được nạp trước khi bộ điều khiển được xây dựng. Vì vậy, hãy cẩn thận nếu bạn cố gắng mà;)

Cập nhật: Dưới đây là một ví dụ làm việc của việc mở rộng show_404() để tải một cái nhìn

<?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; 
    } 
} 
+1

Cảm ơn bạn đã trả lời. trước hết tôi nghe nói rằng chuyển hướng sẽ là một ý tưởng tồi, vì nó sẽ không hiển thị 404 trên trang chính xác (thay vào đó tất cả 404 sẽ được hiển thị như đang diễn ra trên ví dụ.com/404) mà nên là một ý tưởng tồi. Khi bạn viết, những gì tôi thực sự muốn là có thể tải chế độ xem bên trong lỗi 404 để bao gồm điều hướng, đầu trang và chân trang của tôi. SO chỉnh sửa mẫu 404 sẽ là một tùy chọn, nếu tôi có thể sử dụng chế độ xem. Tôi đã cố gắng get_instance mà không có bất kỳ may mắn, tìm thấy một blogpost về nó nhưng did't giúp đỡ (nó là từ năm 2008). –

+0

Cảm ơn bạn rất nhiều. Với đoạn mã nhỏ đó đã giúp tôi rất nhiều. Tôi thậm chí đã thử bản thân mình để tải bộ điều khiển tôi thực hiện để hiển thị 404 của tôi, nhưng có vẻ như $ CI-> load-> không hỗ trợ bộ điều khiển. (Cái tôi đang sử dụng cho 404_override). Nhưng điều này chỉ làm cho ngày của tôi :) –

+0

Có thể refactor bộ điều khiển 404_override của bạn chỉ đơn giản gọi show_404(), và có hàm show_404() tải tất cả dữ liệu bạn cần. Giữ nó DRY người đàn ông ...;) – landons

-1

tôi đang tìm kiếm điều tương tự, nhưng không tìm thấy các giải pháp khá dài như tạo bộ điều khiển lỗi riêng và lớp ngoại lệ hoặc chỉ đơn giản là chuyển hướng đến trang 404 (không phải là ngữ nghĩa tốt).

Vì vậy, tôi đã nghiên cứu bit về cách CI gọi '404_override' tuyến đường nội bộ. Đây là giải pháp tôi đến với:

// Override show_404 method 
function show_404(){ 
    // Load Router and Core classes. 
    $RTR =& load_class('Router', 'core'); 

    // Get class and method for 404 from routes.php 
    $x = explode('/', $RTR->routes['404_override']); 
    $class = $x[0]; 
    $method = (isset($x[1]) ? $x[1] : 'index'); 

    // Get current class and method for callback 
    $callback_class = $RTR->fetch_class(); 
    $callback_method = $RTR->fetch_method(); 
    // Can also log here, using callback class and method. 

    // Create object for callback 
    $CI = new $callback_class; 
    call_user_func_array(array(&$CI, $method), array_slice(array($class,$method), 2)); 
} // End! 

Thêm chức năng này trong hệ thống /lõi/CodeIgniter.php tập tin. Điều này sẽ ghi đè lên chức năng show_404. Bạn có thể gọi nó từ bộ điều khiển của bạn và nó sẽ gọi là '404_override' tuyến đường được đưa ra trong tập tin routes.php.

+1

Không có lõi hack xin vui lòng :) – anupam

0
function show_404($page = '', $log_error = TRUE) 
{ 
    if ($log_error) 
    { 
     log_message('error', '404 Page Not Found --> '.$page); 
    } 
    redirect(base_url().index_page().'/controller/error_page'); 
      //OR 
      //redirect('SOME URL'); 

    exit; 
} 
2

Cách tiếp cận nhanh của tôi để giải quyết vấn đề là tạo chức năng trong tệp trợ giúp được tải tự động trong dự án tôi đang làm việc. Trình trợ giúp này chỉ chuyển hướng đến trang 404 tùy chỉnh. Vì vậy, tôi chỉ cần gọi show_my_404() thay vì show_404()

function show_my_404(){ 
    //Using 'location' not work well on some windows systems 
    redirect('controller/page404', 'location'); 
} 
Các vấn đề liên quan