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?
Pour forcer "l'option vide", assignez-la avec quelque chose comme:
"#empty_option"=>t('- Select -'),
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')),
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>