public RearrangeFilter::submitForm(array &$form, FormStateInterface $form_state)
Form submission handler.
Parameters
array $form: An associative array containing the structure of the form.
\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.
Overrides ViewsFormBase::submitForm
File
- core/modules/views_ui/src/Form/Ajax/RearrangeFilter.php, line 224
Class
- RearrangeFilter
- Provides a rearrange form for Views filters.
Namespace
Drupal\views_ui\Form\Ajax
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | public function submitForm( array & $form , FormStateInterface $form_state ) { $types = ViewExecutable::getHandlerTypes(); $view = $form_state ->get( 'view' ); $display = & $view ->getExecutable()->displayHandlers->get( $form_state ->get( 'display_id' )); $remember_groups = array (); if (! empty ( $view ->form_cache)) { $old_fields = $view ->form_cache[ 'handlers' ]; } else { $old_fields = $display ->getOption( $types [ 'filter' ][ 'plural' ]); } $groups = $form_state ->getValue( 'filter_groups' ); // Whatever button was clicked, re-calculate field information. $new_fields = $order = array (); // Make an array with the weights foreach ( $form_state ->getValue( 'filters' ) as $field => $info ) { // add each value that is a field with a weight to our list, but only if // it has had its 'removed' checkbox checked. if ( is_array ( $info ) && empty ( $info [ 'removed' ])) { if (isset( $info [ 'weight' ])) { $order [ $field ] = $info [ 'weight' ]; } if (isset( $info [ 'group' ])) { $old_fields [ $field ][ 'group' ] = $info [ 'group' ]; $remember_groups [ $info [ 'group' ]][] = $field ; } } } // Sort the array asort( $order ); // Create a new list of fields in the new order. foreach ( array_keys ( $order ) as $field ) { $new_fields [ $field ] = $old_fields [ $field ]; } // If the #group property is set on the clicked button, that means we are // either adding or removing a group, not actually updating the filters. $triggering_element = $form_state ->getTriggeringElement(); if (! empty ( $triggering_element [ '#group' ])) { if ( $triggering_element [ '#group' ] == 'add' ) { // Add a new group $groups [ 'groups' ][] = 'AND' ; } else { // Renumber groups above the removed one down. foreach ( array_keys ( $groups [ 'groups' ]) as $group_id ) { if ( $group_id >= $triggering_element [ '#group' ]) { $old_group = $group_id + 1; if (isset( $groups [ 'groups' ][ $old_group ])) { $groups [ 'groups' ][ $group_id ] = $groups [ 'groups' ][ $old_group ]; if (isset( $remember_groups [ $old_group ])) { foreach ( $remember_groups [ $old_group ] as $id ) { $new_fields [ $id ][ 'group' ] = $group_id ; } } } else { // If this is the last one, just unset it. unset( $groups [ 'groups' ][ $group_id ]); } } } } // Update our cache with values so that cancel still works the way // people expect. $view ->form_cache = [ 'key' => 'rearrange-filter' , 'groups' => $groups , 'handlers' => $new_fields , ]; // Return to this form except on actual Update. $view ->addFormToStack( 'rearrange-filter' , $form_state ->get( 'display_id' ), 'filter' ); } else { // The actual update button was clicked. Remove the empty groups, and // renumber them sequentially. ksort( $remember_groups ); $groups [ 'groups' ] = static ::arrayKeyPlus( array_values ( array_intersect_key ( $groups [ 'groups' ], $remember_groups ))); // Change the 'group' key on each field to match. Here, $mapping is an // array whose keys are the old group numbers and whose values are the new // (sequentially numbered) ones. $mapping = array_flip ( static ::arrayKeyPlus( array_keys ( $remember_groups ))); foreach ( $new_fields as & $new_field ) { $new_field [ 'group' ] = $mapping [ $new_field [ 'group' ]]; } // Write the changed handler values. $display ->setOption( $types [ 'filter' ][ 'plural' ], $new_fields ); $display ->setOption( 'filter_groups' , $groups ); if (isset( $view ->form_cache)) { unset( $view ->form_cache); } } // Store in cache. $view ->cacheSet(); } |
Please login to continue.