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

[中级] 关于动态扩展controller-使其部分支持三级目录

[复制链接]
发表于 2012-5-15 22:54:04 | 显示全部楼层 |阅读模式
本帖最后由 chzyer 于 2012-5-15 22:55 编辑

实际上CI的二级目录有时候不能满足需求.比如admincp.
admincp本身一般情况下需要两级目录,再加上admincp,那就是3级.但是其他可能仅仅需要两级目录便可满足需求.这样,我觉得有必要搞一个动态扩展controller的功能
我研究出一个方案
比如说/index.php/admincp/home/contact_us
可以在controller下建一个admincp-home.php的文件.
QQ截图20120515224842.png
在admincp下给home提供跳转
QQ截图20120515225019.png
对.当需要扩展的时候就调用expand_controller();
expand_controller()就是我们自己写的helper了

PHP复制代码
if ( ! function_exists('expand_controller')){
        function expand_controller(){
                $ci =& get_instance();
                $controller_name = $ci->uri->rsegments[1];
                $sub_controller_name = $ci->uri->rsegments[2];
                $default_method = isset($ci->uri->rsegments[3]) ? $ci->uri->rsegments[3] : 'index';
                $file_path = APPPATH."controllers/{$controller_name}-{$sub_controller_name}.php";
                if ( ! file_exists($file_path)){
                        show_404();
                }
               
                include $file_path;
                if ( ! class_exists($sub_controller_name)){
                        show_404();
                }
 
                $instance = new $sub_controller_name();
                $instance->{$default_method}();
 
        }
}
 
复制代码


对于不需要扩展的还是可以沿用CI本身的结构.
不过,我只是抛砖引玉了一下,通过/index.php/admincp-home/访问还是会出现问题的.暂时的方法姑且是修改route.php

评分

参与人数 1威望 +5 收起 理由
Hex + 5 很给力!

查看全部评分

发表于 2012-5-16 11:17:09 | 显示全部楼层
想问问楼主这用的是什么字体呢
发表于 2012-5-27 01:34:30 | 显示全部楼层
.........................................................................
发表于 2012-7-30 10:27:39 | 显示全部楼层
sublime text2 哈~
发表于 2012-7-31 15:21:00 | 显示全部楼层
本帖最后由 大道达人 于 2012-7-31 15:22 编辑

以前写过一个 无限级目录的
https://github.com/ftwbzhao/Code ... tem/core/Router.php在路由的时候下
                                // check sub-folder
                                if (is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))
                                {                       
                                        $this->set_directory($this->directory.$segments[0],TRUE);
                                        $segments = array_slice($segments, 1);
                                        $this->_validate_request(&$segments,TRUE);
                                }

本版积分规则