Puncte:0

reconstruiți un formular cu ajax (rezolvat)

drapel gb

Într-un cârlig, folosesc ajax pe un câmp de formular, proiectat cu interfața de utilizator drupal. Se declară astfel:

$form['field_unite_de_recherche']['widget']['#ajax'] = array(
'callback' => 'ajax_equipes_from_unites_callback',
'eveniment' => 'schimbare',
'method' => 'înlocuiește',
'wrapper' => 'edit-field-equipe-membre2',
);

În funcția de apel invers, recuperez câteva valori din baza de date din valoarea selectată în field_unite_de_recherche :

$selectat = $form_state->getValue('field_unite_de_recherche');
$interogare = \Drupal::database()->select(...);
$rezultat = $interogare->execute();
while ($rând = $rezultat->fetchAssoc()) {
 $opțiuni[] = $row['titlu'];
}

Apoi, în această funcție de apel invers, construiesc noua versiune a widget-ului:

$form['field_equipe_membre2'] = [
'#type' => 'selectați',
'#title' => 'Echipe membre2',
'#options' => $opțiuni,
];
returnează $form['field_equipe_membre2'];

Prima dată când selectez o valoare în câmpul „field_unite_de_recherche”, câmpul „field_equipe_membre2” este reconstruit cu valorile corecte din baza de date.

Cu o nouă selecție în câmpul „field_unite_de_recherche”, valorile sunt bine preluate din baza de date, dar câmpul „field_equipe_membre2” nu este actualizat cu noile valori.

Sunt sigur că valorile sunt bine preluate din această a doua selecție pentru că le scriu într-un fișier ca în cele ce urmează

$handle = fopen('debug.txt','w');
while ($rând = $rezultat->fetchAssoc()) {
  $options[] = $row['titlu'];
  fputs($handle, $row['titlu']."\n");
}
fclose($handle);

Întrebarea este: de ce „field_equipe_membre2” este reconstruit doar prima dată?

Am scris mai multe mesaje pe acest forum:

  • O comandă „rebuild” nu este necesară deoarece este „inclusă” într-un ajax comanda
  • nu există cache pentru ajax

Mă uit și la modulul de exemple ajax, dar nu se referă la modul cârlig

Poate cineva sa-mi dea un sfat?

În plus, chiar și cu

'method' => 'înlocuiește',

în declarația ajax, nu am reușit să evit crearea unui nou câmp „field_equipe_membre2” în formular. Am încercat să mă întorc

$form['field_equipe_membre2']['#options']

fara nici un succes.Cum se poate înlocui pe cel existent, nu crea unul nou?

cocq avatar
drapel gb
Am rezolvat cele două probleme. Pentru a înlocui widget-ul existent (adică: pentru a evita crearea unuia nou): utilizați id-ul div-ului widget-ului, nu id-ul widget-ului în sine. Pentru a înlocui matricea de opțiuni: alegeți „html” ca metodă în loc de „înlocuire”.

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.