El valor vacío "- Seleccionar -" no aparece para campos seleccionados con requisito de estados

8

Cuando creo un cuadro de selección estándar utilizando la API de formulario de Drupal 7, el primer valor (también el seleccionado en un 'formulario en blanco' nuevo) es <option selected="selected" value="">- Select -</option>. Este valor no se especifica en la definición del formulario y no estoy modificando el formulario. (Esto esta bien)

Sin embargo, cuando creo un segundo cuadro de selección que depende del primer uso #states, no tiene ningún valor predeterminado. Para formularios complejos con dependencias múltiples, esta inconsistencia es un problema.

Una definición de formulario de ejemplo es la siguiente:

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

En este sencillo ejemplo, tenemos 2 cuadros de selección y un botón de enviar. Los dos cuadros de selección se muestran como:

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

(Debido a la #statesconfiguración, el segundo cuadro de selección solo aparece cuando el primer cuadro de selección tiene seleccionado "Tercero")

Esta inconsistencia está causando problemas en una situación en la que estamos generando formas dinámicas complejas con campos interdependientes.

¿Alguien tiene alguna idea de por qué los campos reciben opciones inconsistentes y cuál es el mejor enfoque para solucionar el problema?

adamnfish
fuente

Respuestas:

20

Para forzar la "opción vacía", asígnela con algo como:

"#empty_option"=>t('- Select -'),
doterobcn
fuente
Gracias por la respuesta. ¡No tengo Drupal configurado en ningún lado para verificar esto, así que tendré que aceptar tu palabra y estar atento a los votos de los demás!
adamnfish
Esta solución también funciona para Drupal 8
Scott Joudry
2

necesitas cambiar esto:

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

seleccione : entrada

el código correcto es:

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

Para extender la respuesta doterobcn también puede establecer el valor vacío (la clave) de su opción vacía.

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

Lo que dará:

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