Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CodeIgniter default controller in a sub directory not working

My default_controller in the routes configuration is set as "home.php".

I have a sub directory for my controllers, lets call it "folder". So if I visit http://mysite.com/folder/, the default controller "folder/home.php" should be called right?

However for some reason this doesn't work, I get a 404. Visiting http://mysite.com/folder/home or http://mysite.com/folder/home/index works as expected. In addition to this, the default controller works in the root directory (http://mysite.com loads home.php).

Any ideas, has anyone else experienced this? I can't get my head around it - it would appear to be a CI issue but I can't find anybody else having the same problem.

The documentation, from the way I understand it at least, suggests that this should work fine: http://codeigniter.com/user_guide/general/controllers.html#subfolders

Setting the default controller to "folder/home.php" means that http://mysite.com/folder/ works fine as expected. Except for I want the default controller to just be "home.php" - whether in the root or in a sub directory, home.php within that directory should be loaded, as the documentation suggests.

Cheers

like image 221
Mike Avatar asked Jun 30 '11 01:06

Mike


3 Answers

You can extend system router as per requirements,

  1. 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

like image 28
Girish Avatar answered Nov 11 '22 07:11

Girish


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.

like image 102
Yasser Souri Avatar answered Nov 11 '22 06:11

Yasser Souri


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";
like image 4
movAX13h Avatar answered Nov 11 '22 08:11

movAX13h