2009-05-11 1 views
5

У CodeIgniter есть /system/application/errors/error_404.php, который отображается, когда есть 404 из-за того, что фактически является условием «контроллер не найден». Однако для моего проекта мне действительно нужно, чтобы эта ошибка обрабатывалась точно так же, как когда отсутствует класс в классе контроллера. В этом случае я показываю обычный вид с симпатичной «страницей не найденной: возможно, вы имели в виду эту? ...» страницу с навигацией с помощью базы данных и т. Д.Как создать достойный обработчик ошибок 404 для CodeIgniter?

Мои мысли, что я мог бы сделать одну из двух вещей :

  1. Создать header("Location: /path/to/error_page") вызов для перенаправления на существующую (или специальный) контроллера 404 обработчика
  2. Добавить какой-то маршрутизатор по умолчанию, чтобы справиться с этим.

Каков наилучший способ достижения требуемого результата? Есть ли какие-то подводные камни, на которые нужно следить?

ответ

2

Я использую CodeIgniter с Smarty. У меня есть дополнительная функция в классе Smarty с именем notfound(). Вызов notfound() устанавливает правильное расположение заголовка на страницу 404, а затем отображает шаблон 404. Шаблон имеет переопределяемый заголовок и сообщение, поэтому он очень универсален. Вот некоторые примеры кода:

Smarty.class.php 

function not_found() { 
header('HTTP/1.1 404 Not Found'); 

if (!$this->get_template_vars('page_title')) { 
    $this->assign('page_title', 'Page not found'); 
    } 

    $this->display('not-found.tpl'); 
    exit; 
} 

В контроллере я могу сделать что-то вроде этого:

$this->load->model('article_model'); 
$article = $this->article_model->get_latest(); 

if ($article) { 
    $this->smarty->assign('article', $article); 
    $this->smarty->view('article'); 
} else { 
    $this->smarty->assign('title', Article not found'); 
    $this->smarty->not_found(); 
} 

Кроме того, я могу изменить код в /system/application/error/error_404.php на:

$CI =& get_instance(); 
$CI->cismarty->not_found(); 

Он отлично работает, использует небольшое количество кода и не дублирует функциональность 404 для разных типов отсутствующих объектов.

Я думаю, что вы могли бы сделать аналогичную вещь со встроенными представлениями CodeIgniter. Важно, чтобы выплескивать заголовок, прежде чем делать свой материал.

Обновление: Я использую пользовательский Smarty оболочку, подобную той, которая описана здесь:

Using Smarty with CodeIgniter

Смежные вопросы