2011-10-04 14 views
5

Używam biblioteki szablonów dla CodeIgniter, http://williamsconcepts.com/ci/codeigniter/libraries/template/reference.html, a teraz chcę zaimplementować niestandardowe strony błędów. Znalazłem jedną metodę z użyciem MY_Routera rozszerzającego domyślny router: http://maestric.com/doc/php/codeigniter_404, ale który leczy tylko 404 błędy. Chcę, aby wszystkie błędy wyświetlały prostą stronę przyjazną dla użytkownika, w tym błędy bazy danych itp., I chcę, aby przechodziła ona przez kontroler, częściowo dlatego, że mogę korzystać z biblioteki szablonów, a częściowo, aby zaimplementować funkcję e-mail, aby wysłać informacje o wystąpieniu błędu.Własne strony błędów z szablonami w CodeIgniter

Ktoś zapytał o rozszerzenie funkcjonalności powyższej metody MY_Router o inne błędy, takie jak error_db, ale nie dostałem odpowiedzi od autora, więc sprawdzam tutaj, czy ktoś wie, jak to zrobić, na wzór powyższa metoda lub jakikolwiek inny prosty sposób jej osiągnięcia. Zauważ, że jestem początkującym, więc nie zakładaj zbyt wiele na temat mojej znajomości podstawowych funkcji CodeIgniter :-)

+0

zegarek w was '/ aplikacja lication/errors/error_ * 'files, są szablony db error, 404, php error i ogólne błędy, dzięki czemu możesz pracować z nim – user973254

+2

i możesz rozszerzyć klasy podstawowe CI (dokładnie musisz rozszerzyć CI_Exceptions) jak wyjaśniono [tutaj] (http://codeigniter.com/user_guide/general/core_classes.html) – user973254

+0

Wiem o plikach błędów, ale nie wiem, jak sprawić, by korzystały z biblioteki szablonów, aby wyglądały jak reszta strony. W jaki sposób rozszerzyć klasy podstawowe IK, aby to osiągnąć? Proszę podać odpowiedź z przykładami ... – Anders

Odpowiedz

1

Robię to w ten sposób: Tworzę własną stronę błędów i za każdym razem, gdy powinienem rzucić 404 błąd, faktycznie ładuję moją stronę 404.

więc powiedzieć mój domyślny kontroler jest site.php, mój site.php wygląda następująco:

<?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 */ 

więc służę home/404.php gdy wystąpi błąd. tj. nie zezwalam CodeIgniter na wywoływanie show_404();, dlatego strona 404 wygląda jak każda inna strona.

p.s. Zakładam, że śledziłeś ładny tutorial w witrynie CodeIgniter.

+5

To nadal będzie wysyłać kod HTTP 200. Po prostu daje iluzję posiadania 404. – Jeremy

2

Utworzono rozszerzenie klasy Wyjątki. W tym rozszerzeniu zastąpiłem metodę $this->Exceptions->show_error();, która jest używana przez funkcję CI z zakresu show_error().

po wywołaniu show_error('User is not logged in', 401); ta niestandardowa metoda najpierw szuka pliku error_ $status_code. W przypadku powyższego przykładu będzie szukał pliku error_401.php.

Gdy ten plik nie istnieje, po prostu załaduje plik error_general.php, np. Domyślny $this->Exceptions->show_error();.

W twoim przypadku możesz użyć poniższego kodu do użycia w swojej bibliotece, kontrolerze lub cokolwiek innego, co powinno spowodować błąd.

<?php 
 

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

 
?>

Plik error_401.php niż powinna wyglądać następująco:

<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

Najprostszym sposobem na tworzenie własnych stron błędów jest edytować pliki w /application/views/errors/html/error_*.php takich jak error_404.php (na błędy 404) error_db.php (dla błędów bazy danych) i error_general.php (dla większości innych błędów).

Ponieważ te strony znajdują się w katalogu application, możesz dostosować je do własnych potrzeb.

Jeśli normalny szablon widoku wygląda mniej więcej tak:

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

można dostosować to w twoich /application/views/errors/html/error_*.php plików tak:

<?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'; ?> 

Zauważ, że nie jest już używana widoki, ale zamiast tego zawiera pliki widoku dla header & footer.

Inną rzeczą, aby pamiętać:

W widoku header, ja przechodząc $data obiekt, który zawiera $data['page_title']. Ponieważ strony błędów nie używają widoków, musisz dodać dowolne zmienne, które normalnie przejdziesz do widoku, stąd obecność $page_title.

0
config/routes.php 

edit

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

typ tutaj kontroler na przykład błąd

stworzyć funkcjiIndeks i obciążenie swój widok