function template_preprocess_file_widget_multiple in Zircon Profile 8
Same name and namespace in other branches
- 8.0 core/modules/file/file.field.inc \template_preprocess_file_widget_multiple()
Prepares variables for multi file form widget templates.
Default template: file-widget-multiple.html.twig.
Parameters
array $variables: An associative array containing:
- element: A render element representing the widgets.
File
- core/
modules/ file/ file.field.inc, line 21 - Field module functionality for the File module.
Code
function template_preprocess_file_widget_multiple(&$variables) {
$element = $variables['element'];
// Special ID and classes for draggable tables.
$weight_class = $element['#id'] . '-weight';
$table_id = $element['#id'] . '-table';
// Build up a table of applicable fields.
$headers = array();
$headers[] = t('File information');
if ($element['#display_field']) {
$headers[] = array(
'data' => t('Display'),
'class' => array(
'checkbox',
),
);
}
$headers[] = t('Weight');
$headers[] = t('Operations');
// Get our list of widgets in order (needed when the form comes back after
// preview or failed validation).
$widgets = array();
foreach (Element::children($element) as $key) {
$widgets[] =& $element[$key];
}
usort($widgets, '_field_multiple_value_form_sort_helper');
$rows = array();
foreach ($widgets as $key => &$widget) {
// Save the uploading row for last.
if (empty($widget['#files'])) {
$widget['#title'] = $element['#file_upload_title'];
$widget['#description'] = \Drupal::service('renderer')
->renderPlain($element['#file_upload_description']);
continue;
}
// Delay rendering of the buttons, so that they can be rendered later in the
// "operations" column.
$operations_elements = array();
foreach (Element::children($widget) as $sub_key) {
if (isset($widget[$sub_key]['#type']) && $widget[$sub_key]['#type'] == 'submit') {
hide($widget[$sub_key]);
$operations_elements[] =& $widget[$sub_key];
}
}
// Delay rendering of the "Display" option and the weight selector, so that
// each can be rendered later in its own column.
if ($element['#display_field']) {
hide($widget['display']);
}
hide($widget['_weight']);
// Render everything else together in a column, without the normal wrappers.
$widget['#theme_wrappers'] = array();
$information = drupal_render($widget);
$display = '';
if ($element['#display_field']) {
unset($widget['display']['#title']);
$display = array(
'data' => render($widget['display']),
'class' => array(
'checkbox',
),
);
}
$widget['_weight']['#attributes']['class'] = array(
$weight_class,
);
$weight = render($widget['_weight']);
// Arrange the row with all of the rendered columns.
$row = array();
$row[] = $information;
if ($element['#display_field']) {
$row[] = $display;
}
$row[] = $weight;
// Show the buttons that had previously been marked as hidden in this
// preprocess function. We use show() to undo the earlier hide().
foreach (Element::children($operations_elements) as $key) {
show($operations_elements[$key]);
}
$row[] = array(
'data' => $operations_elements,
);
$rows[] = array(
'data' => $row,
'class' => isset($widget['#attributes']['class']) ? array_merge($widget['#attributes']['class'], array(
'draggable',
)) : array(
'draggable',
),
);
}
$variables['table'] = array(
'#type' => 'table',
'#header' => $headers,
'#rows' => $rows,
'#attributes' => array(
'id' => $table_id,
),
'#tabledrag' => array(
array(
'action' => 'order',
'relationship' => 'sibling',
'group' => $weight_class,
),
),
'#access' => !empty($rows),
);
$variables['element'] = $element;
}