用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2261|回复: 2
收起左侧

CI(version2.2.0)controllerN级目录实现代码(默认为1级)

[复制链接]
发表于 2014-6-18 21:47:17 | 显示全部楼层 |阅读模式
因为,所以。
默认访问时
index.php/admin/abc
如果想
index.php/admin/library/abc就无法访问了。 提示404
于是一步步地检查
找到了修改的地方,实现了N级目录,现发布修改办法(主要修改一个文件中的两个function)
文件system/core/Router.php
方法名1:_validate_request
修改代码为:
PHP复制代码
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
                        //chang by lou
                        $sub_directory_array = [];
                        $num = $issub = 0;
                        while(list($a,$b)=each($segments))
                        {
                                $num++;
                                $sub_directory_array[] = $b;
                                $sub_directory = implode("/", $sub_directory_array);
                                if(!is_dir(APPPATH.'controllers/'.$sub_directory))
                                {
                                        $issub = 1;
                                        array_pop($sub_directory_array);
                                        $this->set_directory($sub_directory_array);
                                        break;
                                }
                        }
                        $issub || $this->set_directory($segments[0]);
                        $segments = array_slice($segments, $num-1);                    
                        if (count($segments) > 0)
                        {
                                //print_r($segments);
                                //exit;
                                // 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]);
        }
复制代码

方法名2:set_directory
修改代码为:
PHP复制代码
function set_directory($dir)
        {
                if(is_string($dir)){
                        $this->directory = str_replace(array('/', '.'), '', $dir).'/';
                }
                if(is_array($dir))
                {
                        $this->directory = implode("/", $dir)."/";
                }
        }
复制代码

评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

 楼主| 发表于 2014-6-18 21:48:11 | 显示全部楼层
如果发现有问题请留言,一起讨论。

本版积分规则