【问题标题】:How to define custom access check function to see if a user may create a node in Drupal 7?如何定义自定义访问检查功能以查看用户是否可以在 Drupal 7 中创建节点?
【发布时间】:2013-01-18 12:29:37
【问题描述】:

在用户创建节点之前,我有几件事要检查。所以,如果用户访问 node/add/proposal 我想检查他是否可以这样做,所以我写了一个模块:

function proposals_menu() {

    $items['node/add/proposal'] = array(
        'title' => t('Proposal'),
        'access callback' => 'proposals_access',
    );

    return $items;
}

function proposals_access() {
    $cond1;
    $cond2;
    ...

    return cond1 && cond2 && ....;
}

当我点击添加内容 -> 提案时,我得到一个空白页。我错过了什么?

【问题讨论】:

    标签: drupal drupal-permissions drupal-nodes


    【解决方案1】:

    要覆盖现有菜单项,您需要使用hook_menu_alter() 而不是hook_menu()。例如

    function proposals_menu_alter(&$items) {
      $items['node/add/proposal']['access callback'] = 'some_function';
    }
    

    但还有hook_node_access() 更适合用于(顾名思义)检查节点访问。例如

    function proposals_node_access($node, $op, $account) {
      $type = is_string($node) ? $node : $node->type;
    
      if ($type == 'proposal' && $op == 'create') {
        if ($allow_access) {
          return NODE_ACCESS_ALLOW;
        }
        else {
          return NODE_ACCESS_DENY;
        }
      }
      return NODE_ACCESS_IGNORE;
    }
    

    假设您使用访问检查填充 $allow_access。请务必使用传递给挂钩的$account 对象来验证针对该用户对象的操作。不要依赖于当前登录的用户,这并不总是相同的。

    【讨论】:

      【解决方案2】:

      您得到一个空白页面,因为您没有告诉 drupal 如何渲染您正在创建的路径。为此,您需要向项目添加 页面回调。在hook_menu documentation中指定,当用户访问该路径时,将调用该函数显示页面。

       ...
      $items['node/add/proposal'] = array(
              ...
              'page callback' => 'proposals_display_function'
          );
       ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 2018-06-22
        • 1970-01-01
        相关资源
        最近更新 更多