ユーザーが自分のコンテンツを非公開にして公開できるようにしたい。デフォルトでは、ユーザーがコンテンツを非公開または公開できるようにするには、「ノードの管理」権限を付与する必要があります。それは広義の方法です。ユーザーが作成した場合にのみ、ユーザーがノードを非公開または公開できるようにしたいと思います。これは、作成した場合にのみ、非公開ノードを表示できることも意味します。
私がいくつかのサイトで使用したUIアプローチは Override Node Options モジュールで、他の回答が提供するものと同様のアクセス許可を追加し、さらに追加します。
そのために常に Publish Content モジュールを使用します。それは、ノードにいくつかのきめ細かい権限と公開/非公開タブを追加します。
このモジュール
- きめ細かいパブリッシュおよびパブリッシュ解除の権限を有効にします。
- グローバル(コンテンツの非公開/公開)
- 「ノードタイプ」ごと([nodetype]コンテンツを非公開/公開)
- ユーザーごと(自分の[nodetype]コンテンツを非公開/公開)
- ワンクリックで非公開/公開するためのノードページに「公開/非公開」タブを追加します。
- 公開/非公開リンクをビューに公開し、レビュー担当者、編集者、および発行者のワークフローを合理化することを容易にします。
- 軽量で常にあります。
上記の方法に比べていくつかの利点がある Revisioning Module の使用をお勧めします。もちろん、それは完全にメンテナンスされたモジュールであるため、コードと多くのバグ修正に多くの注目が集まるでしょう。 2つ目は、これを全体のワークフローに合わせるための機能が増えることです。
ユースケースでは、ユーザーに「作成者」権限と「モデレーター」権限の両方を付与します。これにより、ユーザーは基本的に自分のコンテンツを管理できますが、モジュールの説明にあるように、ではありません「ノードの管理」を行うなど、神のような力を与えると、.
これを行うモジュールがありますが、名前を覚えていません。実際に、モジュールのアプローチは面倒すぎると感じました。実際の重要なコードが実際には1行だけであり、いくつかのアクセス許可ロジックでラップされていたため、コードがたくさんありました。
これは私のバージョンのコードです:
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');
}