Puncte:0

FormAPI - Valorile AJAX adăugate câmpurilor care lipsesc din matricea de valori la trimitere

drapel vn

Folosesc API-ul Form pentru a crea un formular în care am mai multe instanțe ale unui set de câmpuri. Fiecare set de câmpuri conține aceleași câmpuri, unul pentru stocarea unei adrese de e-mail și altul pentru un alt bit de informații. Dar, în esență, ambele sunt câmpuri de text care folosesc completarea automată, care funcționează bine. Dar am o problemă cu gestionarea trimiterii, descrisă sub codul meu de mai jos.

$form['authors_container']['authors_fieldset'][$i] = [
    '#type' => 'fieldset',
    '#attributes' => [
      'class' => ['author-fieldset']
    ],
    'email' => [
      '#type' => 'câmp text',
      '#title' => 'E-mailul autorului',
      '#value' => $emailValue,
      '#autocomplete_route_name' => 'discussion_papers.contact_email_lookup',
      '#attributes' => [
        'class' => ['e-mail-ul autorului']
      ]
    ],
    'afiliere' => [
      '#type' => 'câmp text',
      '#title' => 'Afiliere',
      '#value' => $affiliationValue,
      '#attributes' => [
        'class' => ['afiliere-autor']
      ]
    ]
  ];

Apoi am un buton AJAX pentru a adăuga mai multe instanțe ale setului de câmpuri de mai sus cu handlerul corespunzător:

$form['authors_container']['add_author'] = [
  '#type' => 'trimite',
  '#value' => 'Adăugați un alt autor',
  '#submit' => ['::AddAuthor'],
  '#limit_validation_errors' => [],
  '#ajax' => [
    'callback' => '::getAuthorsFields',
    'wrapper' => 'container-autori',
    'method' => 'înlocuiește',
    'disable-refocus' => adevărat,
  ]
];

funcția publică addAuthor($form, FormStateInterface &$form_state) {

    $storage = $form_state->getStorage();

    dacă (gol ($storage['numOfAuthors'])) 
        $storage['numOfAuthors'] = 1;

    $storage['numOfAuthors']++;
    $form_state->setStorage($storage);

    $form_state->setLimitValidationErrors([]);
    $form_state->setRebuild();
}

Toate acestea funcționează bine, pot adăuga oricâte instanțe de fieldset am nevoie.Problema mea este că atunci când trimit formularul, valorile doar ultimului set de câmpuri sunt întotdeauna goale în $form_state['valori'] matrice, dar pot vedea valorile din $form_state['input'] matrice. Înțeleg că matricea de intrare este o intrare brută, nevalidată și că matricea de valori este validată, deci întrebarea mea este de ce nu este validat doar ultimul set de câmpuri text? Managerul meu de validare nu elimină nicio valoare.

Puncte:0
drapel de

Doua posibilitati:

  1. Ați adăugat câmpurile suplimentare în funcția de apel invers #ajax. Deoarece nu ați arătat în ce funcție au fost definite câmpurile dvs., acest lucru nu poate fi văzut din codul dvs. Drupal memorează în cache formularul atunci când îl construiește, apoi, atunci când formularul este trimis, va elimina orice valoare care nu face parte din definiția originală a formularului din motive de securitate. Problema cu adăugarea de câmpuri într-o funcție de apel invers #ajax este că formularul este stocat în cache anterior funcției de apel invers și, prin urmare, Drupal renunță la valorile trimise ale câmpurilor.

  2. Dacă declarațiile elementului de formular sunt de fapt în cadrul funcției de generare a formularelor și nu fac parte dintr-o funcție de apel invers #ajax, probabil că trebuie să adăugați #copac la setul de câmpuri, astfel încât să se creeze o matrice de valori:

    $form['authors_container']['authors_fieldset'][$i] = [
      „#tree” => ADEVĂRAT,
      '#type' => 'fieldset',
      ...
    

    Aceasta va salva fiecare dintre valorile trimise într-un element separat al matricei de valori.

AlbionBrown avatar
drapel vn
Mulțumesc pentru răspuns, voi încerca să-mi editez întrebarea pentru a include mai mult cod. Câmpurile suplimentare sunt adăugate doar în metoda buildForm, apelul AJAX doar mărește numărul care ar trebui să fie afișat și apoi la reconstrucția formularului, adaugă oricum multe sunt stocate în stocarea stării formularului. Am încercat să adaug cheia de arbore și, de asemenea, să dezactivez memoria cache, dar niciunul nu a ajutat. Cheia de arbore este, de asemenea, utilizată în containerul părinte al seturilor de câmpuri. Cred că trebuie să depanez chiar de la începutul cererii de trimitere pentru a afla de ce Drupal le elimină.
Jaypan avatar
drapel de
Dacă modificați valorile din starea formularului într-un apel invers ajax, acestea sunt pierdute. Starea formularului a fost deja memorată în cache înainte de apel invers ajax. Va trebui să faceți creșterea într-un handler de trimitere, nu într-un apel invers Ajax, dacă doriți să persistă. Apelurile Ajax sunt _doar_ pentru a determina ce elemente să returneze, nu pentru a „face” ceva datelor.

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.