Score: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 flag
`curl_exec()` ยังคงคืนค่า `FALSE` ในกรณีที่เกิดข้อผิดพลาด แม้ว่าคุณจะตั้งค่า `CURLOPT_RETURNTRANSFER` เป็น `TRUE` ก็ตาม การส่งค่าที่ไม่ใช่สตริงไปยัง `json_decode()` อาจทำให้เกิดข้อผิดพลาดได้ นอกจากนี้ เมื่อทรัพยากรถูกยกเลิกการจัดสรรด้วย `curl_close()` การส่งทรัพยากรนั้นไปยังฟังก์ชัน cURL ใดๆ ก็ไม่สมเหตุสมผล
in flag
ฉันจะพยายามปรับปรุงโค้ด แต่นี่ไม่ตอบโจทย์ปัญหาปัจจุบันของฉัน
apaderno avatar
us flag
รหัสจัดการค่าที่ส่งคืนจาก `curl_exec()` ไม่ถูกต้อง นี่เป็นส่วนแรกอย่างน้อยในการแก้ไข
in flag
ด้วยรหัสปัจจุบัน ฉันมีข้อยกเว้นเกิดขึ้นหากรหัสสถานะการตอบสนองไม่ใช่ 200 (ไม่มีการตอบสนองที่ถูกต้องจากเซิร์ฟเวอร์) แต่มุมมองยังคงแสดงข้อความสำเร็จ
apaderno avatar
us flag
โค้ดที่แสดงในคำถามจับข้อยกเว้นได้ แต่เกิดข้อยกเว้นเมื่อ: ค่าของ `$succeed` เทียบเท่ากับบูลีน `FALSE` และค่าที่ส่งคืนจาก `curl_getinfo($curl, CURLINFO_HTTP_CODE)` แตกต่างจาก 200 .การเรียก `curl_getinfo($curl, CURLINFO_HTTP_CODE)` หลังจาก `curl_close()` ไม่สมเหตุสมผล ข้อยกเว้นถูกจับได้ก่อนที่จะมาถึงมุมมองซึ่งคิดว่าไม่มีอะไรผิดปกติเกิดขึ้น
apaderno avatar
us flag
นอกจากนี้ คำถามยังแสดงรหัสสำหรับตัวจัดการ Webform จากนั้นเพื่อดูขั้นตอนที่ยาวเกินไป ไม่มีวิธีใดที่ตัวจัดการ Webform จะส่งคืนบางสิ่งไปยังมุมมอง ซึ่งไม่สามารถเกี่ยวข้องได้
in flag
ฉันย้าย `curl_close()` บรรทัดหลัง if clause แต่มันไม่ได้เปลี่ยนแปลงอะไรเลย การโยนข้อยกเว้นทำให้เกิดข้อผิดพลาดโดยแจ้งว่า `Uncaught PHP ยกเว้นข้อยกเว้น: "ไม่มีการตอบสนองที่ถูกต้องจากเซิร์ฟเวอร์" `
in flag
ดังนั้นจึงไม่มีวิธีแจ้งมุมมองว่ามีข้อผิดพลาดเกิดขึ้นกับตัวจัดการหรือไม่
apaderno avatar
us flag
คุณควรตรวจสอบว่าโค้ดโมดูล Webform ทำหน้าที่อะไรและทำงานร่วมกับโมดูล Views ในลักษณะใด หากมีบางสิ่งที่โมดูล Views ถามไปยังโมดูล Webform ซึ่งโมดูล Webform ถามไปยังตัวจัดการ Webform แสดงว่าเป็นไปได้ มิฉะนั้นจะเป็นไปไม่ได้
in flag
ฉันไม่พบวิธีการทำในเอกสาร ดังนั้นคำถามของฉัน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา