La valeur vide «- Select -» n'apparaît pas pour les champs de sélection avec l'exigence des états

8

Lorsque je crée une boîte de sélection standard à l'aide de l'API de formulaire Drupal 7, la première valeur (également celle sélectionnée sur un nouveau «formulaire vierge») est <option selected="selected" value="">- Select -</option>. Cette valeur n'est pas spécifiée dans la définition du formulaire et je ne modifie pas le formulaire. (C'est bon)

Cependant, lorsque je crée une deuxième zone de sélection qui dépend de la première utilisation #states, elle n'a pas une telle valeur par défaut. Pour les formulaires complexes avec plusieurs dépendances, cette incohérence est un problème.

Un exemple de définition de formulaire est le suivant:

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

Dans cet exemple simple, nous avons 2 cases de sélection et un bouton d'envoi. Les deux cases de sélection sont affichées comme suit:

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

(En raison du #statesparamètre, la deuxième zone de sélection apparaît uniquement lorsque la première zone de sélection a "Troisième" sélectionné)

Cette incohérence pose des problèmes dans une situation où nous générons des formes dynamiques complexes avec des champs interdépendants.

Quelqu'un a-t-il une idée de la raison pour laquelle les champs reçoivent des options incohérentes et quelle est la meilleure approche pour contourner le problème?

poisson adam
la source

Réponses:

20

Pour forcer "l'option vide", assignez-la avec quelque chose comme:

"#empty_option"=>t('- Select -'),
doterobcn
la source
Merci d'avoir répondu. Je n'ai pas Drupal installé nulle part pour vérifier cela, donc je vais devoir vous croire sur parole et garder un œil sur les votes des autres!
adamnfish
Ce correctif fonctionne également pour Drupal 8
Scott Joudry
2

vous devez changer cela:

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

sélectionner pour: saisir

le bon code est:

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

Pour étendre la réponse doterobcn, vous pouvez également définir la valeur vide (la clé) de votre option vide.

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

Ce qui donnera:

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