diff --git a/core/modules/field/field.form.inc b/core/modules/field/field.form.inc index 6f99192..4912a26 100644 --- a/core/modules/field/field.form.inc +++ b/core/modules/field/field.form.inc @@ -8,44 +8,55 @@ use Drupal\Component\Utility\NestedArray; /** - * Returns HTML for an individual form element. + * Prepares variables for individual form element templates. + * + * Default template: field-multiple-value-form.html.twig. * * Combines multiple values into a table with drag-n-drop reordering. * - * @param $variables + * @param array $variables * An associative array containing: * - element: A render element representing the form element. - * - * @ingroup themeable - * - * @todo Convert to a template. */ -function theme_field_multiple_value_form($variables) { +function template_preprocess_field_multiple_value_form(&$variables) { $element = $variables['element']; $output = ''; - if ($element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED) { - $form_required_marker = array('#theme' => 'form_required_marker'); - $required = !empty($element['#required']) ? drupal_render($form_required_marker) : ''; + $variables['multiple_cardinality'] = $element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED; + + if ($variables['multiple_cardinality']) { $table_id = drupal_html_id($element['#field_name'] . '_values'); $order_class = $element['#field_name'] . '-delta-order'; $header = array( array( - 'data' => '

' . t('!title !required', array('!title' => $element['#title'], '!required' => $required)) . "

", + 'data' => array( + '#prefix' => '

', + 'title' => array( + '#markup' => $element['#title'], + ), + '#suffix' => '

', + ), 'colspan' => 2, 'class' => array('field-label'), ), t('Order', array(), array('context' => 'Sort order')), ); + if (!empty($element['#required'])) { + $header[0]['data']['required'] = array( + '#theme' => 'form_required_marker', + '#element' => $element, + ); + } $rows = array(); // Sort items according to '_weight' (needed when the form comes back after - // preview or failed validation) + // preview or failed validation). $items = array(); + $variables['button'] = array(); foreach (element_children($element) as $key) { if ($key === 'add_more') { - $add_more_button = &$element[$key]; + $variables['button'] = &$element[$key]; } else { $items[] = &$element[$key]; @@ -56,10 +67,15 @@ function theme_field_multiple_value_form($variables) { // Add the items as table rows. foreach ($items as $key => $item) { $item['_weight']['#attributes']['class'] = array($order_class); - $delta_element = drupal_render($item['_weight']); + + // Remove weight form element from item render array so it can be rendered + // in a separate table column. + $delta_element = $item['_weight']; + unset($item['_weight']); + $cells = array( array('data' => '', 'class' => array('field-multiple-drag')), - drupal_render($item), + array('data' => $item), array('data' => $delta_element, 'class' => array('delta-order')), ); $rows[] = array( @@ -68,7 +84,7 @@ function theme_field_multiple_value_form($variables) { ); } - $table = array( + $variables['table'] = array( '#theme' => 'table', '#header' => $header, '#rows' => $rows, @@ -79,19 +95,16 @@ function theme_field_multiple_value_form($variables) { ); $output = '
'; $output .= drupal_render($table); - $output .= $element['#description'] ? '
' . $element['#description'] . '
' : ''; - $output .= '
' . drupal_render($add_more_button) . '
'; - $output .= '
'; + $variables['description'] = $element['#description'] ? $element['#description'] : ''; drupal_add_tabledrag($table_id, 'order', 'sibling', $order_class); } else { + $variables['elements'] = array(); foreach (element_children($element) as $key) { - $output .= drupal_render($element[$key]); + $variables['elements'][] = $element[$key]; } } - - return $output; } /** diff --git a/core/modules/field/field.module b/core/modules/field/field.module index 7621595..d57c45f 100644 --- a/core/modules/field/field.module +++ b/core/modules/field/field.module @@ -690,7 +690,7 @@ function template_preprocess_field(&$variables, $hook) { // element in order have them rendered on the desired HTML element (e.g., on // the element of a field item being rendered as a link). Other field // formatters leave them within $element['#items'][$delta]['_attributes'] to - // be rendered on the item wrappers provided by theme_field(). + // be rendered on the item wrappers provided by field.html.twig. foreach ($variables['items'] as $delta => $item) { $variables['item_attributes'][$delta] = !empty($element['#items'][$delta]['_attributes']) ? new Attribute($element['#items'][$delta]['_attributes']) : clone($default_attributes); } diff --git a/core/modules/field/templates/field-multiple-value-form.html.twig b/core/modules/field/templates/field-multiple-value-form.html.twig new file mode 100644 index 0000000..e6f0ba0 --- /dev/null +++ b/core/modules/field/templates/field-multiple-value-form.html.twig @@ -0,0 +1,38 @@ +{# +/** + * @file + * Default theme implementation for an individual form element. + * + * Available variables for all fields: + * - multiple_cardinality: Whether the field is multiple cardinality or not. + * + * Available variables for single cardinality fields: + * - elements: Form elements to be rendered. + * + * Available variables for multiple cardinality fields: + * - table: Table of field items for multiple cardinality fields. + * - description: Description text for the form element. + * - button: "Add another item" button. + * + * @see template_preprocess_field() + * + * @ingroup themeable + */ +#} +{% if multiple_cardinality %} +
+ {{ table }} + {% spaceless %} + {% if description %} +
{{ description }}
+ {% endif %} + {% if button %} +
{{ button }}
+ {% endif %} + {% endspaceless %} +
+{% else %} + {% for element in elements %} + {{ element }} + {% endfor %} +{% endif %} diff --git a/core/modules/field/templates/field.html.twig b/core/modules/field/templates/field.html.twig index 4b13366..2bcab30 100644 --- a/core/modules/field/templates/field.html.twig +++ b/core/modules/field/templates/field.html.twig @@ -25,17 +25,10 @@ * - item_attributes: List of HTML attributes for each item. * * @see template_preprocess_field() - * @see theme_field() * * @ingroup themeable */ #} - {% if not label_hidden %}
{{ label }}: 
diff --git a/core/themes/bartik/bartik.theme b/core/themes/bartik/bartik.theme index 593923a..bbd02b3 100644 --- a/core/themes/bartik/bartik.theme +++ b/core/themes/bartik/bartik.theme @@ -155,28 +155,3 @@ function bartik_menu_tree($variables) { function bartik_menu_tree__shortcut_default($variables) { return ''; } - -/** - * Implements theme_field__field_type(). - */ -function bartik_field__taxonomy_term_reference($variables) { - $output = ''; - - // Render the label, if it's not hidden. - if (!$variables['label_hidden']) { - $output .= '

' . $variables['label'] . ':

'; - } - - // Render the items. - $output .= ($variables['element']['#label_display'] == 'inline') ? '