2011-03-06 14 views
8

Ho una cartella di amministrazione impostata nella mia directory dei controller, sotto quella ho 3 sottocartelle separate con controller all'interno di esse.Rotta verso più sottocartelle in CodeIgniter

-- Controllers 
---- Admin 
------ Dashboard 
-------- dashboard.php 
-------- file.php 
------ Members 
-------- members.php 
-------- file.php 
------ Settings 
-------- settings.php 
-------- file.php 

Ho provato di routing nel file routes.php come questo

$route['admin/(:any)/(:any)'] = 'admin/$1/$2'; 
$route['admin/(:any)'] = 'admin/$1/$1'; 
$route['admin'] = 'admin/index'; 

Cosa devo fare per risolvere questo problema?

risposta

11

Questo codice era già su internet, ma ho modificato per farlo funzionare per codeigniter 2.1

Vedere la vecchia fonte qui: http://glennpratama.wordpress.com/2009/10/20/multi-level-subfolder-for-controller-in-codeigniter/

fare un nuovo file di MY_Router.php nella directory application/core, copiare il seguente codice in esso:

<?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]); 
    } 
} 
+0

Questa è una variante aggiornata del codice collegato a nella risposta accettata da jondavidjohn. –

+0

Grazie! funziona come un fascino :-) –

+0

Non funzionerà con Codeigniter 3 – user4419336

1

I was di fronte a un problema con 4-5 levels di sub-directories (come/controller/cartella1/cartella2/Cartella3/Cartella4/my-Controller) e cambiare il ciclo while da

while(count($segments) > 0 && 
    // checks only $this->directory having a/
    is_dir(APPPATH.'controllers/'.$this->directory.$segments[0])) 

a

while(count($segments) > 0 && 
    // check $this->directory having a/
    (is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]) || 
     // check $this->directory not having/
     is_dir(APPPATH.'controllers/'.$this->directory.'/'.$segments[0]))) 

Funziona per me.

Il precedente è ok per 2-3 sub-directories ma non per la gerarchia 4-5 sub-directory.

3

Per compatibilità con Codeigniter 3.x: l'utilizzo della costante EXT è stato deprecato dal rilascio del supporto per PHP 4. Non è più necessario mantenere estensioni di file diverse e in questa nuova versione di CodeIgniter (3.x), il La costante EXT è stata rimossa. Usa invece solo ".php".

Così il nuovo 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]); 
    } 
} 
Problemi correlati