2

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

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

4

3 回答 3

2

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

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),您需要获得更多创意,因为该用户绕过了许多访问检查。

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

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);
}
于 2012-12-11T21:35:48.200 回答
1

我喜欢 Clive 的两个建议,但另一种选择是简单地使用 HOOK_form_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 字段,则此解决方案并不理想。但是,如果您想禁用某些字段的编辑,同时保持节点的其他方面可编辑并且页面保持不变,那么它会非常有用。

于 2012-12-12T12:25:24.323 回答
0

我不确定你为什么需要他们成为管理员。老实说,这个角色应该留给拥有绝对控制权的人——即使是那些人也不应该把它用作他们的“主要”账户,因为它可能会破坏事物。为什么不只是创建一个“编辑”角色或类似的角色,并提供您需要的所有权限?

于 2012-12-18T22:20:21.123 回答