web-dev-qa-db-ja.com

ユーザーがPrivatemsgモジュールを介してメッセージを送信できないようにするルールを作成するにはどうすればよいですか?

私のウェブサイトの登録ユーザーへの礼儀として、私はプライベートメッセージを送信するすべてのユーザーにプロフィール写真を要求しています。

私はすでにサイト全体にシステムメッセージを配置しており、そのような画像をアップロードできるように(たとえば、ユーザーがログインしたとき、またはユーザーのプロファイルにアクセスしたとき)、そのような画像をアップロードできるアカウント編集ページへのリンクが表示されます。

しかし、写真がない場合(つまり、メッセージが送信される前に)、プライベートメッセージの送信を(もちろん禁止せずに)ブロックするにはどうすればよいですか?

フォールバックシナリオ:発生する前にアクションを停止できない場合、メッセージが配信されないようにするには、もちろん送信者に適切な警告を出しますか?

メッセージは Rule モジュールではなく Privatemsg モジュールによって送信されます。

何か案が?


更新

以下に提案されている両方のソリューション(jeroenとPierre Vriens)を試してみましたが、どちらもうまくいきました。

以下のピエールのソリューションはうまく機能し、実装が最も簡単です。

それを実装する際にガイダンスが必要な人のために、ここにステップがあります:

1-新しい役割を作成します。私は「プライベートメッセージを送信できます」と呼んだ

2-この新しいロールに「privatemsg送信権限」のみを付与します。認証済みユーザーのアクセス許可(およびそれを持っているべきで許可されていない他の役割)から同じ許可を削除します。この段階では、新しい役割を持つユーザーのみがプライベートメッセージを送信できます。その他は「アクセス権がありません...」ページに送られます。

3-最初のルールを作成します。名前を付け、[ユーザー]で[アカウントが作成されます]を選択します。それを保存。 2番目のイベントを作成し、[ユーザー]の下で、「アカウントが更新されたとき」を選択します。これで、同じルールに2つのイベントがあります。

4-条件を作成します。「データ値が空です」を選択します。次に、ドリルダウンして、メイン画像を含める必要があるフィールドの名前を選択します(私の場合、 "site:current-user:field-user-image"です)。その下にある[否定]チェックボックスをオンにします。つまり、ルールはフィールドが空でないかどうかをチェックします。

5-アクションを作成します。フィールドが空でない場合にロールを付与する必要があります。したがって、[ユーザー]で[ユーザーロールを追加]を選択します。データセレクターは「アカウント」であり、役割の値を選択します(新しい役割に付けた名前です)。

以上です。ユーザーが画像を削除した場合に役割を失うようにするには、少し複雑ではありませんが、新しいルールを作成する必要があります。私は「プライベートメッセージの送信を無効にする」と呼びました。 「既存のユーザーアカウントを更新した後」というイベントが1つだけあります。条件は「データ値が空です」ですが、[否定]チェックボックスはオンにしないでください。アクションについては、それは非常に簡単です。最初のルールと同様ですが、代わりに削除ロールを選択します。

このルールを機能させるには、ユーザーは自分のアカウントに移動して、[保存]ボタンをクリックする必要があります。これは新しいアカウントでも問題ありませんが、サイトにすでに多くのユーザーがいる場合は欠点になる可能性があります。しかし、最終的には、すべての方法でアカウントが更新され、ルールが実装されます。少数のユーザーのみの場合、管理者(ユーザー#1)は自分のアカウントに移動し、新しいロールボックスをクリックしてロールを付与できます。

以下の2番目の更新を参照してください。

繰り返しになりますが、ピエールの洞察に満ちたアプローチに感謝します。

4
user14666

Privatemsg-Rules Integration に関するコミュニティのドキュメント、特に Privatemsg-Rulesの紹介 に関する子ページをご覧ください。さまざまな Rules がリストされています。利用可能なイベント、条件、アクション。私はあなたがあなたが求めていることをするために利用できるものは何もないと思います、そしてそれはあなたのフォールバックシナリオを実装することも助けにはなりません。

ただし、「問題を解決しようとしています」の代わりに、次の方法を使用できます。 "問題の発生を防止します" ...これは、かなり確実に機能するはずです。

  1. 「PrivateMsgOk」のような役割を作成します(好きな名前を付けてください)。
  2. ロール「PrivateMsgOk」のプライベートメッセージへのアクセスのみを許可します。
  3. Rules を使用して、写真をアップロードした後、ロール "PrivateMsgOk"を自動的に割り当てます(その後、何らかの方法でその写真を "削除"できる場合は、再度削除します)。

上記のアプローチの欠点は、システムメッセージを投稿して、ユーザーに(許可されていない)ユーザーに通知(通知)して、そのようなユーザーがメッセージを送信できない理由を説明できないことです。ただし、これは、その動作を可能にするバリエーション(拡張バージョン)です。

  1. 「PictureUploadOk」のようなロールを作成します(好きな名前を付けてください)。
  2. プライベートメッセージへのアクセスを「PictureUploadOk」の役割を持つユーザーのみに制限しないでください。代わりに、プライベートメッセージ機能を「表示」できるようにしたい人にそのアクセス権を与えます。ただし、プロフィール写真がない場合は、以下で説明するように、プライベートメッセージを送信しようとすると中断されます。
  3. 最初のルールを作成( Rules モジュールを使用)して、写真をアップロードした後にロール「PictureUploadOk」を自動的に割り当てます(その後、何らかの形でその写真を「削除」できる場合は、再度削除します)。
  4. 「新しいコンテンツを作成する前に」などのルール条件を指定する方法? に対する私の回答に含まれているルールのバリエーションである2番目のルールを作成します( Rules モジュールを使用)。 = "。この2番目のルールの詳細は次のとおりです。

    • (システム)を使用しますRules Event "Drupal is initializing"。
    • 「役割が 'PictureUploadOk'ではありません」のような最初のルール条件を使用します。
    • 2番目のRules条件も使用する必要があります。これも真である必要があるため(「AND」を介して1番目のルール条件と組み合わせる)、text_matchesのいずれかに似ていますこれは、(たとえば)/messages/new(プライベートメッセージを送信するためのURLであると想定)のようなURLに対応します。
    • Rules Action内に「」システムメッセージを設定して、(許可されていない)ユーザーに理由を説明するよう通知(通知)しますこのようなユーザーはメッセージを送信できません "。タイプは「警告」ではなく「エラー」にしてください。
2
Pierre.Vriens

メッセージが送信されたときに Privatemsg によって提供される唯一のアクションが呼び出されるため、これに Rules モジュールを直接使用することはできないと思います。したがって、簡単なコードを書くことをお勧めします。

ユーザーがまだプロフィール写真を設定していない場合、フィールドは空であるか、設定で選択した場合はデフォルトの写真が表示されます。どちらの場合も、_$user->picture_の値は_0_です。この事実は、カスタムモジュールの次のコードでプライベートメッセージの送信フォームを非表示にすることで使用できます。

_function MYMODULE_form_privatemsg_new_alter(&$form, &$form_state, $form_id) {
  global $user;
  if ($user->picture==0) {
    hide($form);
  }
}
_

以下のコメントで提案されているように、hide($form);の代わりに_$form['#access'] = FALSE;_を使用することもできます。たとえば、メッセージを表示するコード行を追加できますプロフィール写真を追加してください!またはifステートメントに必要なものを追加します。

4
Jeroen

OK。完璧な答えを提供してくれたPierre.Viriensに再度感謝します。私は「Drupalが初期化しています」イベントにあまり詳しくありませんでしたが、トリックと彼が提供したリンク 新しいコンテンツを作成する前にルール条件を指定する方法 は非常に役に立ちました。もちろん、私はそれをいじって、自分の状況に合わせて機能させる必要がありました。興味のある方のために、私は以下の最終規則のエクスポートを再現しています。

{ "rules_private_messages_send_authorization_check" : {
    "LABEL" : "Private messages send authorization check",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "init" : [] },
    "IF" : [
      { "text_matches" : { "text" : [ "site:current-page:url" ], "match" : "messages\/new" } },
      { "AND" : [] },
      { "data_is_empty" : { "data" : [ "site:current-user:field-user-image" ] } },
      { "AND" : [] },
      { "NOT data_is" : {
          "data" : [ "site:current-user:roles" ],
          "value" : { "value" : { "9" : "9" } }
        }
      }
    ],
    "DO" : [ { "redirect" : { "url" : "message\/new" } } ]
  }
}

2つの類似したパスに注意してください。最初のメッセージ( "messages/new")は、新しいメッセージページにアクセスするためのPrivatemsgモジュールパスです( "messages"は複数形です)。2番目の "message/new"(単数形)は、ノード(記事またはページ)のパスです。 ) 私は造った。このノードで、必要なメッセージを入力できます(画像やグラフィックスも含めることができます)。

プロフィール写真を持たないユーザーがシステムを打ち負かそうとし、「s」を追加してパスにURLアドレスバーの「messages/new」を読み取らせると、「アクセスは許可されていません。」にリダイレクトされます。 .. "デフォルトのエラーページ。

ルールの「9」の値は、ルールモジュールによって割り当てられ、プロフィール写真がないユーザー用に作成した新しいロールの名前に対応します(上記の更新を参照してください)。

これにより、ユーザーはモジュールの「メッセージ/新規」ページに送られ、プロフィール画像がある場合はメッセージを送信できます。プロファイル画像がない場合は「メッセージ/新規」ページに送信されます。そこに到着すると、彼はメッセージを送信できなくなり、なぜそうなのか通知されます。

私はこのルールを徹底的にテストしましたが、問題なく動作します。私の場合、3つの条件が必要です。

@ Pierre.Viriens、ありがとうございます。

1
user14666