web-dev-qa-db-ja.com

トークン認証-「フォームが古くなっています」とルールの問題

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を介して認証されたときにルールが引き続きトリガーされることを確認するにはどうすればよいですか?

4
Patrick Kenny

私の観点からは、ルールはまったくトリガーされていないようです。ただし、カスタムフォーム送信関数内で 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() を送信ハンドラに追加してください。

2
amateur barista