Puncte:-1

De ce primesc „O selecție nevalidă a fost identificată”. din forma pe care o creează codul meu?

drapel ng

Folosesc următorul cod pentru un formular.

funcția publică buildForm(array $form, FormStateInterface $form_state) {
  $region_options = static::getFirstDropdownOptions();
  $form['vvv_region'] = [
    '#type' => 'selectați',
    '#title' => $this->t('câmp de selectare a regiunii'),
    '#options' => $region_options,
    '#empty_option' => t('- Selectați regiunea -'),
    '#ajax' => [
      'callback' => '::myAjaxCallback',
      'disable-refocus' => FALSE,
      'eveniment' => 'schimbare',
      'wrapper' => 'editare-ieșire',
      'progres' => [
        'type' => 'throbber',
        'message' => $this->t('Se verifică intrarea...'),
      ],
    ]
  ];
    
  $region_selected = $form_state->getValue('vvv_region');
  $city_options = static::getSecondDropdownOptions($region_selected);
    
  $form['ieșire'] = [
    '#type' => 'selectați',
    '#title' => $this->t('câmp de selectare a orașului'),
    '#options' => $city_options,     
    '#prefix' => '<div id="edit-output">',
    '#sufix' => '</div>',
    '#empty_option' => t('- Selectați orașul -'),
    '#default_value' => '',
    '#ajax' => [
      'callback' => '::cityAjaxCallback',
      'disable-refocus' => FALSE,
      'eveniment' => 'schimbare',
      'wrapper' => 'edit-city',
      'progres' => [
        'type' => 'throbber',
        'message' => $this->t('Se verifică intrarea...'),
      ],
    ]
  ];
    
  $city_select = $form_state->getValue('output');
  $suburb_options = static::getSuburbDropdownOptions($city_select);
        
  $form['sur'] = [
    '#type' => 'selectați',
    '#options' => $suburb_options,     
    '#prefix' => '<div id="edit-city">',
    '#sufix' => '</div>',
    '#empty_option' => t('- Selectează suburb -'),
    '#default_value' => matrice(''),
  ];
  returnează $form;
}

funcția publică myAjaxCallback(matrice &$form, FormStateInterface $form_state) {
  $region_selected = $form_state->getValue('vvv_region');
  $city_options = static::getSecondDropdownOptions($region_selected);

  if ($form_state->getErrors()) {
    \Drupal::messenger()->addError($region_selected);
    $form_state->setRebuild();
  }
  
  $form['outpout']['#options'] = $city_options;
          
  returnează $form['ieșire']; 
}
    
funcția publică cityAjaxCallback(matrice &$form, FormStateInterface $form_state) {
  $city_select = $form_state->getValue('output');
  $sur_data = static::getSuburbDropdownOptions($city_select);

  if ($form_state->getErrors()) {
    \Drupal::messenger()->addError($city_select);
    $form_state->setRebuild();
  }

  $form['sur']['#options'] = $sur_data;

  returnează $form['sur']; 
}

Când este trimis formularul, primesc următoarea eroare.

A fost identificată o selecție nevalidă. Vă rugăm să contactați administratorul site-ului.

Ce este în neregulă cu codul pe care îl folosesc?

Jaypan avatar
drapel de
Nu puteți modifica valoarea opțiunilor din apel invers ajax. Trebuie făcută în definiția formei. Puteți citi un exemplu despre cum să faceți asta în acest tutorial pe care l-am scris: https://www.jaypan.com/tutorial/drupal-form-api-ajax-form-and-results-same-page
apaderno avatar
drapel us
Există o greșeală de tipar în primul apel invers: `$form['outpout']['#options'] = $city_options;`. Ar trebui să fie *ieșire*, nu *ieșire*.
Puncte:2
drapel us

Există două erori în codul afișat în întrebare.

Numai generatorul de formulare poate adăuga opțiuni elementelor de formular. În mod diferit, veți primi eroarea pe care ați citat-o.

A fost identificată o selecție nevalidă. Vă rugăm să contactați administratorul site-ului.

Ceea ce face apelarea AJAX este pur și simplu returnarea elementului de formular care trebuie schimbat. În cazul dumneavoastră, codul este următorul.

funcția publică myAjaxCallback(matrice &$form, FormStateInterface $form_state) {
  returnează $form['ieșire']; 
}
    
funcția publică cityAjaxCallback(matrice &$form, FormStateInterface $form_state) {
  returnează $form['sur']; 
}

O apelare AJAX pentru un formular nu tratează de obicei erorile de validare.

A doua eroare este în generatorul de formulare, care utilizează următorul cod.

$region_selected = $form_state->getValue('vvv_region');

Când formularul este construit pentru prima dată, $form_state->getValue('vvv_region') nu returnează nicio valoare, deoarece formularul nu este încă trimis, chiar și prin AJAX. Doar atunci când formularul este trimis prin AJAX $form_state->getValue('vvv_region') returnează o valoare. Acea linie trebuie schimbată după cum urmează.

$region_selected = $form_state->hasValue('vvv_region') ? $form_state->getValue('vvv_region'): cheie($region_options);

În mod similar, $city_select = $form_state->getValue('output'); trebuie schimbat.

$city_select = $form_state->hasValue('ieșire') ? $form_state->getValue('output'): cheie($city_options);

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.