基于CodeIgniter中关系数据库的会话角色构建页面

时间:2012-05-25 21:28:17

标签: codeigniter session login relational-database roles

我是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;

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

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

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

这就是我被困住的地方,我有阵列,但不知道如何为用户构建页面。我应该将代码放入控制器或视图吗?无论哪种方式,我不知道如何填充一个只有关于roleid = 1和roleid = 3的按钮页面。嗯,我希望你能理解,因为这是最好的,我认为我可以说清楚。 / p>

如果你明白了,也许你可以举一个例子说明我能做到这一点的方式。

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

在您尝试重新发明轮子之前的建议...... 如果您正在尝试构建一个hrm应用程序,请使用orangehrm并根据您自己的需要进行工作。

否则使用此

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

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

答案 1 :(得分:0)

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

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

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

这样的变量

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

-GUS


(编辑) 例如:

在控制器中:

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" ... />'; }

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