Î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?