0

我是 codeigniter 的新手,目前几乎所有内容,但我在 php、mysql、ci 和 web 应用程序开发方面取得了一些成功。不过,我现在有点卡住了。所以,我想把它扔出去,以征求你对我正在尝试做的事情的看法,希望 - 你可以有耐心去理解我的问题并找到解决方案,因为我会尽力给你所有的细节。

首先,我正在开发一个 Web 应用程序,以帮助简化某个组织的出勤记录。我创建了一个成员表来保存组织的所有成员,一个登录表来保存在组织中担任角色的成员的用户名和密码,一个角色表来包含在组织中担任的角色,最后是一个 member_role表来说明在组织中可能具有多个角色的任何成员。(当然还有一张考勤表,外键是会员,但这不在我目前的问题范围内)。

MySQL 代码只包括相关的表:memeber、login、role 和 member_role。

<!-- language: lang-mysql -->
CREATE TABLE `member` (
    `id`                int(10) NOT NULL auto_increment,
    `fname`             varchar(32) NOT NULL,
    `lname`             varchar(32) NOT NULL,
     ...
    PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `login` (
    `memberid`          int(10) NOT NULL,
    `username`          varchar(32) NOT NULL,
    `password`          varchar(32) NOT NULL,
FOREIGN KEY (`memberid`) REFERENCES member(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `role` (
    `id`            integer(10) NOT NULL auto_increment,
    `role`          varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `member_role` (
    `memberid`      integer(10),
    `roleid`        integer(10),
    `active`        char(1) NOT NULL,
FOREIGN KEY (`memberid`) REFERENCES member(`id`),
FOREIGN KEY (`roleid`) REFERENCES role(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

到目前为止,我认为我在为此目的定义数据库方面做得很好。你在这里的意见会很好,因为我是新手,我只知道新手会知道什么。

这是我目前遇到的真正问题。我创建了一个具有 2 个角色的用户。我让它正确地存储到一个会话中,一个特定成员角色的数组。会话数组返回,roleid 1 和 roleid 3。

假设我为每个角色分配了某些按钮或功能。对于memeberid = 1,我已分配给他roleid = 1 和roleid = 3,因此我只想构建一个页面,其中仅包含roleid = 1 和roleid = 3 可用的功能。有意义吗?

这就是我卡住的地方,我有数组,但不确定如何为用户构建页面。我应该将代码放入控制器还是视图中?无论哪种方式,我都不确定如何填充仅包含关于 roleid = 1 和 roleid = 3 的按钮页面。嗯,我希望你能理解,因为这是我认为我能说清楚的最好的。

如果您确实理解,请举例说明我可以实现什么/如何实现这一目标。

谢谢你的时间。

4

2 回答 2

0

在您尝试重新发明轮子之前的建议......如果您正在尝试构建一个人力资源管理应用程序,请使用 orangehrm 并在此基础上满足您自己的需求。

否则使用这个

foreach($rolesarray as $currentrole)
    {
    //if currentrole is x then do that, if y then do different.
    }

您可以在需要显示多个按钮、显示器等的任何地方使用它

于 2012-05-25T22:26:24.673 回答
0

这些表对我来说似乎很好,除了我想知道你为什么要分开成员表和登录表。Login 中的列似乎只是每个成员记录的附加属性,在这种情况下,表可以合并为一个。

关于您为属于第 1 组和第 3 组的人显示正确按钮的问题——我认为您遇到了困难,因为您正在考虑为具有这种组合的人创建一个静态页面(也许我错了.. ?)。相反,您创建一个每个人都可以访问的页面,并在页面的各个区域,其中权限是一个因素,您放置 if 语句以确定是否逐个显示任何给定元素。例如,只要成员属于至少一个组,您就会来到“开始时间”按钮并显示逻辑。然后您将进入“管理仪表板”,并且仅在成员具有组 3 时才显示(如果没有,您将跳过控制器和视图中的元素)。我希望我能正确理解你的问题。

至于是在Controller还是View中检查权限,MVC的精神就是在Controller中执行这种逻辑。然后,在视图中,您将检查控制器是否为页面的某些区域准备了信息。如果视图不需要控制器准备的任何特定内容来显示元素(即,您不需要任何准备来显示管理仪表板的链接/按钮 - 您只需要知道该人是否在第 3 组中),您可以让控制器设置一个变量,如 $display_management_db_button。

最后,用户身份验证在任何 Web 应用程序中都是非常常见的事情,并且 CodeIgniter 包确实存在用于用户身份验证。我最近遇到了 Ion Auth,它似​​乎是我正在寻找的轻量级和强大的正确组合,但您可以搜索并找到许多其他的。

-格斯


(编辑)示例:

在控制器中:

if($this->member->has_group(3)) { $display_management_db_button=true; }
else { $display_management_db_button=false; }

$data = array('display_management_db_button' => $display_management_db_button;);

$this->load->view('time_screen', $data);

在视图中:

if($display_management_db_button) { echo '<input type="button" ... />'; }

所以逻辑保留在控制器中。随着程序变得越来越复杂,分离逻辑对于维护干净的代码变得更加重要。

于 2012-05-25T23:49:50.863 回答