0

在用户创建节点之前,我有几件事要检查。所以,如果用户访问 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 && ....;
}

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

4

2 回答 2

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传递给挂钩的对象来验证针对该用户对象的操作。不要依赖当前登录的用户,这并不总是相同的。

于 2013-01-18T16:48:11.140 回答
0

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

 ...
$items['node/add/proposal'] = array(
        ...
        'page callback' => 'proposals_display_function'
    );
 ...
于 2013-01-18T13:55:13.873 回答