Skip to content

Commit aa9fccf

Browse files
committed
bug #17787 [Form] Fix choice placeholder edge cases (Tobion)
This PR was merged into the 2.7 branch. Discussion ---------- [Form] Fix choice placeholder edge cases | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | - | License | MIT | Doc PR | - Fixing several problems with choice placeholder that enhances #9030 for more edge cases: - A choice with an empty value manually added in the choices array should only be considered a placeholder when it is the first element in the final choice select. This is part of the HTML spec and how browsers also behave. If you select a choice with an empty value that is not the first option, it will still pass the "required" check and thus submit the empty value. So it's not a placeholder. If in the example below you move the empty option to the first place, the browsers will error on submit that you must select a value. So only then it is a placeholder to show as initial value. ```html <select id="form_timezone" name="form[timezone]" required="required"> <option value="Africa/Abidjan">Abidjan</option> <option value="">Empty</option> </select> ``` Also the validator https://validator.w3.org/nu/ will mark the above code as error: > The first child option element of a select element with a required attribute, and without a multiple attribute, and without a size attribute whose value is greater than 1, must have either an empty value attribute, or must have no text content. Consider either adding a placeholder option label, or adding a size attribute with a value equal to the number of option elements. This is fixed by replacing`0 !== count($choiceList->getChoicesForValues(array('')))` with `$view->vars['placeholder_in_choices'] = $choiceListView->hasPlaceholder()`. Which means, the required attribute is removed automatically because the select form element is required implicitly anyway due to the nature of the choice UI. - As the above quote mentions, the `size` attribute also has impact. Namely for a select with size > 1 it can be possible to have a required attribute even without placeholder. This is because when the size > 1, there is no default choice selected (similar to select with "multiple"). - A placeholder for required radio buttons or a select with size > 1 does not make sense as it would just be fake data that can be submitted (similar to the ignored placeholder for multi-select and checkboxes). Commits ------- 0efbc30 [Form] fix edge cases with choice placeholder
2 parents 74839d8 + 5e457ff commit aa9fccf

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

Resources/views/Form/choice_widget_collapsed.html.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<select
2-
<?php if ($required && null === $placeholder && $placeholder_in_choices === false && $multiple === false):
2+
<?php if ($required && null === $placeholder && $placeholder_in_choices === false && $multiple === false && (!isset($attr['size']) || $attr['size'] <= 1)):
33
$required = false;
44
endif; ?>
55
<?php echo $view['form']->block($form, 'widget_attributes', array(

0 commit comments

Comments
 (0)