0

我有一个数据库驱动的导航,主要由两个表组成: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 } ?>

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

4

2 回答 2

3

Gordon 的 ACL 是要走的路(我赞成)。我只是想插话并准确描述我的工作。

我在导航配置中创建了sign in和页面:sign 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');

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

于 2009-12-28T17:01:39.287 回答
2

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

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

{get|set}Acl(), {get|set}Role(), 获取/设置 ACL (Zend_Acl) 实例和角色(String 或 Zend_Acl_Role_Interface),用于在渲染时过滤掉页面,并且 {get|set}UseAcl() 控制是否应启用 ACL。hasAcl() 和 hasRole() 方法检查帮助程序是否具有 ACL 实例或注册的角色。

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

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

于 2009-12-28T12:21:20.160 回答