diff --git a/core/modules/views/src/Plugin/views/filter/FilterPluginBase.php b/core/modules/views/src/Plugin/views/filter/FilterPluginBase.php index 335fd99..4855b7c 100644 --- a/core/modules/views/src/Plugin/views/filter/FilterPluginBase.php +++ b/core/modules/views/src/Plugin/views/filter/FilterPluginBase.php @@ -8,6 +8,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\Element; use Drupal\Core\Render\Element\Checkboxes; +use Drupal\options\Plugin\views\filter\ListField; use Drupal\user\RoleInterface; use Drupal\views\Plugin\views\HandlerBase; use Drupal\Component\Utility\Html; @@ -1290,11 +1291,30 @@ public function convertExposedInput(&$input, $selected_group_id = NULL) { // Value can be optional, For example for 'empty' and 'not empty' filters. if (isset($this->options['group_info']['group_items'][$selected_group]['value']) && $this->options['group_info']['group_items'][$selected_group]['value'] !== '') { - $input[$this->options['expose']['identifier']] = $this->options['group_info']['group_items'][$selected_group]['value']; + $input[$this->options['expose']['identifier']] = $this->options['group_info']['group_items'][$selected_group]['value']; + } + // Process grouped values. + if ( + isset($this->options['group_info']['group_items'][$selected_group]['value']) + && is_array($this->options['group_info']['group_items'][$selected_group]['value']) + && empty($this->options['expose']['multiply']) + ) { + $input[$this->options['expose']['identifier']] = $selected_group; + $group_values = $this->options['group_info']['group_items'][$selected_group]['value']; + } + elseif ($this instanceof BooleanOperator) { + $input[$this->options['expose']['identifier']] = $selected_group; + $group_values = $this->options['group_info']['group_items'][$selected_group]['value']; } - $this->options['expose']['use_operator'] = TRUE; - $this->group_info = $input[$this->options['group_info']['identifier']]; + + $this->options['expose']['use_operator'] = TRUE; + if (isset($group_values)) { + $this->group_info = $group_values; + } + else { + $this->group_info = $input[$this->options['group_info']['identifier']]; + } return TRUE; } else { @@ -1406,11 +1426,40 @@ public function acceptExposedInput($input) { return FALSE; } } - if (isset($value)) { + if (isset($value) && $value != 'All') { $this->value = $value; if (empty($this->alwaysMultiple) && empty($this->options['expose']['multiple']) && !is_array($value)) { $this->value = [$value]; } + if ( + ($this->isAGroup() || !empty($this->options['group_info']['identifier'])) && + ($this instanceof BooleanOperator || $this instanceof ListField) + ) { + $group_ids = $input[$this->options['expose']['identifier']]; + // Check if multiply select. + if (is_array($group_ids) && !empty($this->options['expose']['multiple'])) { + $result_values = []; + foreach ($group_ids as $group_id) { + // Check if grouped value is All in any group. + if (!isset($this->options['group_info']['group_items'][$group_id]['value']['all'])) { + $result_values += $this->options['group_info']['group_items'][$group_id]['value']; + } + else { + return FALSE; + } + } + $this->value = $result_values; + } + else { + // Check if grouped value is All. + if (isset($this->options['group_info']['group_items'][$group_ids]['value']['all'])) { + return FALSE; + } + else { + $this->value = $this->options['group_info']['group_items'][$group_ids]['value']; + } + } + } } else { return FALSE;