You are here

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'
views_fieldsets_form_views_ui_rearrange_form_alter in ./views_fieldsets.module
Implements hook_form_FORM_ID_alter() for views_ui_rearrange_form().

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();
}