2011-10-04 35 views
5

Tôi đang sử dụng thư viện mẫu cho CodeIgniter, http://williamsconcepts.com/ci/codeigniter/libraries/template/reference.html và bây giờ tôi cũng muốn triển khai các trang lỗi tùy chỉnh. Tôi tìm thấy một phương pháp liên quan đến MY_Router mở rộng bộ định tuyến mặc định: http://maestric.com/doc/php/codeigniter_404 nhưng chỉ xử lý lỗi 404. Tôi muốn tất cả các lỗi hiển thị một trang thân thiện với người dùng đơn giản, bao gồm lỗi cơ sở dữ liệu, và tôi muốn nó đi qua bộ điều khiển, một phần vì vậy tôi có thể sử dụng thư viện mẫu và một phần để tôi có thể thực hiện chức năng email thông tin về lỗi xảy ra.Trang lỗi tùy chỉnh có mẫu trong CodeIgniter

Ai đó hỏi về việc mở rộng chức năng của phương pháp MY_Router ở trên cho các lỗi khác, như error_db, nhưng không có câu trả lời từ tác giả, vì vậy tôi quay lại đây để xem có ai biết cách thực hiện điều này hay không phương pháp trên hoặc bất kỳ cách đơn giản nào khác để đạt được nó. Xin lưu ý rằng tôi là người mới, vì vậy đừng cho rằng quá nhiều về kiến ​​thức của tôi về chức năng CodeIgniter cơ bản :-)

+0

đồng hồ trong bạn '/ ứng dụng lication/errors/error_ * 'files, có lỗi mẫu db, 404, lỗi php và lỗi chung, vì vậy bạn có thể làm việc với nó – user973254

+2

và bạn có thể mở rộng các lớp lõi CI (chính xác bạn cần mở rộng CI_Exceptions) như được giải thích [ở đây] (http://codeigniter.com/user_guide/general/core_classes.html) – user973254

+0

Tôi biết về các tệp lỗi, nhưng tôi không biết cách làm cho chúng sử dụng thư viện mẫu để làm cho chúng giống như phần còn lại của trang web. Làm thế nào tôi sẽ mở rộng các lớp lõi CI để đạt được điều này? Vui lòng cung cấp câu trả lời kèm theo các ví dụ ... – Anders

Trả lời

1

Tôi làm như sau: Tôi tạo trang lỗi của riêng mình và bất cứ khi nào tôi nên ném 404 lỗi, tôi thực sự tải trang 404 của mình.

Vì vậy, nói điều khiển mặc định của tôi là site.php, site.php của tôi trông như thế này:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Site extends CI_Controller { 

    public function index() 
    { 
     $this->load->view('welcome_message'); 
    } 

    public function view($page = "home" , $function = "index") 
    { 
     do_something(); 
     if($status == "404") 
     { 
      $function = "404"; 
     } 
     $this->load->view('templates/header', $data); 
     $this->load->view($page.'/'.$function, $data);  
     $this->load->view('templates/footer', $data); 
    } 




} 

/* End of file welcome.php */ 
/* Location: ./application/controllers/welcome.php */ 

Vì vậy, tôi phục vụ cho home/404.php bất cứ khi nào gặp lỗi. tức là, tôi không cho phép CodeIgniter gọi show_404(); do đó trang 404 trông giống như bất kỳ trang nào khác.

p.s. Tôi cho rằng bạn đã làm theo hướng dẫn tốt đẹp trong trang web của CodeIgniter.

+5

Cách thức này sẽ vẫn gửi Mã HTTP 200. Nó chỉ mang đến cho ảo giác về việc có 404. – Jeremy

2

Tôi đã tạo tiện ích mở rộng cho lớp Ngoại lệ. Trong phần mở rộng này, tôi đã thay thế phương thức $this->Exceptions->show_error();, phù thủy được sử dụng bởi hàm show_error() của CI.

khi tôi gọi show_error('User is not logged in', 401); phương pháp tùy chỉnh này đang tìm kiếm một lỗi error_ $status_code tệp trước. Trong trường hợp ví dụ trên, nó sẽ tìm kiếm một tập tin error_401.php.

Khi tệp này không tồn tại, nó chỉ tải tệp error_general.php, như mặc định $this->Exceptions->show_error();.

Trong trường hợp của bạn, bạn có thể sử dụng mã sau để sử dụng trong thư viện, bộ điều khiển hoặc bất kỳ thứ gì sẽ phát sinh lỗi.

<?php 
 

 
if(!(isset($UserIsLoggedin))){ 
 
    $this->load->view('template/header'); 
 
    show_error('User is not logged in', 401); 
 
    $this->load->view('template/footer'); 
 
} 
 

 
?>

tập tin error_401.php của bạn nên hơn trông như thế này:

<div id="container"> 
 
\t <h1><?php echo 'This is an 401 error'; ?></h1> 
 
\t <?php echo $message; ?> 
 
</div>

/application/core/MY_Exceptions.php:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
 

 
class MY_Exceptions extends CI_Exceptions 
 
{ 
 
\t 
 
\t function show_error($heading, $message, $template = 'error_general', $status_code = 500) 
 
\t { \t \t 
 
\t \t if((!isset($template)) || ($template == 'error_general')){ 
 
\t \t \t if(file_exists(APPPATH.'errors/error_'.$status_code.'.php')) { 
 
\t \t \t \t $template = 'error_'.$status_code; 
 
\t \t \t } 
 
\t \t }  \t 
 
\t \t 
 
\t \t if (!isset($status_code)) $status_code = 500; 
 
\t \t 
 
\t \t set_status_header($status_code); 
 

 
\t \t $message = '<p>'.implode('</p><p>', (! is_array($message)) ? array($message) : $message).'</p>'; 
 

 
\t \t if (ob_get_level() > $this->ob_level + 1) 
 
\t \t { 
 
\t \t \t ob_end_flush(); 
 
\t \t } 
 
\t \t ob_start(); \t \t 
 
\t \t \t \t 
 
\t \t include(APPPATH.'errors/'.$template.'.php'); 
 
\t \t $buffer = ob_get_contents(); 
 
\t \t ob_end_clean(); 
 
\t \t return $buffer; 
 
\t } 
 
\t 
 
} 
 

 
?>

1

Cách đơn giản nhất để tạo ra các trang lỗi tùy chỉnh là để chỉnh sửa các tập tin tại /application/views/errors/html/error_*.php như error_404.php (đối với 404s), error_db.php (đối với các lỗi cơ sở dữ liệu) và error_general.php (đối với hầu hết các lỗi khác).

Vì các trang này nằm trong thư mục application của bạn, bạn có thể tùy chỉnh chúng theo nhu cầu của mình.

Nếu bạn xem mẫu bình thường trông giống như sau:

<?php $this->load->view('includes/header'); ?> 
... 
... 
<?php $this->load->view('includes/footer'); ?> 

Bạn có thể thích ứng này trong /application/views/errors/html/error_*.php tập tin của bạn như sau:

<?php 
    $page_title = $heading; 
    include VIEWPATH.'includes'.DIRECTORY_SEPARATOR.'header.php'; 
?> 
<div class="well"> 
    <h1><?php echo $heading; ?></h1> 
    <?php echo $message; ?> 
</div> 
<?php include VIEWPATH.'includes'.DIRECTORY_SEPARATOR.'footer.php'; ?> 

Chú ý rằng chúng tôi không còn sử dụng quan điểm, nhưng thay vào đó bao gồm các tệp xem cho header & footer.

Một điều cần lưu ý:

Trong giao diện header, tôi đi qua một đối tượng $data trong đó bao gồm $data['page_title']. Vì các trang lỗi không sử dụng chế độ xem, bạn phải thêm bất kỳ biến nào mà bạn thường chuyển vào chế độ xem, do đó có sự hiện diện của $page_title.

0
config/routes.php 

chỉnh sửa

$route['404_override'] = ''; 

loại ở đây điều khiển của bạn ví dụ Lỗi

tạo chức năngindextải bạn xem

Các vấn đề liên quan