【问题标题】:Drupal user permissions & odd content typesDrupal 用户权限和奇怪的内容类型
【发布时间】:2026-01-23 13:35:01
【问题描述】:

我在 Drupal 中遇到权限问题。我希望用户能够创建某种节点类型,但是我需要为他们授予两个不同的路径以允许他们执行此操作。该类型是由一个名为 isbn2node 的模块创建的内容,通过它有两种方式来制作内容,每种方式都有不同的路径:

?=node/add/isbn2node-book

?=node/add/isbn2node_book/isbn2node

一个有下划线,另一个有连字符。第一条路径通向一个允许用户手动输入书籍信息的表单;第二个路径让他们输入 ISBN,搜索它,并根据结果为他们填充表单。

我已更改“人员”菜单中的权限,以便他们可以使用第一个路径手动添加 isbn2node-book 内容,但没有让他们使用第二种方法的选项。别名 url 使其路径中没有 node/add 也不起作用。

创建重复的内容类型似乎是一个丑陋的解决方案;有没有更优雅的方式让用户访问第二条路径?

【问题讨论】:

    标签: drupal permissions drupal-7


    【解决方案1】:

    使用hook_node_access 的自定义模块中的一小段代码应该可以做到。

    $node 是节点对象或内容类型的机器名称,在其上执行访问检查(如果正在创建节点,则 $node 对象不可用,因此它将是一个字符串)。

    所以应该这样做:

    function MY_MODULE_node_access($node, $op, $account) {
        if ($op == 'create') {
            $type = $node;
            if($type == 'book' && $account->uid) return NODE_ACCESS_ALLOW;
        }
    }
    

    【讨论】:

    • $account->uid 位只是确认用户是否已登录
    • 谢谢!这听起来像是一个不错的解决方案。第一次快速尝试实现这一点让我得到了错误:Notice: Trying to get property of non-object ...但我很确定那是我的错;回家后我会排查问题并报告。
    • 我已经更新了答案 - 创建 $op 时,$node 不是对象。
    • 我想通了!您的代码适用于我网站上的所有其他内容类型,但事实证明这个特定模块已设置,因此用户需要“管理节点”权限才能运行第二个路径发送到的自定义搜索。我已经链接到下面的修复程序。谢谢 - 我了解了 hooks 和 PHP 来解决这个问题。
    【解决方案2】:

    我发现了这一点,我遇到的问题是特定于这种内容类型的。 ISBN2Node 模块要求用户具有管理节点权限才能使用其查找和批量导入功能。

    模块的 hook_permission 和 hook_menu 部分有一些额外的代码作为模块的 issues thread 中的修复提交。

    【讨论】:

    • 阅读该线程我想说更好的解决方案可能是在您自己的模块中使用 hook_menu_alter 而不是对 isbn 模块进行更改。这样,如果 isbn 模块有更新,您的更改就不会丢失。