2015-06-23 107 views
1

好的,我想我可能(希望)会被告知我正在以错误的方式解决这个问题。Codeigniter URL路由 - 为树结构捕获所有内容

目前,如果我去CI网络的根目录,我会调用一个函数来读取map_directory()的预定义位置。然后我把它作为一个简单的目录列表在视图中迭代出来。

然后,我想单击这些目录之一来查看里面的内容。当我这样做时,我会调用另一个名为browse的控制器函数。

所以,如果我点击一个链接,我去

www.mysite.com/dir1

(其路由到www.mysite.com/controller/browse/$1 - 其中$ 1这种情况下= DIR1)。

现在我看到一个dir1的目录列表。我已经配置了显示列表的链接,现在去:

www.mysite.com/dir1/subdir1等

我想要做的,这可能是位在哪里是欺骗/脚麻,就是抓住一切后,

www.mysite.com/

,并把它传递给

www.mysite.com/controller/browser/$1

所以例如:

www.mysite.com/dir1/subdir1/ => www.mysite.com/controller/browse/"dir1/subdir1" 

我知道我不能拥有“'在那里,但是这是我一点我试图传递给map_directory()函数...所以它去/.$var(其中$var would = $1 = "dir1/subdir1"

到目前为止,我在CI routes.php文件曾尝试:

$route['(.+)$'] = 'controller/browse/$1'; 
$route['([a-zA-Z0-9\/]*)'] = 'controller/browse/$1'; 
$route['(:any)'] = 'controller/browse/$1'; 

...但他们似乎都永远只能捕捉到“dir1的”从来没有任何超出。

我希望是有道理的人....

回答

1

你可以只使用特殊_remap()方法在你的控制器来替代默认路由行为:

class Controller extends CI_Controller 
{ 

    protected function browse($path) 
    { 
     // ... do something with $path here 
    } 

    public function _remap($method, $params = array()) 
    { 
     if ($method === 'browse') 
     { 
      $params = implode('/', $params); 
      return $this->browse($params); 
     } 
     elseif (method_exists($this, $method)) 
     { 
      return call_user_func_array(array($this, $method), $params); 
     } 

     show_404(); 
    } 
}