Puncte:0

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

drapel 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
drapel us
`curl_exec()` returnează în continuare `FALSE` în caz de erori, chiar și atunci când setați `CURLOPT_RETURNTRANSFER` la `TRUE`. Trecerea la `json_decode()` a unei valori care nu este un șir va cauza probabil o eroare. De asemenea, odată ce resursa este de-alocată cu `curl_close()`, trecerea acelei resurse către orice funcție cURL nu are sens.
drapel in
Voi încerca să îmbunătățesc codul, dar acest lucru nu răspunde la problema mea actuală.
apaderno avatar
drapel us
Codul nu gestionează corect valoarea returnată de la `curl_exec()`. Aceasta este cel puțin prima parte care trebuie remediată.
drapel in
Cu codul actual, am o excepție aruncată dacă codul de stare a răspunsului nu este 200 (nici un răspuns valid de la server), dar totuși vizualizarea arată un mesaj de succes.
apaderno avatar
drapel us
Codul afișat în întrebare prinde excepția, dar excepția este aruncată atunci când: Valoarea lui `$succeed` este echivalentă cu booleanul `FALSE` și valoarea returnată de la `curl_getinfo($curl, CURLINFO_HTTP_CODE)` este diferită de 200 .Apelarea `curl_getinfo($curl, CURLINFO_HTTP_CODE)` după `curl_close()` nu are sens. Excepția este prinsă înainte de a ajunge la vedere, care crede că nu s-a întâmplat nimic rău.
apaderno avatar
drapel us
De asemenea, întrebarea arată codul pentru un handler Webform. De la ea la o vedere pasul este prea lung. Nu există nicio modalitate ca un handler de formular web să returneze ceva la o vizualizare, care nu ar putea fi implicată.
drapel in
Mut linia `curl_close()` după clauza if, dar nu schimbă nimic. Aruncarea excepției cauzează o eroare care spune „Excepție excepție PHP neprinsă: „Nici un răspuns valid de la server.”
drapel in
Deci, nu există nicio modalitate de a notifica vizualizarea că sa întâmplat o eroare pe handler?
apaderno avatar
drapel us
Ar trebui să verificați ce face codul modulului Webform și în ce mod se integrează cu modulul Vizualizări. Dacă există ceva ce modulul Vizualizări cere modulului Webform, ceea ce modulul Webform îl solicită gestionarilor săi Webform, atunci este posibil. Altfel, nu, nu se poate.
drapel in
Nu am găsit cum să o fac în documentație, de aici întrebarea mea.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.