Puncte:0

Solicitarea cURL provoacă o eroare de validare a formularului

drapel in

Lucrez la o solicitare cURL atunci când un utilizator trimite un formular existent pentru a trimite unele date unui serviciu extern.

Am adăugat această funcție cu această linie: $form['actions'][$action]['#submit'][] = 'my_module_push_data';

Și solicitările mele cURL:

    $ch = curl_init();
    // Obțineți token de acces aici
    curl_setopt($ch, CURLOPT_URL, 'https://resturl.com&id=' . $id . '&secret=' . $secret);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $rezultat = curl_exec($ch);
    curl_close($ch);
    $rezultat = json_decode($rezultat, adevărat);

    // Apoi trimiteți datele
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://resturl.com/submit.json?access_token=' . $result['access_token']);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($formData));
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $server_output = curl_exec($ch); // <--- Această linie provoacă probleme
    $server_output = json_decode($server_output);

Cu acest cod, primesc această eroare:

Excepție PHP neprinsă LogicException: „Erorile de formular nu pot fi setate după ce validarea formularului s-a încheiat.” la /mnt/gfs/.../.../docroot/core/lib/Drupal/Core/Form/FormState.php

Am trecut linie cu linie prin această solicitare cURL și linia pe care am marcat-o (al doilea curl_exec() provoacă această eroare. Dacă omit acea linie, merge bine. Primul curl_exec() funcționează bine și am verificat că returnează un token de acces.

Ce greșesc aici? Mulțumesc!

EDIT: Funcție completă (ascunse unele detalii)

/**
 * Handler de trimitere personalizat pentru a împinge datele în Serviciu
 */
funcția my_module_service_signup(matrice $form, \Drupal\Core\Form\FormStateInterface $form_state) {
    $vals = $form_state->getValues();
    $formData = [];
    $myVals = [];

    $clientId = Settings::get('service_api_id');
    $clientSecret = Settings::get('service_api_secret');
    $accountId = 'abc123456';
    $formData['unique_id'] = '1234';

    $myVals = [
        'company' => $vals['field_company'][0]['value'],
        'firstName' => $vals['field_first_name'][0]['value'],
        'lastName' => $vals['field_last_name'][0]['value'],
        ...
    ];

    $formData['input'][0]['fields'] = $myVals;

    încerca {
        $getClient = \Drupal::httpClient();
        $request = $getClient->post('https://' . $accountId . '.resturl.com/get/token?my_id=' . $clientId . '&my_secret=' . $clientSecret);
        $response = json_decode($request->getBody());
    } catch(RequestException $e) {
    // LogicException nu este prinsă aici
    }
}

Jaypan avatar
drapel de
Trebuie să ne arătați funcția în care există codul. De asemenea, Drupal folosește clientul Guzzle HTTP pentru solicitări de la distanță, care poate fi accesat cu `\Drupal::httpClient()`.
drapel in
@Jaypan Am făcut o editare cu funcția completă (cu unele detalii private schimbate). Am încercat să trec la utilizarea `\Drupal::httpClient()` în această dimineață și afișează aceeași eroare. Se pare că aruncă eroarea doar atunci când primește un răspuns de succes de la punctul final. Pot să văd corpul răspunsului în watchdog, dar continuă să arunce această excepție.
Jaypan avatar
drapel de
Ești sigur că de aici vine eroarea ta? Ce se întâmplă dacă eliminați cu totul cererea doar pentru testare?
drapel in
@Jaypan Totul funcționează bine dacă cererea este eliminată. Fără erori autentificate în watchdog, contul de utilizator este creat și utilizatorul este redirecționat către backend-ul site-ului. Doar comentarea liniei cu `$getClient->post()` rezolvă problema.
Jaypan avatar
drapel de
Încercați să capturați `\Exception`, apoi folosiți `watchdog_exception()` (https://api.drupal.org/api/drupal/core%21includes%21bootstrap.inc/function/watchdog_exception/9.2.x) pentru a înregistra rezultatul. Poate puteți obține mai multe informații din asta.

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.