function views_fieldsets_views_ui_rearrange_form_submit in Views fieldsets 8.3
Submit handler for views_ui_rearrange_form().
1 string reference to 'views_fieldsets_views_ui_rearrange_form_submit'
File
- ./
views_fieldsets.module, line 168 - Provides an module functionality.
Code
function views_fieldsets_views_ui_rearrange_form_submit($form, $form_state) {
$ui_view = $form_state
->get('view');
$display_id = $form_state
->get('display_id');
$view = $ui_view
->getExecutable();
$view
->setDisplay($display_id);
// Re-init handlers.
$view->inited = FALSE;
$view
->build($display_id);
$fieldsets = Fieldset::getAllFieldsets($view);
// Sort 1-dimensionally (wrong overall, but right per level).
$input_fields = $form_state
->getValue('fields');
uasort($input_fields, [
SortArray::class,
'sortByWeightElement',
]);
$fields_order = array_keys($input_fields);
// Create [field => parent] map.
$input_fields = array_map(function ($field) {
return $field['name']['hierarchy'];
}, $input_fields);
// Sort overall: level by level, n-dimensionally following the tree down.
$input_fields_weights = [];
foreach ($input_fields as $field_name => $fieldset) {
$parents = Fieldset::getUiFieldParents($input_fields, $field_name);
$id = array_reverse(array_merge([
$field_name,
], $parents));
$id = array_map(function ($field) use ($fields_order) {
return array_search($field, $fields_order);
}, $id);
$id = implode('.', $id);
$input_fields_weights[$field_name] = $id;
}
uasort($input_fields_weights, 'strnatcmp');
$input_fields_weights = array_flip(array_keys($input_fields_weights));
// Create hierarchy (fieldset-based), in the right order.
$hierarchy = array_combine(array_keys($fieldsets), array_fill(0, count($fieldsets), []));
foreach ($input_fields_weights as $field_name => $x) {
if ($parent = $input_fields[$field_name]) {
$hierarchy[$parent][] = $field_name;
}
}
// Fetch fields config from relevant display
// (just saved by Drupal\views_ui\Form\Ajax\Rearrange).
$display = $view->displayHandlers
->get($display_id);
$display_fields = $display
->getOption('fields');
// Update hierarchy into all fieldset fields, in the right order.
foreach ($hierarchy as $fieldset_name => $children) {
$display_fields[$fieldset_name]['fields'] = $children;
}
// Sort the fields storage in the right order too!
uksort($display_fields, function ($a, $b) use ($input_fields_weights) {
return $input_fields_weights[$a] - $input_fields_weights[$b];
});
// Save and save.
$display
->setOption('fields', $display_fields);
$ui_view
->cacheSet();
}