O valor vazio "- Selecionar -" não aparece nos campos selecionados com requisito de estados

8

Quando crio uma caixa de seleção padrão usando a API do formulário Drupal 7, o primeiro valor (também o selecionado em um novo 'formulário em branco') é <option selected="selected" value="">- Select -</option>. Este valor não está especificado na definição do formulário e não estou alterando o formulário. (Isto é bom)

No entanto, quando eu crio uma segunda caixa de seleção que depende do primeiro uso #states, ela não possui esse valor padrão. Para formulários complexos com várias dependências, essa inconsistência é um problema.

Um exemplo de definição de formulário é o seguinte:

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

Neste exemplo simples, temos 2 caixas de seleção e um botão de envio. As duas caixas de seleção são exibidas como:

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

(Devido à #statesconfiguração, a segunda caixa de seleção aparece apenas quando a primeira caixa de seleção tem "Terceiro" selecionado)

Essa inconsistência está causando problemas em uma situação em que estamos gerando formas dinâmicas complexas com campos interdependentes.

Alguém tem alguma idéia de por que os campos recebem opções inconsistentes e qual a melhor abordagem para solucionar o problema?

adamnfish
fonte

Respostas:

20

Para forçar a "opção vazia", ​​atribua-a com algo como:

"#empty_option"=>t('- Select -'),
doterobcn
fonte
Obrigado pela resposta. Eu não tenho o Drupal configurado para verificar isso, então terei que aceitar sua palavra e ficar de olho nos votos dos outros!
Adamnfish 31/05
Essa correção também funciona para o Drupal 8
Scott Joudry 16/02
2

você precisa alterar isso:

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

selecione para: entrada

o código correto é:

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

Para estender a resposta do doterobcn, você também pode definir o valor vazio (a chave) da sua opção vazia.

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

O que dará:

<option value="_none">- None -</option>
romain ni
fonte