Pusta wartość „- Wybierz -” nie pojawia się dla wybranych pól z wymaganiem dotyczącym stanów

8

Kiedy tworzę standardowe pole wyboru przy użyciu interfejsu API formularza Drupal 7, pierwszą wartością (także tą wybraną w świeżym „pustym formularzu”) jest <option selected="selected" value="">- Select -</option>. Ta wartość nie jest określona w definicji formularza i nie zmieniam formularza. (Jest okej)

Jednak gdy tworzę drugie pole wyboru, które zależy od pierwszego użycia #states, nie ma ono żadnej takiej wartości domyślnej. W przypadku złożonych formularzy z wieloma zależnościami ta niespójność stanowi problem.

Przykładowa definicja formularza jest następująca:

function sb_quickquote_test_form($form, &$form_state, $post=array()) {

  $fields['first_select'] = array(
    '#type'             => 'select',
    '#title'            => 'First select box',
    '#options'          => Array('First', 'Second', 'Third'),
    '#required'         => TRUE,
  );

  $fields['dependent_delect'] = array(
    '#type'             => 'select',
    '#title'            => 'Dependent select box',
    '#options'          => Array('Something', 'Another thing', 'Something else', 'Final thing'),
    '#states'           => Array(
      'visible' => Array('select[name=first_select]' => array('value' => '2')),
      'required' => Array('select[name=first_select]' => array('value' => '2')),
    ),
  );

  $fields['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
  return $fields;
}

W tym prostym przykładzie mamy 2 pola wyboru i przycisk przesyłania. Dwa pola wyboru są wyświetlane jako:

 ______________      ________________
| - Select - |v|    | Something    |v|
`--------------'    `----------------'
| - Select -   |    | Something      | <- no empty option
| First        |    | Another thing  |
| Second       |    | Something else |
| Third        |    | Final thing    |
 --------------      ----------------

(Ze względu na #statesustawienie drugie pole wyboru pojawia się tylko wtedy, gdy w pierwszym polu wyboru wybrano „Trzeci”)

Ta niespójność powoduje problemy w sytuacji, gdy generujemy złożone formy dynamiczne z polami współzależnymi.

Czy ktoś ma pojęcie, dlaczego pola mają niespójne opcje i jakie jest najlepsze podejście do rozwiązania problemu?

adamnfish
źródło

Odpowiedzi:

20

Aby wymusić „pustą opcję”, przypisz do niej coś takiego:

"#empty_option"=>t('- Select -'),
doterobcn
źródło
Dziękuję za odpowiedź. Nigdzie nie mam skonfigurowanego Drupala, żeby to sprawdzić, więc będę musiał uwierzyć ci na słowo i mieć oko na głosy innych!
adamnfish
Ta poprawka działa również dla Drupala 8
Scott Joudry,
2

musisz to zmienić:

 'visible' => Array('select[name=first_select]' => array('value' => '2')),
 'required' => Array('select[name=first_select]' => array('value' => '2')),

wybierz, aby wprowadzić :

poprawny kod to:

 'visible' => Array(':input[name="first_select"]' => array('value' => '2')),
 'required' => Array(':input[name="first_select"]' => array('value' => '2')),
learningxm
źródło
1

Aby rozszerzyć odpowiedź doterobcn, możesz również ustawić pustą wartość (klawisz) pustej opcji.

W Drupal 8:

$form['country'] = [
  '#type' => 'select',
  '#multiple' => FALSE,
  '#title' => t('Country:'),
  '#required' => FALSE,
  '#options' => $countries,
  '#default_value' => 'FR',
  '#empty_option' => t('- None -'),
  '#empty_value' => '_none',
];

Co da:

<option value="_none">- None -</option>
Romain Ni
źródło