各ユーザーがノードごとにコメントを1つだけに制限する方法は?


7

Drupal 7サイトのノードごとに1つのコメントのみを作成するように各サイトユーザーを制限できる方法があるかどうか誰かが知っていますか?まだ何も見つかりません。

フラグとルール、トリガーとアクションとリダイレクトを使用した複雑な設定を試しました。これはうまくいきませんでした。

回答:


8

hook_form_alter()モジュールに実装します。フォームがノードコメントフォームの場合は、現在ログインしているユーザーがこのノードに以前にコメントしたかどうかを確認します。(このためのカスタム関数を作成する必要がある場合があります。)ユーザーがノードにコメントした場合は、送信ボタンとテキストエリアを無効にします。


コメントフォームがノードと同じページにある場合、これはまだ機能しますか?また、現在のグローバル$ userが以前にコメントしたかどうかを確認するにはどうすればよいですか?それは私がはっきりしていなかったものです。
BenjaminRH

作成したコードに応じて、どこでも機能させることができます。問題のノードは$ formオブジェクトに付属しているか、urlパラメータから取得できると思います。ノードを取得し、すべてのコメントを読み込み、各作成者を解析し、作成者のuidが$ userと一致する場合、コメントフォームを無効にするか非表示にします
LSU_JBob

1
実際のコメントフォームでテストを試してみました。それは素晴らしい働きをするので、私はそれを私が望むもののために機能させることができるはずです。ありがとう!
BenjaminRH

1

タグ付けされた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;
  }

}

0

5年後...カスタムコードを記述したくない場合、またはコメント制限モジュール(D7の開発バージョンしかない)を使用する場合は、以下で説明するように、ルールフラグモジュールを使用できます。

ステップ1:コメントでノードにフラグを立てる

Flagモジュールを使用して、「コメントが送信されました」などのラベル(およびマシン名comment_submitted)を持つ(グローバルではない)フラグを作成します。

ステップ2:コメント送信を登録する

ルールを使用して、「新しいコメントを保存した後」のルールイベントでカスタムルールを作成します。

このルールは、ルールアクション「フラグノード」を実行する必要があります(手順1で作成したフラグを使用)。

ステップ3:追加のコメントを非公開にする

ルールを使用して、ユーザーが以前にコメントしたノード(=コメント作成者によってフラグが立てられたノード)に対するユーザーからの追加コメントを非公開にするカスタムルールを作成します。これに使用できるルールは次のとおりです(ルールのエクスポート形式で、使用するフラグのマシン名を更新してから、自分のサイトにインポートします)。

{ "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からのコメントに従って、この回答は、ルールを使用して同様の結果を達成する「方法」があることを示しているはずです(開発バージョンのみの別のモジュールを追加する代わりに使用します)。


1
create a (global) flagここではグローバルフラグを使用しないでください。各ユーザーに独自のフラグを設定する必要があるためです。
Sssweatなし16年

私はまだこの答えが少し疑わしいと思います。このルールは正確に何をしますか?したがって、ユーザーが初めてコメントしたノードにフラグを設定しますが、ユーザーが再びコメントすることを停止しますか?それはそれ以上のコメントの試みを非公開にするだけのようですが、コメントボックスを非表示にしません...これは正しいですか?
Sssweatなし16年

十分に公平ですが、これはゼロコーディングソリューションと同じくらい良いと思います。
Sssweatなし16年

@NoSssweat:それは良い要約のように見えますが、「カスタム」コード(および提供されたコードと管理構成のみ)はゼロの方がおそらくより正確な要約です。また、サイトが他の理由で既にルールを使用している場合(そのようなサイトを想像することはできませんが、これは別のトピックです...)、このアプローチに進むための障壁が低くなります。Flagモジュールも同様です。PS:一部のコメントを整理する時間です(「避けてください...」を参照してください...ここでチャットするのは好きではありません)。
Pierre.Vriens
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.