Рассмотрим довольно простой и быстрый способ создания контроллера для обрабатки 404 ошибок.
Данный скрипт предназначен для обработки 404 ошибки как в том случае, если у Вас полностью отсутствует контроллер, так и при условии если контроллер есть, но в нем не описан необходимый метод.
system/application/controllers/error.php
[sourcecode language=’php’]error_404();function _validate_request($segments)
{
// Сделать необходимый контроллер в корневой папке?
if (file_exists(APPPATH.’controllers/’.$segments[0].EXT))
{
return $segments;
}
// Является контроллером в подпапке?
if (is_dir(APPPATH.’controllers/’.$segments[0]))
{
// Установите каталог и удалите это из части массива
$this->set_directory($segments[0]);
$segments = array_slice($segments, 1);
if (count($segments) > 0)
{
// Сделать необходимый контроллер в конкретной подпапке?
if ( ! file_exists(APPPATH.’controllers/’.$this->fetch_directory().$segments[0].EXT))
{
return $this->error_404();
}
}
else
{
$this->set_class($this->default_controller);
$this->set_method(‘index’);
// Сделать значение контроллера по умолчанию в необходимой подпапке?
if ( ! file_exists(APPPATH.’controllers/’.$this->fetch_directory().$this->default_controller.EXT))
{
$this->directory = »;
return array();
}
}
return $segments;
}
// не находит необходимый контроллер…
return $this->error_404();
}
function error_404()
{
$this->directory = «»;
$segments = array();
$segments[] = $this->error_controller;
$segments[] = $this->error_method_404;
return $segments;
}
function fetch_class()
{
// изменить, если метод отсутствует в классе
// класс к ошибке и метод к error_404
$this->check_method();
return $this->class;
}
function check_method()
{
$ignore_remap = true;
$class = $this->class;
if (class_exists($class))
{
// метод для этого класса
$class_methods = array_map(‘strtolower’, get_class_methods($class));
// игнорируем контроллер using _remap()
if($ignore_remap && in_array(‘_remap’, $class_methods))
{
return;
}
if (! in_array(strtolower($this->method), $class_methods))
{
$this->directory = «»;
$this->class = $this->error_controller;
$this->method = $this->error_method_404;
include(APPPATH.’controllers/’.$this->fetch_directory().$this->error_controller.EXT);
}
}
}
function show_404()
{
include(APPPATH.’controllers/’.$this->fetch_directory().$this->error_controller.EXT);
call_user_func(array($this->error_controller, $this->error_method_404));
}
}
/* Окончание файла MY_Router.php */
/* Местонахождение: ./system/application/libraries/MY_Router.php */[/sourcecode]
Примечания:
Работа с контроллером через remap().
Они проигнорированы, так как нет возможности сработала 404 или нет. В тоже время, если Вы все же намерены вызывать 404 ошибку из контроллера при отсутствии соответствующего метода замените $ignore_remap на false.
Называем вручную 404 страницу
[sourcecode language=’php’]$this->router->show_404();[/sourcecode]Пример случая использования: /store/product/3 вызван, при этом product() существует, но продукта 3 не существует.
Обратите внимание: обязательно внутри метода «с ошибкой» замените все использования $this на $CI
[sourcecode language=’php’]$CI =& get_instance();$CI->output->set_status_header(‘404’);[/sourcecode]
Автор: Jérôme Jaglale
Источник: maestric.com