Created
November 20, 2012 10:18
-
-
Save gin1314/4117125 to your computer and use it in GitHub Desktop.
PHP: CI: custom 404 page script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | |
define('EXT', '.php'); | |
class MY_Router extends CI_Router { | |
var $error_controller = 'error'; | |
var $error_method_404 = 'error_404'; | |
function __construct() | |
{ | |
parent::__construct(); | |
} | |
// this is just the same method as in Router.php, with show_404() replaced by $this->error_404(); | |
function _validate_request($segments) | |
{ | |
// Does the requested controller exist in the root folder? | |
if (file_exists(APPPATH.'controllers/'.$segments[0].EXT)) | |
{ | |
return $segments; | |
} | |
// Is the controller in a sub-folder? | |
if (is_dir(APPPATH.'controllers/'.$segments[0])) | |
{ | |
// Set the directory and remove it from the segment array | |
$this->set_directory($segments[0]); | |
$segments = array_slice($segments, 1); | |
if (count($segments) > 0) | |
{ | |
// Does the requested controller exist in the sub-folder? | |
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'); | |
// Does the default controller exist in the sub-folder? | |
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) | |
{ | |
$this->directory = ''; | |
return array(); | |
} | |
} | |
return $segments; | |
} | |
// Can't find the requested controller... | |
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() | |
{ | |
// if method doesn't exist in class, change | |
// class to error and method to error_404 | |
$this->check_method(); | |
return $this->class; | |
} | |
function check_method() | |
{ | |
$ignore_remap = true; | |
$class = $this->class; | |
if (class_exists($class)) | |
{ | |
// methods for this class | |
$class_methods = array_map('strtolower', get_class_methods($class)); | |
// ignore controllers 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)); | |
} | |
} | |
/* End of file MY_Router.php */ | |
/* Location: ./application/libraries/MY_Router.php */ | |
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | |
class Error extends CI_Controller { | |
public function __construct() | |
{ | |
parent::__construct(); | |
} | |
function error_404() | |
{ | |
$this->output->set_status_header('404'); | |
echo "404 - not found"; | |
} | |
} | |
/* End of file error.php */ | |
/* Location: ./application/controllers/error.php */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment