diff --git a/core/includes/form.inc b/core/includes/form.inc
index f4a7718..d660bc8 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -2930,7 +2930,7 @@ function theme_form_required_marker($variables) {
}
/**
- * Returns HTML for a form element label and required marker.
+ * Prepares variables for form label templates.
*
* Form element labels include the #title and a #required marker. The label is
* associated with the element itself by the element #id. Labels may appear
@@ -2945,40 +2945,33 @@ function theme_form_required_marker($variables) {
* required. That is especially important for screenreader users to know
* which field is required.
*
- * @param $variables
+ * @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
* Properties used: #required, #title, #id, #value, #description.
*
- * @ingroup themeable
*/
-function theme_form_element_label($variables) {
+function template_preprocess_form_element_label(&$variables) {
$element = $variables['element'];
- // If title and required marker are both empty, output no label.
- if ((!isset($element['#title']) || $element['#title'] === '') && empty($element['#required'])) {
- return '';
- }
+ $variables['title'] = (isset($element['#title']) && $element['#title'] !== '') ? Xss::filterAdmin($element['#title']) : '';
// If the element is required, a required marker is appended to the label.
- $required = '';
+ $variables['required'] = array();
if (!empty($element['#required'])) {
- $marker = array(
+ $variables['required'] = array(
'#theme' => 'form_required_marker',
'#element' => $element,
);
- $required = drupal_render($marker);
}
- $title = filter_xss_admin($element['#title']);
-
- $attributes = array();
+ $variables['attributes'] = array();
// Style the label as class option to display inline with the element.
if ($element['#title_display'] == 'after') {
- $attributes['class'] = 'option';
+ $variables['attributes']['class'][] = 'option';
}
// Show label only to screen readers to avoid disruption in visual flows.
elseif ($element['#title_display'] == 'invisible') {
- $attributes['class'] = 'visually-hidden';
+ $variables['attributes']['class'][] = 'visually-hidden';
}
// A #for property of a dedicated #type 'label' element as precedence.
@@ -2992,10 +2985,8 @@ function theme_form_element_label($variables) {
}
// Otherwise, point to the #id of the form input element.
elseif (!empty($element['#id'])) {
- $attributes['for'] = $element['#id'];
+ $variables['attributes']['for'] = $element['#id'];
}
-
- return '';
}
/**
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index cfd8427..c5c3955 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -2554,6 +2554,7 @@ function drupal_common_theme() {
),
'form_element_label' => array(
'render element' => 'element',
+ 'template' => 'form-element-label',
),
'vertical_tabs' => array(
'render element' => 'element',
diff --git a/core/modules/system/templates/form-element-label.html.twig b/core/modules/system/templates/form-element-label.html.twig
new file mode 100644
index 0000000..08899b7
--- /dev/null
+++ b/core/modules/system/templates/form-element-label.html.twig
@@ -0,0 +1,19 @@
+{#
+/**
+ * @file
+ * Default theme implementation for a form element label.
+ *
+ * Available variables:
+ * - title: The label's text.
+ * - required: The required marker or empty if the associated form element is
+ * not required.
+ * - attributes: A list of HTML attributes for the label.
+ *
+ * @see template_preprocess_form_element_label()
+ *
+ * @ingroup themeable
+ */
+#}
+{% if title is not empty or required -%}
+
+{%- endif %}