我有一个以编程方式创建(和更新)Drupal 7节点的模块。
由于身体的内容是由程序以随机间隔改变的,所以我不希望任何人(包括管理员)能够编辑它们。有没有办法完全“关闭”允许管理员编辑节点的界面?
答案 0 :(得分: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);
}
答案 1 :(得分: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'];
}
}
不可否认,如果你因为预告片而使用内置的身体字段,这个解决方案并不理想。但是,如果您想要禁用某些字段的编辑,同时保持节点的其他方面可编辑且页面完整,那么它的效果很好。
答案 2 :(得分:0)
我不确定为什么你需要他们成为管理员。老实说,这个角色应该留给绝对控制的人 - 甚至那些人也不应该把它当作他们的“主要”帐户,因为这可能会破坏事物。为什么不只是做一个“编辑”角色或类似的东西,并提供你需要的所有权限?