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
}
}