2010-07-13 67 views

回答

5

不能动态更改菜单项的路径,因为菜单项缓存。

还有,AFAIK,有两种方法可以得到你想要的。这两种方法都要求您在自定义模块中(而不是从菜单UI)使用hook_menu创建菜单项。

第一种方法是创建两个具有相同名称的菜单项并设置访问规则,以便一个仅可用于已登录的guest,另一个用于已认证的用户。由于Drupal只会显示允许用户访问的菜单项,因此在任何给定时刻只有一个菜单项会显示。在Drupal核心中,通过查看user_menu()中的/user/login路径,您可以看到用户模块如何为匿名用户创建菜单项。

第二种方法是创建单个菜单项并在用户登录时检查菜单回调。如果用户已登录,则您提供一页,如果不提供另一页。在Drupal核心中,/user路径就像这样工作。请参阅user_page以查看代码的工作方式。

+0

其实我已经通过将用户重定向到正确的页面不涉及菜单解决。 – aneuryzm 2010-07-13 16:49:56

+1

很高兴看到你已经解决了它,但是如果我可能会问:你在哪里放置了将访问者重定向到正确url的代码?如果你把PHP放在一个节点中,我想告诉你这篇文章(http://2bits.com/articles/free-your-content-php-moving-php-code-out-blocks-views-and-nodes .html),因为这种技术有一些缺点。 – marcvangend 2010-07-13 19:36:42

+0

使用PHP输入格式创建节点应仅用作临时解决方案。即使在Drupal.org上,所有需要动态输出的页面都是由自定义模块(drupalorg.module)生成的,该模块包含Drupal.org所需的所有自定义项。 – kiamlaluno 2010-07-15 03:12:51

2

而是改变链接的,你coudl创建menues两次:一次为普通用户,并曾经与已注册/管理链接的链接/ ...用户

你可以把菜单成块并将其设置为仅允许注册用户看到一个块和未注册用户的另一个块。无论是从块创建表单中的Drupal菜单中选择合适的单选按钮,还是通过PHP来评估并根据返回值(TRUE/FALSE)来显示它。我建议采用第一种方法。

0

您可以使用nodeaccess模块​​的组合并链接到相应的页面来更改菜单。

例如,默认来宾用户不能访问/注销。如果您在菜单中创建了一个注销链接,则只有在用户登录后才会显示。使用nodeaccess时,只需创建一个节点,访问授权标签并取消选中该节点的“已验证用户”或“匿名用户” 。

http://drupal.org/project/nodeaccess

干杯,

4

可以动态更改菜单项的路径 - 见hook_translated_menu_link_alter

如果它具有属性['options'] ['alter'] = TRUE,则在每个菜单项呈现之前调用此钩子。

您可以使用hook_menu_link_alter将此属性设置为菜单项。

示例代码如下:

function MY_MODULE_menu_link_alter(&$item) { 
    $item['options']['alter'] = TRUE; 
} 

function MY_MODULE_translated_menu_link_alter(&$item, $map) { 
    if($item['mlid']==89) { 
     $item['link_path'] .= 'my-new-path'; 
    } 
}