Как правильно показать посетителю ошибку?


Я использую пользовательский обработчик отправки для веб-формы, которая отправляет важные данные формы в другой API. Эта часть работает, но иногда могут возникать случайные сетевые ошибки, которые препятствуют успешной отправке, например, если конечная точка REST оказалась отключенной в этот конкретный момент (или что-то еще).

В таких случаях я не хочу, чтобы пользователь думал, что его форма успешно отправлена, когда это не так. Как я могу переопределить страницу подтверждения пользовательским страница с ошибкой? Я попытался drupal_set_message(), но он нигде не отображается на странице подтверждения, которую я мог видеть.

В идеале я также мог бы вернуть идентификатор события, сгенерированный при регистрации watchdog, чтобы пользователь, если он свяжется с нами по телефону или электронной почте, увидев ошибку, смог предоставить дополнительную информацию, которая может помочь нам ее отладить.

Таким образом, в целом, в идеальном мире неудачное представление приведет к:

  1. Отправка формы ($form_state), в которую был выполнен вход сторожевой пес или другой журнал
  2. Сторожевой таймер возвращает соответствующий идентификатор события
  3. Пользователь видит пользовательскую страницу ошибки, описывающую ошибку, с идентификатором события в качестве кода ошибки, чтобы помочь в отладке.

Я могу взломать что-то вместе с 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);
  }

Спасибо за помощь!

Author: No Sssweat, 2020-01-17

1 answers

Имейте свой код POST внутри функции проверки, которая выполняется последней, после того, как все остальные проверки пройдены.

Бывший: $form['submit']['#validate'][] = 'mymodule_post_to_api';

И используйте form_set_error('form', 'Failed to connect to API, try again later'); внутри вашего catch.

Что касается ошибок в ПОСТЕ, не ждите, пока кто-нибудь сообщит об этом. Программно заставьте Drupal отправить себе или тому, кто поддерживает код, электронное письмо с полями формы и сведениями об ошибке.

Смотрите Как программно отправить электронное письмо?

 1
Author: No Sssweat, 2020-01-18 05:33:01