web-dev-qa-db-fra.com

La valeur vide "- Sélectionner -" n'apparaît pas pour les champs sélectionnés avec l'exigence d'états

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 utilisant #states, il 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 de l #states paramètre, la deuxième case de sélection apparaît uniquement lorsque la première case 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?

8
adamnfish

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

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

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')),
2
learningxm

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>
1
romain ni