web-dev-qa-db-ja.com

訪問者にエラーを表示する適切な方法は何ですか?

重要なフォームデータを別のAPIにPOSTするWebフォームに カスタム送信ハンドラ を使用しています。その部分は機能しますが、RESTエンドポイントがその特定の瞬間(または何でも)に偶然ダウンしている場合など)、送信の成功を妨げるランダムなネットワークエラーが発生する場合があります。

そのような場合、ユーザーがフォームを送信できなかったにもかかわらず、正常に送信されたとユーザーに思わせたくありません。確認ページをカスタムエラーページで上書きするにはどうすればよいですか? drupal_set_message()を試しましたが、確認ページのどこにも表示されません。

理想的には、watchdogロギングによって生成されたイベントIDを取得して、ユーザーがエラーを見たときに電話または電子メールで連絡した場合に役立つ情報を提供できるようにすることもできます。デバッグします。

つまり、要約すると、完璧な世界では、提出に失敗すると次のような結果になります。

  1. ウォッチドッグまたは別のログにログインしているフォーム送信($ form_state)
  2. ウォッチドッグは関連するイベントIDを返します
  3. ユーザーには、エラーを説明するカスタムエラーページが表示され、イベントIDがデバッグに役立つエラーコードとして表示されます。

die()とフォームデータのハッシュを一緒にエラーコードとしてハッキングできますが、より適切で適切なDrupal方法はありますか?

これまでの関連コード:

 try {
    $apiResponse = drupal_http_request($apiEndPoint, [
      'headers' => ['Content-Type' => 'application/json'],
      'method' => 'POST',
      'data' => drupal_json_encode($formData),
      'timeout' => 5 // Timeout in seconds.
    ]);

    // I'm not okay :(
    if ($apiResponse->code != "200") {
      throw new Exception ($apiResponse->data, $apiResponse->code);
    }
  } catch (Throwable $e) {
    watchdog('tfm_custom_form_handlers', "A custom form handler failed: (@code) @message.", [
      '@code' => $e->getCode(),
      '@message' => $e->getMessage(),
    ], WATCHDOG_ERROR);
  }

助けてくれてありがとう!

1
arcataroger

他のすべての検証に合格した後、最後に実行される検証関数内にPOSTコードを含めます。

例:_$form['submit']['#validate'][] = 'mymodule_post_to_api';_

catch内でform_set_error('form', 'Failed to connect to API, try again later');を使用します。

POSTのエラーについては、誰かが報告するのを待たないでください。プログラムでDrupal自分またはコードの管理者にフォームフィールドとエラーの詳細を記載した電子メールを送信します。

参照 プログラムでメールを送信する方法?

1
No Sssweat