Điểm:0

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

lá cờ 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
lá cờ us
`curl_exec()` vẫn trả về `FALSE` trong trường hợp có lỗi, ngay cả khi bạn đặt `CURLOPT_RETURNTRANSFER` thành `TRUE`. Việc chuyển đến `json_decode()` một giá trị không phải là chuỗi có thể sẽ gây ra lỗi. Ngoài ra, một khi tài nguyên được hủy cấp phát bằng `curl_close()`, thì việc chuyển tài nguyên đó cho bất kỳ hàm cURL nào cũng không có ý nghĩa gì.
lá cờ in
Tôi sẽ cố gắng cải thiện mã nhưng điều này không giải đáp được vấn đề hiện tại của tôi.
apaderno avatar
lá cờ us
Mã không xử lý chính xác giá trị được trả về từ `curl_exec()`. Đây ít nhất là phần đầu tiên để sửa chữa.
lá cờ in
Với mã hiện tại, tôi đã ném ngoại lệ nếu mã trạng thái phản hồi không phải là 200 (Không có phản hồi hợp lệ từ máy chủ) nhưng chế độ xem vẫn hiển thị thông báo thành công.
apaderno avatar
lá cờ us
Mã hiển thị trong câu hỏi bắt ngoại lệ, nhưng ngoại lệ được đưa ra khi: Giá trị của `$succeed` tương đương với Boolean `FALSE` và giá trị được trả về từ `curl_getinfo($curl, CURLINFO_HTTP_CODE)` khác với 200 .Gọi `curl_getinfo($curl, CURLINFO_HTTP_CODE)` sau `curl_close()` không có ý nghĩa gì. Ngoại lệ bị bắt trước khi nó đến chế độ xem, chế độ xem này cho rằng không có gì sai xảy ra.
apaderno avatar
lá cờ us
Ngoài ra, câu hỏi hiển thị mã cho trình xử lý Biểu mẫu web. Từ đó đến một bước xem là quá dài. Không có cách nào để trình xử lý Biểu mẫu web trả lại nội dung nào đó cho chế độ xem, điều này cũng không liên quan.
lá cờ in
Tôi di chuyển dòng `curl_close()` sau mệnh đề if nhưng nó không thay đổi gì cả. Ném ngoại lệ gây ra lỗi cho biết `Ngoại lệ PHP chưa bắt được: "Không có phản hồi hợp lệ từ máy chủ."`
lá cờ in
Vì vậy, không có cách nào để thông báo cho chế độ xem đã xảy ra lỗi trên trình xử lý?
apaderno avatar
lá cờ us
Bạn nên kiểm tra chức năng của mã mô-đun Webform và cách nó tích hợp với mô-đun Chế độ xem. Nếu có điều gì đó mà mô-đun Chế độ xem yêu cầu mô-đun Webform, mà mô-đun Webform yêu cầu trình xử lý Biểu mẫu web của nó, thì điều đó có thể xảy ra. Nếu không, không, nó không thể.
lá cờ in
Tôi không thể tìm thấy cách thực hiện trong tài liệu, do đó, câu hỏi của tôi.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.