Route to multiple sub folders in CodeIgniter
This code was already on the internet but i modified it to make it work for codeigniter 2.1
See the old source here: http://glennpratama.wordpress.com/2009/10/20/multi-level-subfolder-for-controller-in-codeigniter/
Make a new file MY_Router.php in the application/core directory, copy the following code in it:
<?php/* * Custom router function v 0.2 * * Add functionality : read into more than one sub-folder * */Class MY_Router extends CI_Router{ Function MY_Router() { parent::__construct(); } 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); /* ----------- ADDED CODE ------------ */ while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0])) { // Set the directory and remove it from the segment array //$this->set_directory($this->directory . $segments[0]); if (substr($this->directory, -1, 1) == '/') $this->directory = $this->directory . $segments[0]; else $this->directory = $this->directory . '/' . $segments[0]; $segments = array_slice($segments, 1); } if (substr($this->directory, -1, 1) != '/') $this->directory = $this->directory . '/'; /* ----------- END ------------ */ if (count($segments) > 0) { if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/'.$segments[0].EXT)) { show_404($this->fetch_directory().$segments[0]); } } 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; } show_404($segments[0]); }}
"Out of the Box" codeigniter does not support multiple subdirectory levels in your controllers directory, just one.
There is a way to extend the routing class to support this, check this blog entry.
For Codeigniter 3.x compatibility: The usage of the EXT constant has been deprecated since dropping support for PHP 4. There’s no longer a need to maintain different filename extensions and in this new CodeIgniter version (3.x), the EXT constant has been removed. Use just ‘.php’ instead.
So the new MY_Router.php:
<?php/* * Custom router function v 0.3 * * Add functionality : read into more than one sub-folder * Compatible with Codeigniter 3.x * */Class MY_Router extends CI_Router{ Function MY_Router() { parent::__construct(); } function _validate_request($segments) { if (file_exists(APPPATH.'controllers/'.$segments[0].".php")) { return $segments; } if (is_dir(APPPATH.'controllers/'.$segments[0])) { $this->set_directory($segments[0]); $segments = array_slice($segments, 1); /* ----------- ADDED CODE ------------ */ while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0])) { // Set the directory and remove it from the segment array //$this->set_directory($this->directory . $segments[0]); if (substr($this->directory, -1, 1) == '/') $this->directory = $this->directory . $segments[0]; else $this->directory = $this->directory . '/' . $segments[0]; $segments = array_slice($segments, 1); } if (substr($this->directory, -1, 1) != '/') $this->directory = $this->directory . '/'; /* ----------- END ------------ */ if (count($segments) > 0) { if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/'.$segments[0].".php")) { show_404($this->fetch_directory().$segments[0]); } } else { $this->set_class($this->default_controller); $this->set_method('index'); if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/' .$this->default_controller.".php")) { $this->directory = ''; return array(); } } return $segments; } show_404($segments[0]); }}