Welcome Guest, Not a member yet? Register   Sign In
Multi-level subfolders for controllers in CI 2.x
#11

[eluser]jjDeveloper[/eluser]
I came up with an alternative to Damien k.'s method below after I coded my view example above.

Here it will only throw a loop into my added code if it detects a URI depth that is above 2, otherwise it proceeds as it normally would.

Give it a try.


Code:
protected function _validate_request($segments)
{
  if (count($segments) === 0)
  {
   return $segments;
  }

  // Does the requested controller exist in the root folder?
  if (file_exists(APPPATH.'controllers/'.$segments[0].'.php'))
  {
   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]);

                        $segCnt = count($segments);
   $segments = array_slice($segments, 1);
                      if($segCnt > 2) {
                        $this->DoSubFold = TRUE;

                        for($ct = 2; $ct <  $segCnt; $ct++) {
                              if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT)) {
                                  $this->set_directory($this->fetch_directory() . $segments[0]);

                                if(  $ct == $segCnt) {
                                    show_404($this->fetch_directory().$segments[0]);
                                }
                                
                                  $segments = array_slice($segments, 1);
                                
                                
                                
                              }
                        }
                        return $segments;

                      }

   if (count($segments) > 0)
   {
    // Does the requested controller exist in the sub-folder?
    if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php'))
    {
     if ( ! empty($this->routes['404_override']))
     {
      $x = explode('/', $this->routes['404_override']);
      $this->set_directory('');
      $this->set_class($x[0]);
      $this->set_method(isset($x[1]) ? $x[1] : 'index');

      return $x;
     }
     else
     {
      show_404($this->fetch_directory().$segments[0]);
     }
    }
   }
   else
   {
    // Is the method being specified in the route?
    if (strpos($this->default_controller, '/') !== FALSE)
    {
     $x = explode('/', $this->default_controller);
     $this->set_class($x[0]);
     $this->set_method($x[1]);
    }
    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.'.php'))
    {
     $this->directory = '';
     return array();
    }

   }

   return $segments;
  }


  // If we've gotten this far it means that the URI does not correlate to a valid
  // controller class. We will now see if there is an override
  if ( ! empty($this->routes['404_override']))
  {
   $x = explode('/', $this->routes['404_override']);
   $this->set_class($x[0]);
   $this->set_method(isset($x[1]) ? $x[1] : 'index');

   return $x;
  }

  // Nothing else to do at this point but show a 404
  show_404($segments[0]);
}

public function set_directory($dir)
{
          if(!$this->DoSubFold) {
  $this->directory = str_replace(array('/', '.'), '', $dir).'/';
          }
          else
          {
              $this->directory = str_replace(array('.'), '', $dir) . '/';
          }
}
#12

[eluser]Unknown[/eluser]
[quote author="nizzle" date="1322561517"]This does not seem to work when you want to use parts of the URI as query strings

like so: /sub/dir/my_controller/argument1/argument2

I would like this to call /sub/dir/my_controller->index(argument1, argument2)

but it does not work.

I need to put the index in the URL explicitly: /sub/dir/my_controller/index/argument1/argument2 [/quote]

I found a solution about this issue.

You should probably set this below code into your 'application/config/routes.php'

$route['sub/dir/my_controller/(:any)/(:any)'] = 'sub/dir/my_controller/index/$1/$2';


Hope this can help anyone.
#13

[eluser]veledrom[/eluser]
There is a bug in here!

If I use core\MY_router and try to change $route['404_override'] = 'my_error_folder/error'; won't work together. Either use MY_router or $route['404_override'].

Redirecting all errors to a controller works if we don't use this route extension class however this time we cannot use multi level for controllers!!!

Any solution?




Theme © iAndrew 2016 - Forum software by © MyBB