Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Drupal中正确使用用户访问($string,$account)?_Drupal_Drupal 7_Url Routing - Fatal编程技术网

如何在Drupal中正确使用用户访问($string,$account)?

如何在Drupal中正确使用用户访问($string,$account)?,drupal,drupal-7,url-routing,Drupal,Drupal 7,Url Routing,我想限制一些url的使用。假设node/add和node/7(只是随机示例)。我认为最好的方法是使用user\u access功能 但是我们已经习惯了,Drupal文档并没有多大帮助。当我刚刚使用该函数时,我会收到消息该函数已在使用中。因此,我的最佳猜测是在自定义模块中的自定义函数中使用这个现有函数和我自己的参数。 但是用这种方式,我需要在加载页面之前捕获它。或者我在这里遗漏了什么 编辑: 我已经定好了 global $user; $items['node/add/%']['access cal

我想限制一些url的使用。假设
node/add
node/7
(只是随机示例)。我认为最好的方法是使用
user\u access
功能

但是我们已经习惯了,Drupal文档并没有多大帮助。当我刚刚使用该函数时,我会收到消息该函数已在使用中。因此,我的最佳猜测是在自定义模块中的自定义函数中使用这个现有函数和我自己的参数。
但是用这种方式,我需要在加载页面之前捕获它。或者我在这里遗漏了什么

编辑:
我已经定好了

global $user;
$items['node/add/%']['access callback'] = array('_mymodule_node_access');
$items['node/add/%']['access arguments'] = array(0,2, $user);
但由于某些原因,Drupal并没有为所有类型的卡选择
%
。它只适用于一种类型(脚本)。其他术语,如page或fiche,不会被使用<代码>%是Drupal通配符,对吗

编辑:
我刚刚发现数据库中已经有一些路径。如何覆盖它们?我需要的是一个选择器,它可以选择所有四种内容类型(fiche、页面、脚本和新闻项)


为路径定义特定访问函数的方法是在
hook\u menu()
中为路径的菜单项设置
访问回调。这与现有路径略有不同,因为您需要实现
hook\u menu\u alter()
来编辑该路径的现有
access回调

function mymodule_menu_alter(&$items) {
  $items['node/add']['access callback'] = 'mymodule_node_add_access_callback';
}

function mymodule_node_add_access_callback() {
  // return TRUE to allow access, FALSE to deny
}
当我们讨论节点页面时,这会变得更加有趣,因为它们的菜单项是使用通配符
节点/%
定义的。这意味着使用
hook\u menu\u alter()
只能更改所有节点的访问回调

幸运的是,Drupal有一个钩子来拯救:

function mymodule_node_access($node, $op, $account) {
  $restricted_nids = array(7, 10, 12);

  if (in_array($node->nid, $restricted_nids) && $op == 'view') {
    if ($some_condition_is_true) {
      return NODE_ACCESS_ALLOW;
    }

    return NODE_ACCESS_DENY;
  }

  return NODE_ACCESS_IGNORE;
}
希望有帮助

编辑

如果这一切看起来有点麻烦,您可能会从安装中获得一些乐趣,我认为它具有您所追求的功能

另一次编辑

我认为在这种情况下重写通配符不起作用的原因是因为节点模块为每个节点类型明确定义了一个路径,例如
node/add/page
node/add/article
,等等。因为Drupal将在通配符匹配(
node/add/page
)上进行精确匹配(
node/add/%
)您实际上覆盖了错误的菜单项

尝试在
hook\u menu\u alter()
函数中显式指定路径(注意
access回调应为字符串,而不是当前的数组):


还值得注意的是,您传递的
$user
对象始终是清除Drupal缓存的登录用户的用户对象(因为重建缓存时会重建菜单项)。如果您希望传递当前登录的用户(即在访问页面时登录的用户),那完全是另一回事……我建议您再问一个问题,因为这可能是一个棘手的问题,您希望从这里的用户那里获得尽可能多的输入。

好的,谢谢您的回答。你能看看我在问题中的编辑吗?我添加了一张图片,希望对你有意义:)@Michiel:我添加了一点,希望有帮助:)谢谢编辑。我想我从你那里学到了更多关于Drupal的知识,而不是从Drupal文档中尤其是关于清除菜单的
$user
部分非常有趣,也很有启发性!谢谢
$items['node/add/page']['access callback'] = '_mymodule_node_access';
$items['node/add/page']['access arguments'] = array(0,2, $user);