Рейтинг:0

How to show error on screen after failling a webservice call on Webform submitForm?

флаг in

I made a custom handler for one of my webform to call a service when the form is submitted. Here is my code. It is working when the service return a response with status code = 200 but I cannot find a way to notify the view when an error is raised by the webservice. I would like to show a modal with an error message but cannot find how to do this.

class CRMWebformHandler extends WebformHandlerBase {

  public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
    try {
      $data = array(
        'firstName' => $webform_submission->getData()['lastname'],
        'lastName' => $webform_submission->getData()['firstname'],
        'civility' => $webform_submission->getData()['civility'],
        'email' => $webform_submission->getData()['email'],
      );
     
      $payload = json_encode($data);
      $curl = curl_init();
      curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
      curl_setopt($curl, CURLOPT_POST, 1);
      curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
      curl_setopt($curl, CURLOPT_URL, "https://my-url.com");
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

      $result = curl_exec($curl);
      curl_close($curl);

      $json = json_decode($result, TRUE);
      $succeed = is_bool($json) ? $json : FALSE;
      if (!$succeed && curl_getinfo($curl, CURLINFO_HTTP_CODE) !== 200) {
        throw new \Exception('No valid response from server.');
      }
    }
    catch (\Exception $exception) {
      \Drupal::messenger()->addError('No valid response from server.');
      return;
    }
  }
}
apaderno avatar
флаг us
`curl_exec()` по-прежнему возвращает `FALSE` в случае ошибок, даже если вы установили `CURLOPT_RETURNTRANSFER` в `TRUE`. Передача в `json_decode()` значения, которое не является строкой, вероятно, вызовет ошибку. Кроме того, как только ресурс освобождается с помощью `curl_close()`, передача этого ресурса любой функции cURL не имеет смысла.
флаг in
Я попытаюсь улучшить код, но это не решает мою текущую проблему.
apaderno avatar
флаг us
Код неправильно обрабатывает значение, возвращаемое функцией `curl_exec()`. По крайней мере, это первая часть, которую нужно исправить.
флаг in
С текущим кодом у меня возникает исключение, если код состояния ответа не равен 200 (нет действительного ответа от сервера), но все же в представлении отображается сообщение об успешном завершении.
apaderno avatar
флаг us
Код, показанный в вопросе, перехватывает исключение, но исключение возникает, когда: Значение `$succeed` эквивалентно логическому `FALSE`, а значение, возвращаемое из `curl_getinfo($curl, CURLINFO_HTTP_CODE)`, отличается от 200 .Вызов `curl_getinfo($curl, CURLINFO_HTTP_CODE)` после `curl_close()` не имеет смысла. Исключение перехватывается до того, как оно попадет в представление, которое считает, что ничего плохого не произошло.
apaderno avatar
флаг us
Кроме того, в вопросе показан код обработчика веб-формы. От него до вида шаг слишком длинный. У обработчика веб-формы нет никакого способа вернуть что-то в представление, которое также не может быть задействовано.
флаг in
Я перемещаю строку `curl_close()` после предложения if, но это ничего не меняет. Выброс исключения вызывает ошибку с сообщением «Uncaught PHP Exception Exception: «Нет действительного ответа от сервера».»
флаг in
Итак, нет способа уведомить представление об ошибке в обработчике?
apaderno avatar
флаг us
Вы должны проверить, что делает код модуля Webform и каким образом он интегрируется с модулем Views. Если есть что-то, что модуль Views запрашивает у модуля Webform, что модуль Webform запрашивает у своих обработчиков Webform, то это возможно. Иначе нет, нельзя.
флаг in
Я не мог найти, как это сделать в документации, поэтому мой вопрос.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.