У меня есть папка администратора, настроенная в моем каталоге контроллеров, в то время как у меня есть 3 отдельных подпапки с контроллерами внутри них.
-- Controllers ---- Admin ------ Dashboard -------- dashboard.php -------- file.php ------ Members -------- members.php -------- file.php ------ Settings -------- settings.php -------- file.php
Я попытался маршрутизировать его в файле route.php, как это
$route['admin/(:any)/(:any)'] = 'admin/$1/$2'; $route['admin/(:any)'] = 'admin/$1/$1'; $route['admin'] = 'admin/index';
Что мне делать, чтобы исправить это?
«Вне коробки» codeigniter не поддерживает несколько уровней подкаталогов в вашем каталоге контроллеров, всего один.
Существует способ расширить класс маршрутизации для поддержки этого, проверьте эту запись в блоге.
Этот код уже был в Интернете, но я изменил его, чтобы он работал для codeigniter 2.1
См. Старый источник здесь: http://glennpratama.wordpress.com/2009/10/20/multi-level-subfolder-for-controller-in-codeigniter/
Создайте новый файл MY_Router.php в каталоге application / core, скопируйте в него следующий код:
<?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]); } }
Для совместимости с Codeigniter 3.x: использование константы EXT было устаревшим с момента отказа от поддержки PHP 4. Теперь больше нет необходимости поддерживать разные расширения имен файлов, а в этой новой версии CodeIgniter (3.x) константа EXT была удален. Вместо этого используйте только «.php».
Итак, новый 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]); } }
Я столкнулся с проблемой с 4-5 levels
sub-directories
(например, / controllers / folder1 / folder2 / folder3 / folder4 / my-controller) и изменить цикл while из
while(count($segments) > 0 && // checks only $this->directory having a / is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))
в
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])))
Меня устраивает.
Вышеприведенный вариант подходит для 2-3 sub-directories
но не для иерархии 4-5 sub-directory
.