空の値「-選択-」は、状態要件のある選択フィールドには表示されません


8

Drupal 7フォームAPIを使用して標準の選択ボックスを作成すると、最初の値(新しい「空白のフォーム」でも選択されたもの)はになり<option selected="selected" value="">- Select -</option>ます。この値はフォーム定義で指定されておらず、フォームの変更は行っていません。(これで結構です)

ただし、最初のを使用して2番目の選択ボックスを作成すると、その#statesようなデフォルト値はありません。複数の依存関係を持つ複雑なフォームの場合、この不整合が問題になります。

フォーム定義の例は次のとおりです。

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;
}

この簡単な例では、2つの選択ボックスと送信ボタンがあります。2つの選択ボックスは次のように表示されます。

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

#states設定のため、2番目の選択ボックスは、最初の選択ボックスで「3番目」が選択されている場合にのみ表示されます)

この不整合は、相互に依存するフィールドを持つ複雑な動的フォームを生成している状況で問題を引き起こしています。

なぜフィールドに一貫性のないオプションが与えられているのか、そして問題を回避するための最良のアプローチは何か考えがありますか?

回答:


20

「空のオプション」を強制するには、次のようなものを割り当てます。

"#empty_option"=>t('- Select -'),

答えてくれてありがとう。私はこれをチェックするためにどこにもDrupalをセットアップしていませんので、私はそれについてあなたの言葉を取り、他の人からの投票を監視する必要があります!
adamnfish、

この修正はDrupal 8でも機能します
Scott Joudry 2018

2

これを変更する必要があります:

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

選択:入力

正しいコードは次のとおりです。

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

1

doterobcnの回答を拡張するには、空のオプションの空の値(キー)を設定することもできます。

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',
];

それは与えるでしょう:

<option value="_none">- None -</option>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.