私のウェブサイトの登録ユーザーへの礼儀として、私はプライベートメッセージを送信するすべてのユーザーにプロフィール写真を要求しています。
私はすでにサイト全体にシステムメッセージを配置しており、そのような画像をアップロードできるように(たとえば、ユーザーがログインしたとき、またはユーザーのプロファイルにアクセスしたとき)、そのような画像をアップロードできるアカウント編集ページへのリンクが表示されます。
しかし、写真がない場合(つまり、メッセージが送信される前に)、プライベートメッセージの送信を(もちろん禁止せずに)ブロックするにはどうすればよいですか?
フォールバックシナリオ:発生する前にアクションを停止できない場合、メッセージが配信されないようにするには、もちろん送信者に適切な警告を出しますか?
メッセージは Rule モジュールではなく Privatemsg モジュールによって送信されます。
何か案が?
以下に提案されている両方のソリューション(jeroenとPierre Vriens)を試してみましたが、どちらもうまくいきました。
以下のピエールのソリューションはうまく機能し、実装が最も簡単です。
それを実装する際にガイダンスが必要な人のために、ここにステップがあります:
1-新しい役割を作成します。私は「プライベートメッセージを送信できます」と呼んだ
2-この新しいロールに「privatemsg送信権限」のみを付与します。認証済みユーザーのアクセス許可(およびそれを持っているべきで許可されていない他の役割)から同じ許可を削除します。この段階では、新しい役割を持つユーザーのみがプライベートメッセージを送信できます。その他は「アクセス権がありません...」ページに送られます。
3-最初のルールを作成します。名前を付け、[ユーザー]で[アカウントが作成されます]を選択します。それを保存。 2番目のイベントを作成し、[ユーザー]の下で、「アカウントが更新されたとき」を選択します。これで、同じルールに2つのイベントがあります。
4-条件を作成します。「データ値が空です」を選択します。次に、ドリルダウンして、メイン画像を含める必要があるフィールドの名前を選択します(私の場合、 "site:current-user:field-user-image"です)。その下にある[否定]チェックボックスをオンにします。つまり、ルールはフィールドが空でないかどうかをチェックします。
5-アクションを作成します。フィールドが空でない場合にロールを付与する必要があります。したがって、[ユーザー]で[ユーザーロールを追加]を選択します。データセレクターは「アカウント」であり、役割の値を選択します(新しい役割に付けた名前です)。
以上です。ユーザーが画像を削除した場合に役割を失うようにするには、少し複雑ではありませんが、新しいルールを作成する必要があります。私は「プライベートメッセージの送信を無効にする」と呼びました。 「既存のユーザーアカウントを更新した後」というイベントが1つだけあります。条件は「データ値が空です」ですが、[否定]チェックボックスはオンにしないでください。アクションについては、それは非常に簡単です。最初のルールと同様ですが、代わりに削除ロールを選択します。
このルールを機能させるには、ユーザーは自分のアカウントに移動して、[保存]ボタンをクリックする必要があります。これは新しいアカウントでも問題ありませんが、サイトにすでに多くのユーザーがいる場合は欠点になる可能性があります。しかし、最終的には、すべての方法でアカウントが更新され、ルールが実装されます。少数のユーザーのみの場合、管理者(ユーザー#1)は自分のアカウントに移動し、新しいロールボックスをクリックしてロールを付与できます。
以下の2番目の更新を参照してください。
繰り返しになりますが、ピエールの洞察に満ちたアプローチに感謝します。
Privatemsg-Rules Integration に関するコミュニティのドキュメント、特に Privatemsg-Rulesの紹介 に関する子ページをご覧ください。さまざまな Rules がリストされています。利用可能なイベント、条件、アクション。私はあなたがあなたが求めていることをするために利用できるものは何もないと思います、そしてそれはあなたのフォールバックシナリオを実装することも助けにはなりません。
ただし、「問題を解決しようとしています」の代わりに、次の方法を使用できます。 "問題の発生を防止します" ...これは、かなり確実に機能するはずです。
上記のアプローチの欠点は、システムメッセージを投稿して、ユーザーに(許可されていない)ユーザーに通知(通知)して、そのようなユーザーがメッセージを送信できない理由を説明できないことです。ただし、これは、その動作を可能にするバリエーション(拡張バージョン)です。
「 「新しいコンテンツを作成する前に」などのルール条件を指定する方法? に対する私の回答に含まれているルールのバリエーションである2番目のルールを作成します( Rules モジュールを使用)。 = "。この2番目のルールの詳細は次のとおりです。
text_matches
のいずれかに似ていますこれは、(たとえば)/messages/new
(プライベートメッセージを送信するためのURLであると想定)のようなURLに対応します。メッセージが送信されたときに 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
ステートメントに必要なものを追加します。
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、ありがとうございます。