Answers:
我在某些网站上使用的一种UI方法是“ 覆盖节点选项”模块,它添加了与我的其他答案所提供的权限类似的权限,以及大量附加权限。
我建议使用修订模块,它比上述方法有一些好处。当然,其中之一是它是一个完全维护的模块,因此,将有很多人关注代码和大量错误修复。第二,您将获得更多功能以使其适合您的整体工作流程。
对于您的用例,给用户既具有“创建者”权限又具有“主持人”权限,因此他们基本上可以管理自己的内容,但是如模块说明中所述,他们没有像授予“管理节点的意愿。
有一个模块可以做到这一点,但是我不太记得这个名字。实际上,我觉得该模块所采用的方法太麻烦了,当实际的重要代码实际上只是一行包含一些权限逻辑的代码时,它包含了很多代码。
这是我的代码版本:
function MYMODULE_perm() {
$perms[] = 'administer status of any content';
foreach (node_get_types() as $type) {
if (isset($type->type)) {
$perms[] = 'administer status of any '. check_plain($type->type) .' content';
$perms[] = 'administer status of own '. check_plain($type->type) .' content';
}
}
return $perms;
}
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form['#id'] == 'node-form' && $form_id == "{$form['#node']->type}_node_form" && _MYMODULE_access($form['#node']->type)) {
if ($form['options']['#access'] == FALSE) {
$form['options']['#access'] = TRUE;
}
}
}
function _MYMODULE_access($type) {
return user_access('administer status of any content')
|| user_access('administer status of any ' . check_plain($type) . ' content')
|| user_access('administer status of own ' . check_plain($type) . ' content');
}
这增加了一些额外的权限,允许您允许用户发布/取消发布他们自己的或所有内容类型,以及所有内容类型,以设置您希望的方式。
我只想更新解密者的答案,如果您不想添加其他模块以适合Drupal 7,那么女巫会向我提出最佳方法:
/**
* Implements hook_permission().
*/
function MYMODULE_permission() {
$perms = array(
'administer status of any content' => array(
'title' => t('Administer status for all content type'),
'description' => t(''),
'restrict access' => true
),
);
foreach (node_type_get_types() as $type) {
if (isset($type->type)) {
$perm_types = array(
'administer status of any '. check_plain($type->type) .' content' => array(
'title' => t('Administer status of any '. check_plain($type->type) .' content'),
'description' => t(''),
),
'administer status of own '. check_plain($type->type) .' content' => array(
'title' => t('Administer status of own '. check_plain($type->type) .' content'),
'description' => t(''),
),
);
$perms = array_merge($perms,$perm_types);
}
}
return $perms;
}
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if (preg_match('/_node_form$/', $form_id) && _MYMODULE_access($form['#node']->type)) {
if ($form['options']['#access'] == FALSE) {
$form['options']['#access'] = TRUE;
}
}
}
function _MYMODULE_access($type) {
return user_access('administer status of any content')
|| user_access('administer status of any ' . check_plain($type) . ' content')
|| user_access('administer status of own ' . check_plain($type) . ' content');
}