Drupal 7中是否有防止管理员编辑节点的方法?

Drupal 7中是否有防止管理员编辑节点的方法?,drupal,drupal-7,Drupal,Drupal 7,我有一个以编程方式创建(和更新)Drupal7节点的模块 由于这些节点的主体内容是由程序以随机间隔更改的,因此我不希望任何人(包括管理员)能够编辑它们。是否有一种方法可以完全“关闭”允许管理员编辑节点的界面?如果它是具有管理员角色的标准用户,您可以在自定义模块中实现: function MYMODULE_node_access($node, $op, $account) { $type = is_string($node) ? $node : $node->type; if ($t

我有一个以编程方式创建(和更新)Drupal7节点的模块


由于这些节点的主体内容是由程序以随机间隔更改的,因此我不希望任何人(包括管理员)能够编辑它们。是否有一种方法可以完全“关闭”允许管理员编辑节点的界面?

如果它是具有管理员角色的标准用户,您可以在自定义模块中实现:

function MYMODULE_node_access($node, $op, $account) {
  $type = is_string($node) ? $node : $node->type;
  if ($type == 'the_type' && $op == 'update') {
    return NODE_ACCESS_DENY;
  }
  return NODE_ACCESS_IGNORE;
}
如果是“超级用户”(用户1),您需要更具创造性,因为该用户的许多访问检查都被绕过

您可以实现覆盖节点编辑页面的访问回调,并提供自己的回调:

function MYMODULE_menu_alter(&$items) {
  $items['node/%node/edit']['access callback'] = 'MYMODULE_node_edit_form_access';
}

function MYMODULE_node_edit_form_access($node) {
  $type = is_string($node) ? $node : $node->type;
  if ($type == 'my_type') {
    return FALSE;
  } 
  return node_access('update', $node);
}

我喜欢克莱夫的两个建议,但还有一个选择是使用HOOK\u form\u alter简单地禁用字段。这也适用于用户1帐户。我最近用它禁用了一个我不希望任何人修改的特定字段

function YOURMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'your_form_id') {
    $form['body_field']['body']['#disabled'] = TRUE;
    $form['body_field']['body']['#value'] = $form['body_field']['body']['#default_value'];
  }
}

不可否认,如果您使用的是内置的body字段,那么这个解决方案并不理想。但是,如果您想禁用某些字段的编辑,同时保持节点的其他方面可编辑且页面保持不变,则此方法非常有效。

我不确定您为什么需要这些字段作为管理员。老实说,这一角色应该留给那些拥有绝对控制权的人——甚至那些人也不应该把它作为他们的“主要”账户,因为它有可能破坏东西。为什么不干脆扮演一个“编辑”角色或类似的角色,并授予您所需的所有权限?

谢谢。然而,我无法让
hook\u menu\u alter
完全按照您的建议工作。如图所示使用时,每次调用回调函数(MYMODULE_node_edit_form_access)时,其参数($node)都是一个值为“update”的字符串,这没有什么好处。但是,如果我添加以下行:
$items['node/%node/edit']['access arguments']=array(1)
,则
$node
参数会神奇地变成一个对象,
$node->type
变得有意义。老实说,我不知道为什么会这样。我偶然发现了它。任何解释,可以说明为什么这将是受欢迎的。我无法让这项工作为内置身体领域(这是我需要禁用)。问题可能是我使用了错误的
$form\u id
(我使用的是
mymodule节点表单,其中“mymodule”是我模块的名称)。每个Drupal表单都有一个唯一的表单id。您可以通过检查表单并查找名为“form\u id”的隐藏字段来找到它。该字段的值是表单“form id”。对于Drupal节点表单,它应该是“contenttype\u node\u form”,其中“contenttype”是内容类型的机器名;e、 g.“文章”或“页面”。谢谢!我使用了错误的
$form\u id
(连字符而不是下划线)。另外,我的表单中似乎没有
body\u字段
数组索引。以下命令将禁用body字段:
$form['body']['#disabled']=TRUE你和克莱夫之间的问题是哪个答案是“最好的”-但是因为我理解(我认为)你的答案,你得到15分。这是一个模块,将作为Drupal.org上的贡献项目提供。我无法知道可能使用我的模块的管理员的技能水平。与其在代码中添加警告(“不要以管理员身份编辑节点!”),我宁愿禁用该功能。