CodeIgniter default controller in a sub directory not working
For each sub-folder in your controllers folder you must specify a default controller in routes.php
. The built in $route['default_controller']
will not work for sub-folders.
e.g: For setting the default controller for you folder
sub-folder to home
add the following to your /application/config/routes.php
file:
$route['folder'] = "folder/home";
which means http://mysite.com/folder/
is the same as http://mysite.com/folder/home
as URL.
You can extend system router as per requirements,
- Create My_Router.php in
application/core/
directory
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */
/**
* Description of My_Router
*
* @author girish
*/
class My_Router extends CI_Router {
//put your code here
public function __construct($routing = NULL) {
parent::__construct($routing);
}
protected function _set_default_controller() {
if (empty($this->default_controller)) {
show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.');
}
// Is the method being specified?
if (sscanf($this->default_controller, '%[^/]/%[^/]/%s', $directory, $class, $method) !== 3) {
$method = 'index';
}
if (is_dir(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . $directory) === true) {
if (!file_exists(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . $directory . DIRECTORY_SEPARATOR . ucfirst($class) . '.php')) {
// This will trigger 404 later
return;
}
$this->set_directory($directory);
$this->set_class($class);
$this->set_method($method);
} else {
if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) {
$method = 'index';
}
if (!file_exists(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . ucfirst($class) . '.php')) {
// This will trigger 404 later
return;
}
$this->set_class($class);
$this->set_method($method);
}
// Assign routed segments, index starting from 1
$this->uri->rsegments = array(
1 => $class,
2 => $method
);
log_message('debug', 'No URI present. Default controller set.');
}
}
and overwrite _set_default_controller()
from custom method, it will work from sub-directory controller as well root directory controller.
And in application/config/routes.php
if you need sub-directory default controller, then
$route['default_controller'] = "admin/admins/login";
- admin -- folder
- admins -- controller
- login -- method
if you need root-directory default controller, then
$route['default_controller'] = "welcome/index";
- welcome -- controller
- index -- method
not sure it will work in all versions, but tested in CI3.0.6
If you want to stay flexible you need to pass on everything after the starting folder (in application/config/config.php
):
$route['home'] = "home/whatever";
$route['home/(:any)'] = "home/whatever/$1";
Add this line in application/config/routes.php
$this->set_directory( "yourfoldername" );
$route['default_controller'] = 'controller name';