数据库驱动导航中的登录/注销链接?

时间:2009-12-28 10:28:19

标签: php zend-framework zend-navigation zend-acl

我有一个主要由两个表组成的数据库驱动导航:menus和一个menu_items,这对纯粹的“静态”链接很好,但现在我需要一个动态链接(登录/退出)。

我的menu_items表只包含指向管理员手动添加的页面的链接。所以现在我需要调整表和模型,以便它可以处理“动态”链接。

这是menu_items表的架构:

CREATE TABLE `menu_items` (
  `id` int(11) NOT NULL auto_increment,
  `menu_id` int(11) default NULL,
  `label` varchar(250) default NULL,
  `page_id` int(11) default NULL,
  `link` varchar(250) default NULL,
  `position` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8

菜单ID对应于另一个表,因此例如1是主要导航,2可以是实用程序导航。位置是指相对于显示菜单项的每个菜单的顺序。链接只是一个字段,例如'/ user / login'。

我正在遍历每个菜单并创建导航容器并使用Zend Navigation。

这是我用于登录区域的逻辑,我需要将其移动并将其合并到动态导航中:

<?php if($this->identity == null) { ?>
    <p><a href='/user/login'>Login</a></p>
<?php }else{ ?>
    <p>Welcome back <?php echo $this->identity->first_name;?></p>
    <p>To log out <a href='/user/logout'>click here</a></p>
<?php } ?>

看起来我需要为每个菜单项添加一个新的访问级别列,然后更新我的菜单模型以说明用户是否登录并查询菜单项的新访问列值,或者这些方面的东西。有人有什么建议吗?

2 个答案:

答案 0 :(得分:3)

戈登的ACL是要走的路(我赞成它)。我只是想管道并准确描述我的所作所为。

我在导航配置中创建了sign insign out页面:

    <user_signin>
      <label>Sign in</label>
      <other_stuff></other_stuff>
      <resource>mvc:user_signin</resource>
      <privilege>navigate</privilege>
    </user_signin>

    <user_signout>
      <label>Sign out</label>
      <other_stuff></other_stuff>
      <resource>mvc:user_signout</resource>
      <privilege>navigate</privilege>
    </user_signout>

然后,在我的ACL中:

// 'mvc:home' is wide open, 'user' role inherits from 'guest'
$this->addResource(new Zend_Acl_Resource('mvc:user_signin'), 'mvc:home');
$this->deny('user', 'mvc:user_signin', 'navigate');

$this->addResource(new Zend_Acl_Resource('mvc:user_signout'), 'mvc:home');
$this->deny('guest', 'mvc:user_signout', 'navigate');
$this->allow('user', 'mvc:user_signout', 'navigate');

这样,它只是另一段导航,其行为与其他导航一样,只是背后有一点点逻辑。

答案 1 :(得分:2)

我猜你可以用Zend_Acl实现这个目标。所有内置的导航助手都增加了与ACL和翻译的集成。

来自http://framework.zend.com/manual/en/zend.view.helpers.html

  

{get|set}Acl(), {get|set}Role(),   获取/设置ACL(Zend_Acl)实例和   角色(字符串或   Zend_Acl_Role_Interface)用于   在渲染时过滤掉页面,   和{get | set} UseAcl()控制是否   应启用ACL。方法   hasAcl()和hasRole()检查是否   helper有一个ACL实例或一个角色   注册

如果登录的访问者与未登录的访问者(用户与访客)的角色不同,则应该可以使用。我以前从来没有必要这样做,所以我不能给你任何代码片段,但请查看http://www.youtube.com/watch?v=n31mQGZxtbE有关如何将两者结合起来的视频教程。

我仍然不明白你为什么要重构它,因为移动它似乎是一个麻烦,并为一些可以在一个单独的View Helper中幸福生活的东西增加了不必要的复杂性。所以,为什么不保持简单:)