Token Authentication および Privatemsg モジュールを一緒に使用しています。ユーザーがプライベートメッセージを受信したという電子メール通知を受け取ったときに、ユーザーがログインしてメッセージを表示できるようにするリンク(クエリ文字列にTokenauthモジュールによって提供されるトークンを使用)を配置しました。
ページの下部には、メッセージの返信フォームがあります。ユーザーがこのフォームからも(ログインせずに、トークン認証を介して)返信できるようにしたいと思います。しかし、これをテストすると、次のエラーが表示されました。
フォームが古くなっています。保存されていない作業を以下のフォームにコピーしてから、このページを再読み込みしてください。
グーグル検索は明らかにした drupal.orgに関するこの有用なコメント :
だからあなたはどちらかをしなければならないようです
unset($ form ['#token'])または$ form ['#token'] = NULL
Privatemsgには、新しいメッセージフォームとメッセージへの返信フォームの2つのメッセージ作成フォームがあります。
新しいメッセージフォームを修正するために、unset($form['#token']);
にhook_form_privatemsg_new_alter()
(新しいメッセージ)とhook_form_privatemsg_form_reply_alter()
(返信)を追加しました。これをテストし、新しいプライベートメッセージと返信を送信できるようになりました。
次に privatemsgモジュールのキャッシュを無効にする なので、メッセージは常に更新されます。
しかし、私はサイトにメッセージを表示(「あなたのメッセージはユーザーXに送信されました!」)に設定されているルールがあります。または返信が送信されます。プライベートメッセージがデータベースに適切に保存され、ページの更新時に表示されても、ユーザーがTokenauthを介して認証された場合、このルールはプライベートメッセージの送信時にトリガーされません。
Tokenauthを介して認証されたときにルールが引き続きトリガーされることを確認するにはどうすればよいですか?
私の観点からは、ルールはまったくトリガーされていないようです。ただし、カスタムフォーム送信関数内で rules_invoke_event() 呼び出しを配置して、手動でルールを呼び出すこともできます。
Drupalフォームの _#submit
_ プロパティを使用すると、1つのフォームに対して複数の送信ハンドラを呼び出すことができます。
実装したhook_form_privatemsg_new_alter()
およびhook_form_privatemsg_form_reply_alter()
フォームの変更では、_#submit
_プロパティを検索および変更できるはずです。次のようなことをしてください:
_// Implementation of hook_form_FORMID_alter().
patricks_form_privatemsg_new_alter($form, &$form_state) {
...
$form['#submit'][] = 'patricks_privatemsg_submit';
return $form;
}
_
次に、送信ハンドラで、rules_invoke_event()を使用できます。
_function patricks_privatemsg_submit($form, &$form_state) {
drupal_set_message(t('The form has been submitted.'));
// Pass parameters for the variables provided by this event, as defined in hook_rules_event_info()...
rules_invoke_event('privmsg_foo_rule', $foos, $barf, $bam);
}
_
何らかの理由でrules_invoke_event()関数が見つからないというエラーが発生した場合は、ルールを呼び出す前に module_load_include() を送信ハンドラに追加してください。