我有一个以编程方式创建(和更新)Drupal 7 节点的模块。
由于主体的内容是由程序以随机间隔更改的,因此我不希望任何人(包括管理员)能够编辑它们。有没有办法完全“关闭”允许管理员编辑节点的界面?
如果它是具有管理员角色的标准用户,您可以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);
}
我喜欢 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 字段,则此解决方案并不理想。但是,如果您想禁用某些字段的编辑,同时保持节点的其他方面可编辑并且页面保持不变,那么它会非常有用。
我不确定你为什么需要他们成为管理员。老实说,这个角色应该留给拥有绝对控制权的人——即使是那些人也不应该把它用作他们的“主要”账户,因为它可能会破坏事物。为什么不只是创建一个“编辑”角色或类似的角色,并提供您需要的所有权限?