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

[优化] 让Codeigniter控制器支持多级目录

[复制链接]
发表于 2013-1-9 23:47:56 | 显示全部楼层 |阅读模式
最近做一个移动端的项目,也包括PC端。为了保证用户能记住一域名,改了一下路由,基于 [核心代码 Core] 让Codeigniter控制器支持多级目录【支持2.1.2】而改。

或许有人会说移动端的时候访问域名和PC端的区别开来就OK,但是不。互联网域名数不清的数,谁没事记那么多,

PHP复制代码
 
<?php
if (!defined('BASEPATH')) {
        exit ('No direct script access allowed');
}
class MY_Router extends CI_Router {
        public function __construct() {
                 parent :: __construct();
                 $this->agent=load_class('user_agent');
                 //$this->directory='mobile/';
                 if ($this->agent->is_mobile()) {
                        $this->directory='mobile/';
                }  
               
        }
        function set_directory($dir) {
                $this->directory =  $this->directory.$dir . '/';
        }
        function _validate_request($segments) {
                if (count($segments) == 0) {
                        return $segments;
                }
                if (file_exists(APPPATH . 'controllers/'.$this->fetch_directory() . $segments[0] . '.php')) {
                        return $segments;
                }
                if (is_dir(APPPATH . 'controllers/' .$this->fetch_directory(). $segments[0])) {
                        $temp = array (
                                'dir' => '',
                                'number' => 0,
                                'path' => ''
                        );
                        $temp['number'] = count($segments) - 1;
 
                        for ($i = 0; $i <= $temp['number']; $i++) {
                                $temp['path'] .= $segments[$i] . '/';
 
                                if (is_dir(APPPATH . 'controllers/' . $temp['path'])) {
                                        $temp['dir'][] = str_replace(array (
                                                '/',
                                                '.'
                                        ), '', $segments[$i]);
                                }
                        }
                        $this->set_directory(implode('/', $temp['dir']));
                        $segments = array_diff($segments, $temp['dir']);
                        $segments = array_values($segments);
                        unset ($temp);
 
                        if (count($segments) > 0) {
                                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 {
                                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');
                                }
                                if (!file_exists(APPPATH . 'controllers/' . $this->fetch_directory() . $this->default_controller . '.php')) {
                                        $this->directory = '';
                                        return array ();
                                }
 
                        }
                        return $segments;
                }
                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;
                }
                show_404($segments[0]);
        }
}
 
 
复制代码


或许你喜欢用域名来区分移动端和PC端,而且你只想共用一个空间、一份CI代码,那么这正合适你





MY_Router.rar

868 Bytes, 下载次数: 116

发表于 2013-1-10 17:24:16 | 显示全部楼层
PHP复制代码
 
if ( ! function_exists('is_mobile'))
{
        function is_mobile()
        {
                $user_agent = $_SERVER['HTTP_USER_AGENT'];
                $mobile_agents = Array("240x320","acer","acoon","acs-","abacho","ahong","airness","alcatel","amoi","android","anywhereyougo.com","applewebkit/525","applewebkit/532","asus","audio","au-mic","avantogo","becker","benq","bilbo","bird","blackberry","blazer","bleu","cdm-","compal","coolpad","danger","dbtel","dopod","elaine","eric","etouch","fly ","fly_","fly-","go.web","goodaccess","gradiente","grundig","haier","hedy","hitachi","htc","huawei","hutchison","inno","ipad","ipaq","ipod","jbrowser","kddi","kgt","kwc","lenovo","lg ","lg2","lg3","lg4","lg5","lg7","lg8","lg9","lg-","lge-","lge9","longcos","maemo","mercator","meridian","micromax","midp","mini","mitsu","mmm","mmp","mobi","mot-","moto","nec-","netfront","newgen","nexian","nf-browser","nintendo","nitro","nokia","nook","novarra","obigo","palm","panasonic","pantech","philips","phone","pg-","playstation","pocket","pt-","qc-","qtek","rover","sagem","sama","samu","sanyo","samsung","sch-","scooter","sec-","sendo","sgh-","sharp","siemens","sie-","softbank","sony","spice","sprint","spv","symbian","tablet","talkabout","tcl-","teleca","telit","tianyu","tim-","toshiba","tsm","up.browser","utec","utstar","verykool","virgin","vk-","voda","voxtel","vx","wap","wellco","wig browser","wii","windows ce","wireless","xda","xde","zte");
                $is_mobile = false;
                foreach ($mobile_agents as $device) {
                        if (stristr($user_agent, $device)) {
                                $is_mobile = true;
                                break;
                        }
                }
                return $is_mobile;
        }
}
 
复制代码

(上面代码为oschina)
判断下是不是移动端就行了,造个钩子

评分

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

查看全部评分

发表于 2013-1-18 10:16:46 | 显示全部楼层
j接触drupal的看到这个 hook 有点咻~
发表于 2013-3-27 19:42:08 | 显示全部楼层
多谢了,正好最近用到这个。

本版积分规则