Puncte:0

Cum omit apelarea unei funcții de validare personalizată într-un formular cu meniuri derulante AJAX?

drapel in

Folosesc Drupal fără cap cu middleware .NET. Am un formular Drupal 9.Acest formular conține două elemente derulante care sunt completate în funcție de o valoare selectată într-un al treilea drop-down. Am un handler de validare personalizat imediat după acele elemente derulante AJAX, unde stochează unele date într-o bază de date .NET.

Acesta este codul meu pentru hook_form_alter().

$form['technology_type'] = [
  '#type' => 'selectați',
  '#title' => t('Tipul de tehnologie'),
  '#options' => $tech_type_options,
  '#default_value' => $t_selected_option,
  '#ajax' => [
    'callback' => 'techlistDropdownCallback',
    'wrapper' => 'techlist-fieldset-container',
    'eveniment' => 'schimbare',
  ],    
];

if ($t_selected_option != '') {
  $tech_options = array(0 => '- Nici unul -');
  $tech_options = custom_authorization_tech_options($t_selected_option);
}
else {
  $tech_options = array(0 => '- Nici unul -');
}

$form['techlist-select-fieldset-container']= [
  '#type' => 'container',
  '#attributes' => ['id' => 'techlist-fieldset-container'],
];

$form['techlist-select-fieldset-container']['source_tech'] = [
  '#type' => 'selectați',
  '#title' => t('Tehnologia sursă'),
  '#options' => $tech_options,
  '#default_value' => !empty($source_tech_value) ? $source_tech_value : $form_state->getValue('source_tech'),
  '#multiple' => adevărat,
];

$form['techlist-select-fieldset-container']['target_tech'] = [
  '#type' => 'selectați',
  '#title' => t('Target Tech'),
  '#options' => $tech_options,
  '#default_value' => !gol ($target_tech_value) ? $target_tech_value : $form_state->getValue('target_tech'),
  '#multiple' => adevărat,
];

dacă ($t_opțiune_selectată == 0) {
  $form['techlist-select-fieldset-container']['source_tech']['#title'] = t('Source Tech (Trebuie să alegeți mai întâi tipul de tehnologie)');
  $form['techlist-select-fieldset-container']['source_tech']['#disabled'] = TRUE;
  $form['techlist-select-fieldset-container']['target_tech']['#title'] = t('Target Tech (Trebuie să alegeți mai întâi tipul de tehnologie)');
  $form['techlist-select-fieldset-container']['target_tech']['#disabled'] = TRUE;
}

array_unshift($form['#validate'],'custom_authorization_mak_form_validate');

Ori de câte ori aceste liste derulante dependente sunt umplute cu valori, funcția de validare este numită cumva și datele incomplete sunt stocate automat în baza de date chiar și fără a apăsa butonul de salvare al formularului.

Cum evit această problemă ciudată?

Vreau doar să completez elementele derulante folosind AJAX, apoi să apelez handlerul de validare pentru a stoca datele în baza de date.

apaderno avatar
drapel us
*Drupal fără cap* înseamnă că Drupal nu este folosit pentru a afișa pagini sau formulare utilizatorilor. Codul dvs. modifică un formular pe care Drupal nu ar trebui să îl arate utilizatorilor. De asemenea, *Drupal fără cap* nu scrie în tabelele bazei de date create de alt software.
sonfd avatar
drapel in
Nu ar trebui să scrieți la masă odată ce formularul a fost trimis cu succes? Nu în timpul validării?
taggartJ avatar
drapel cn
În realitate, validarea este apelată de fiecare dată când există o modificare ajax, ar trebui să schimbați codul de validare personalizat pentru a verifica dacă există valori, dacă executați validarea, dacă nu
Raja Chakraborty avatar
drapel in
Bună @apaderno, Vă rugăm să găsiți clarificările mele - 1. Drupal fără cap înseamnă că Drupal nu este folosit pentru a afișa pagini sau formulare utilizatorilor - Partea frontală a aplicației mele conține un meniu care navighează utilizatorii către formularele Drupal. 2. Drupal fără cap nu scrie în tabelele bazei de date create de alt software - În funcția de validare, am o API care postează date din formular în baza de date .net
Raja Chakraborty avatar
drapel in
Bună @taggartJ, funcția de validare este apelată de fiecare dată când are loc un apel ajax?
apaderno avatar
drapel us
Dacă utilizatorii sunt expuși paginilor sau formularelor Drupal, atunci nu este Drupal fără cap. Da, manipulatorii de validare și trimitere sunt apelați și atunci când este implicat AJAX; chiar și metoda generatorului de formulare este apelată după un eveniment AJAX.
taggartJ avatar
drapel cn
da ar trebui sa faca da
Puncte:0
drapel cn

Pentru a preveni trimiterea formularului atunci când formularul este trimis cu AJAX (când modificați starea formularului cu AJAX), în handlerul de validare utilizați $form_state->setRebuild();

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.