2012-10-07 29 views
0

我有HMVC击溃管理控制器与HMVC

一个问题,我有这样的

 
- modules 

- users 
    - controllers 
     - admin.php 
     - users.php 
    - views 
     - admin_create_user.php 
     - admin_view_users.php 
     - signup.php 
     - login.php 

- news 
    - controllers 
     - admin.php 
     - news.php 
    - views 
     - admin_disply_news.php 
     - admin_create_news.php 
     - view_news.php 

现在在我所有的模块管理控制器到用户管理的URL会时链接这个

  • domain.com/users/admin/method。
  • domain.com/news/admin/method。

,但我需要它是

  • domain.com/admin/users/method
  • domain.com/admin/news/method

回答

1

添加这些代码在 “核/ MY_Router.php” 内部 “MY_Router” 类 - *(类MY_Router延伸MX_Router {** ---代码放在这里 - **})*

我试图用路由规则和.htaccess来做到这一点,但它们都不起作用。然后编辑MX_Router代码并完成工作,但有一点需要注意,您必须在您的模块的控制器调用'admin'上创建一个子文件夹,并将控制器放置在此处工作,因为这样您可以使用默认如果控制器名称与模块名称相同,则直接调用控制器为模块进行路由。

public $module; 
private $located = 0; 

protected function _set_request($segments = array()){ 
    $segments = $this->_validate_request($segments); 
    // If we don't have any segments left - try the default controller; 
    // WARNING: Directories get shifted out of the segments array! 
    if (empty($segments)) 
    { 
     $this->_set_default_controller(); 
     return; 
    } 

    if ($this->translate_uri_dashes === TRUE) 
    { 
     $segments[0] = str_replace('-', '_', $segments[0]); 
     if (isset($segments[1])) 
     { 
      $segments[1] = str_replace('-', '_', $segments[1]); 
     } 
    } 

    if($segments[0] == 'admin' && isset($segments[1])){ 
     if (isset($segments[2])){ 
      $this->set_method($segments[2]); 
      $segments[2] = $segments[2]; 
     }else{ 
      $this->set_method('index'); 
      $segments[2] = 'index'; 
     } 
     $this->directory = '../modules/'.$segments[1].'/controllers/admin/'; 
     $this->module  = $segments[1]; 
     $this->class  = $segments[1]; 

     $segments[1] = $segments[1]; 


     unset($segments[0]); 
     $this->uri->rsegments = $segments; 
    }else{ 
     $segments = $this->locate($segments); 

     if($this->located == -1) 
     { 
      $this->_set_404override_controller(); 
      return; 
     } 

     if(empty($segments)) 
     { 
      $this->_set_default_controller(); 
      return; 
     } 

     $this->set_class($segments[0]); 

     if (isset($segments[1])) 
     { 
      $this->set_method($segments[1]); 
     } 
     else 
     { 
      $segments[1] = 'index'; 
     } 

     array_unshift($segments, NULL); 
     unset($segments[0]); 
     $this->uri->rsegments = $segments; 
    } 
} 
0

你可以尝试将此添加到您的路由配置文件中:

$route['domain.com/admin/users/(:any)'] = 'domain.com/users/admin/method'; 
$route['domain.com/admin/news/(:any)'] = 'domain.com/news/admin/method'; 

当用户类型domain.com/admin/users/method它将调用用户控制器。

Documentation

+0

如果我这样做,那么我需要在路由配置中添加所有模块方法。并不知道所有的模块名称。用户可以添加任何模块到这个脚本。 – Ahmed

+1

这是**(:any)**跳入的部分。您可以在** domain.com/users/admin/method **末尾添加此项,而不是方法**。 $这个 - > URI->段(3)**。 – Sasha

+0

你是对的,但我不知道这个模块中的所有模块名称或所有控制器 我需要动态地路由它 – Ahmed