回答:
hook_form_alter()
モジュールに実装します。フォームがノードコメントフォームの場合は、現在ログインしているユーザーがこのノードに以前にコメントしたかどうかを確認します。(このためのカスタム関数を作成する必要がある場合があります。)ユーザーがノードにコメントした場合は、送信ボタンとテキストエリアを無効にします。
タグ付けされたDrupal 7、しかし私は風に注意を払い、Drupal 8に答えを提供します…
私の方法:設定してフォームを完全に非表示にする $form['access'] = false;
次に、親ノードを識別し、それに添付されているコメントに対してデータベースクエリを実行するmymodule.moduleのコードを示します。(これは、標準のコメントに加えて「評価」コメントタイプを作成するプロジェクトから取得されたものです)。
/*
* Implements HOOK_form_alter
*/
function mymodule_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
switch ($form_id) {
// change this to the correct form name for your site
case 'comment_ratings_form':
$current_user = \Drupal::currentUser();
// Find which node this comment form is attached to
$comment_entity = $form_state->getFormObject()->getEntity();
$review_nid = $comment_entity->get('entity_id')->target_id;
// Remember: the comments field in a node doesn't contain the actual
// comments, just settings and stats. We need to do an entity query
// and find all the comments pointing to the node.
// Has user already commented?
$rating_ids = \Drupal::entityTypeManager()
->getStorage('comment')
->getQuery('AND')
// attached to the current node
->condition('entity_id', $review_nid)
// authored by current user
->condition('uid', $current_user->id())
// if you have multiple comment types, you could
// filter by those too
//->condition('comment_type', 'ratings')
->execute();
if (!empty($rating_ids)) {
// already commented, hide the form
$form['#access'] = FALSE;
}
break;
}
}
5年後...カスタムコードを記述したくない場合、またはコメント制限モジュール(D7の開発バージョンしかない)を使用する場合は、以下で説明するように、ルールとフラグモジュールを使用できます。
Flagモジュールを使用して、「コメントが送信されました」などのラベル(およびマシン名comment_submitted
)を持つ(グローバルではない)フラグを作成します。
ルールを使用して、「新しいコメントを保存した後」のルールイベントでカスタムルールを作成します。
このルールは、ルールアクション「フラグノード」を実行する必要があります(手順1で作成したフラグを使用)。
ルールを使用して、ユーザーが以前にコメントしたノード(=コメント作成者によってフラグが立てられたノード)に対するユーザーからの追加コメントを非公開にするカスタムルールを作成します。これに使用できるルールは次のとおりです(ルールのエクスポート形式で、使用するフラグのマシン名を更新してから、自分のサイトにインポートします)。
{ "rules_unpublish_additional_comments" : {
"LABEL" : "Unpublish additional comments",
"PLUGIN" : "reaction rule",
"ACTIVE" : false,
"OWNER" : "rules",
"REQUIRES" : [ "rules", "flag", "comment" ],
"ON" : { "comment_insert" : [] },
"IF" : [
{ "flag_flagged_node" : {
"flag" : "comment_submittedr",
"node" : [ "comment:node" ],
"flagging_user" : [ "comment:author" ]
}
}
],
"DO" : [ { "data_set" : { "data" : [ "comment:status" ], "value" : "0" } } ]
}
}
注:このルールは、ステップ3のタイトルと同様に機能します(= 追加のコメントを非公開にする)。したがって、コメントフォームは非表示になりません(質問でも明示的に尋ねられません)。追加のルールアクションとして「メッセージの設定」を追加すると、それを明確にするのに役立ちます。したがって、質問の下のOPerからのコメントに従って、この回答は、ルールを使用して同様の結果を達成する「方法」があることを示しているはずです(開発バージョンのみの別のモジュールを追加する代わりに使用します)。
create a (global) flag
ここではグローバルフラグを使用しないでください。各ユーザーに独自のフラグを設定する必要があるためです。