web-dev-qa-db-ja.com

新しいコメントが同じページに投稿されたときにユーザーに通知する方法は?

Drupal 7のウェブサイトがあり、コンテンツタイプにコメントを表示します。

私が欲しいのは、すべてのユーザーが自分のプロフィールにブールフィールドを持ち、投稿したコンテンツタイプで新しいコメントが投稿されたときに通知を受けたいかどうかを宣言することです。

Comment Notify モジュールを試しましたが、コメントを投稿する直前にそのオプションが表示され、ユーザープロファイル/フィールドを使用できません。

管理者がユーザーのコメントの1つに返信したときにユーザーに通知されるように、私はすでに同様の通知を達成しています。

私は Rules モジュールを使用して、コメントが投稿される前に、これらのルール条件を使用して管理しました:

  • エンティティにはフィールド(comment:parent:author)およびデータ比較。ユーザープロファイルで関連するブール値を検証します。
  • comment:author:roles)管理者になる。

しかし、私は要求されたルールを達成できないようです。

コメントが投稿される前に、プロファイルでブール値が有効になっている場合、同じノードですべてのコメント投稿者を検索する必要があることはわかっていますが、ルールで作成することはできません。

要約すると、コンテンツタイプ(プロジェクト)があり、そのうちの約50を作成しました。ユーザーXがプロジェクトの1つにコメントを投稿し、ブール値を有効にしている場合、他のユーザーが同じプロジェクトにコメントすると、ユーザーXにメールで通知されます。

何か助けは?

4
Argiris A

このルールを見てください( Rules エクスポート形式)。

{ "rules_notify_commentors_about_new_comment" : {
    "LABEL" : "Notify commentors about new comment",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "rules_conditional", "comment" ],
    "ON" : { "comment_insert" : [] },
    "DO" : [
      { "variable_add" : {
          "USING" : { "type" : "list\u003Cuser\u003E" },
          "PROVIDE" : { "variable_added" : { "users_that_commented" : "Users that commented" } }
        }
      },
      { "LOOP" : {
          "USING" : { "list" : [ "comment:node:comments" ] },
          "ITEM" : { "current_comment_item" : "Current comment item" },
          "DO" : [
            { "list_add" : {
                "list" : [ "users-that-commented" ],
                "item" : [ "current-comment-item:author" ],
                "unique" : "1"
              }
            }
          ]
        }
      },
      { "LOOP" : {
          "USING" : { "list" : [ "users-that-commented" ] },
          "ITEM" : { "current_comment_author" : "Current comment author" },
          "DO" : [
            { "CONDITIONAL" : [
                {
                  "IF" : { "data_is" : {
                      "data" : [ "current-comment-author:field-accept-boolean" ],
                      "value" : "1"
                    }
                  },
                  "DO" : [
                    { "mail" : {
                        "to" : [ "current-comment-author:mail" ],
                        "subject" : "New comment to node with id [comment:node:nid]",
                        "message" : "There is a new comment added to the node with id [comment:node:nid]",
                        "language" : [ "" ]
                      }
                    }
                  ]
                }
              ]
            }
          ]
        }
      }
    ]
  }
}

必要な唯一の追加モジュールは 条件付きルール モジュールですが、Rulesモジュールで使用可能ないくつかのより高度な手法を使用します。

ルールのエクスポート形式でのルールの読み取り/消化に慣れている場合は、ルールが自明であることを願っています。そうでない場合は、上記のルールの要約です。

  • ルールイベント:明らか...新しいコメントを保存した後。
  • ルール条件:どんな適合も自由に追加してください(たとえば、この特定の質問の「Projects」のように、選択したコンテンツタイプのみに制限)。
  • ルールアクション:

    • 変数 "users_that_commented"(=ユーザーのリスト)を追加します。
    • 既存のすべてのコメントをループし、各コメント作成者について、その作成者をユーザーのリストに追加します(= users_that_commented)。オンになっている「一意」に注意してください(そのユーザーのリストに重複は必要ありません)。
    • ユーザーのリストをループします(= users_that_commented ...もう一度作成して入力しただけです)。そして、そのリストの各ユーザーについて、フィールドfield_accept_booleanがTRUEである場合は、この場合は「電子メールを送信」し​​てください( 条件付きルール モジュールがあるかどうかを確認できます)有効)。ここでの "To"の値は非常に重要です。本文、差出人、タイトルなどは、自分の想像に任されています。 Conditional Rules モジュールを使用したくない場合は、最後のルールループ内でルールアクションを作り直して、(適切なルール条件を追加する)ルールコンポーネントを実行して、この追加のモジュールは必要ありません(詳細については、「 条件付きルールモジュールを使用する代わりの方法は何ですか? 」の回答を参照してください)。

必要に応じて、条件付きルールモジュールを有効にし、field_accept_booleanのフィールド名を自分のフィールドのマシン名に合わせて置き換えた後、(ルールUIを使用して)上記のルールを自分のサイトにインポートします。

それが本当に必要なすべてです...ルール変数、ルールリストとループ、そして 条件付きルール

PS:私が考えることができるこのルールのマイナーな改善が1つあります(完璧では十分ではない場合)...誰かがそれが何であるかを見つけた後、質問の詳細も修正されたら、私は幸せです私の回答を更新して(=ルールの1詳細を変更して)、それも実装します。

4
Pierre.Vriens

Flag および Rules を使用すると、必要なことを実現できます。ユーザーに通知するには、 Message モジュールを使用できます。以下は、物事を機能させるための考えられる概要です。

  1. ノードフラグを作成しますフォロー
  2. メッセージタイプを作成します新しいコメント
  3. ユーザーがノードにコメントしたときに起動するルールを作成します。
    • ノードのコンテンツタイプがProjectsであることを確認します。
    • Followでノードにフラグを付けたすべてのユーザーを取得します。
    • このリストをループして、リスト内のすべてのユーザーに新しいコメントメッセージを作成します。
    • (ボーナス:通知のテキストによっては、メッセージのフィールドの一部を設定する必要がある場合があります。例: Entity Reference を使用する場合、コメントしたユーザーを参照して、そのユーザーを使用できます。たとえば、メッセージ内のユーザー名。)
  4. ユーザーがノードにコメントしたときに起動する2番目のルールを作成します。
    • ノードのコンテンツタイプがProjectsであることを確認します。
    • コメントユーザーが通知を受信するためのチェックボックスをオンにしたことを確認します。
    • コメントユーザーがFollowでノードにフラグを立てるようにします。

上記の手順が十分に明確であると想定して、問題のルールのエクスポートを追加しません。ちなみに、ユーザーにメールで通知したい場合は、メッセージモジュールを忘れて、最初のルールのループ内のアクションを「メールを送信」に置き換えるだけです。

2
Jeroen