2011-06-10 73 views
1

我正在开发一个网站codeigniter分为模块使用HMVC。我希望管理员启用/禁用模块,以下是我计划实现它的方式。由于我在PHP/Codeigniter方面没有太多经验,因此以下方法可能会非常错误,所以我正在寻找建议/反馈:Codeigniter模块配置和ACL

数据库表:模块 ID | NAME |状态

上表将包含所有模块信息,并且状态字段将包含禁用/启用值(0或1)。

我要延长主要是CI_Controller,并有一个函数来检查模块的状态:

class MY_Controller extends CI_Controller{ 
public function __construct() 
{ 
parent::__construct(); 
$this->load->Model('Module_model'); //loads the module model 
} 
function check_module_state($module_name = '') 
{ 
return $this->Module_model->getState($module_name); //the model returns TRUE or FALSE 
} 

现在,每个控制器的构造函数中,我将扩展MY_Controller类和呼叫check_module_state,如果它返回FALSE,则会将用户重定向到“Section Disabled Page”;

class Module1 extends MY_Controller{ 
public function __construct() 
{ 
parent::__construct(); 
if($this->check_module_state('module1') == FALSE) 
redirect('module_disabled', 'location'); 
} 
} 

请问上述工作是否有更好更容易的选择? 谢谢

回答

2

看起来没问题。您如何描述功能听起来不错。然而,我会说,如果一个模块被禁用,则不必告诉人们它被禁用。

我会如何处理这个问题如下。

我会使用模块表来构造导航项目。如果启用模块,则允许将链接显示到该模块。如果模块被禁用,则不显示链接。这并不意味着你可以摆脱控制器的安全性,因为人们可能仍然会使用URL Surf。在URL冲浪到禁用模块的情况下,我会静默地重定向到默认模块,例如站点根(索引)。

+0

是的,没有显示禁用模块的链接是一个好主意。说到这些,如何有效地管理菜单?我打电话在视图文件中做这件事吗?如果($ this-> Modules_model-> isActive('module1')echo'module1';' '这样,我认为它会调用所有模块的数据库显示在菜单上。我调用数据库一次,并将模块名称和它的状态存储在一个数组中,然后检查数组的状态? – WebNovice 2011-06-10 07:56:25

+0

@Damchey这是一个可能的解决方案是。我不使用CI,但如果它的任何类似ZF并支持现场广泛的默认布局,那么你可以坚持你的导航的东西都在那里。 – martynthewolf 2011-06-10 08:01:20