Loading core/modules/views/src/Plugin/views/filter/FilterPluginBase.php +8 −4 Original line number Diff line number Diff line Loading @@ -1400,13 +1400,17 @@ public function convertExposedInput(&$input, $selected_group_id = NULL) { return FALSE; } if (isset($selected_group) && isset($this->options['group_info']['group_items'][$selected_group])) { $input[$this->options['expose']['operator']] = $this->options['group_info']['group_items'][$selected_group]['operator']; $selected_group_options = $this->options['group_info']['group_items'][$selected_group]; $operator_id = $this->options['expose']['operator']; $input[$operator_id] = $selected_group_options['operator']; $this->options['expose']['operator_id'] = $operator_id; $this->options['expose']['use_operator'] = TRUE; // 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['group_info']['identifier']] = $this->options['group_info']['group_items'][$selected_group]['value']; if (isset($selected_group_options['value']) && $selected_group_options['value'] !== '') { $input[$this->options['group_info']['identifier']] = $selected_group_options['value']; } $this->options['expose']['use_operator'] = TRUE; $this->group_info = $input[$this->options['group_info']['identifier']]; return TRUE; Loading core/modules/views/tests/modules/views_test_config/test_views/views.view.test_boolean_grouped_filter_view.yml 0 → 100644 +191 −0 Original line number Diff line number Diff line langcode: en status: true dependencies: module: - node - user id: test_boolean_grouped_filter_view label: 'Test Boolean Grouped Filter View' module: views description: '' tag: '' base_table: node_field_data base_field: nid display: default: id: default display_title: Default display_plugin: default position: 0 display_options: fields: title: id: title table: node_field_data field: title relationship: none group_type: group admin_label: '' entity_type: node entity_field: title plugin_id: field label: '' exclude: false alter: alter_text: false make_link: false absolute: false word_boundary: false ellipsis: false strip_tags: false trim: false html: false element_type: '' element_class: '' element_label_type: '' element_label_class: '' element_label_colon: true element_wrapper_type: '' element_wrapper_class: '' element_default_classes: true empty: '' hide_empty: false empty_zero: false hide_alter_empty: true click_sort_column: value type: string settings: link_to_entity: true group_column: value group_columns: { } group_rows: true delta_limit: 0 delta_offset: 0 delta_reversed: false delta_first_last: false multi_type: separator separator: ', ' field_api_classes: false pager: type: none options: offset: 0 exposed_form: type: basic options: submit_button: Apply reset_button: false reset_button_label: Reset exposed_sorts_label: 'Sort by' expose_sort_order: true sort_asc_label: Asc sort_desc_label: Desc access: type: perm options: perm: 'access content' cache: type: tag options: { } empty: { } sorts: { } arguments: { } filters: field_test_boolean_field_value: id: field_test_boolean_field_value table: node__field_test_boolean_field field: field_test_boolean_field_value relationship: none group_type: group admin_label: '' plugin_id: boolean operator: '=' value: '' group: 1 exposed: true expose: operator_id: '' label: 'Test Boolean Field (field_test_boolean_field)' description: null use_operator: false operator: field_test_boolean_field_value_op operator_limit_selection: false operator_list: { } identifier: field_test_boolean_field_value required: true remember: false multiple: false remember_roles: authenticated: authenticated is_grouped: true group_info: label: 'Test Boolean Field (field_test_boolean_field)' description: '' identifier: field_test_boolean_field_value optional: true widget: select multiple: false remember: false default_group: All default_group_multiple: { } group_items: 1: title: 'True' operator: '=' value: '1' 2: title: 'Not True' operator: '!=' value: '1' style: type: default options: grouping: { } row_class: '' default_row_class: true uses_fields: false row: type: fields options: default_field_elements: true inline: { } separator: '' hide_empty: false query: type: views_query options: query_comment: '' disable_sql_rewrite: false distinct: false replica: false query_tags: { } relationships: { } header: { } footer: { } display_extenders: { } cache_metadata: max-age: -1 contexts: - 'languages:language_content' - 'languages:language_interface' - url - 'user.node_grants:view' - user.permissions tags: { } page_1: id: page_1 display_title: Page display_plugin: page position: 1 display_options: display_extenders: { } path: test0page cache_metadata: max-age: -1 contexts: - 'languages:language_content' - 'languages:language_interface' - url - 'user.node_grants:view' - user.permissions tags: { } core/modules/views/tests/src/Kernel/Handler/FilterBooleanOperatorGroupTest.php 0 → 100644 +122 −0 Original line number Diff line number Diff line <?php declare(strict_types=1); namespace Drupal\Tests\views\Kernel\Handler; use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; use Drupal\node\Entity\Node; use Drupal\node\Entity\NodeType; use Drupal\Tests\views\Kernel\ViewsKernelTestBase; use Drupal\views\Views; /** * Tests the core Drupal\views\Plugin\views\filter\BooleanOperator handler. * * @group views * @see \Drupal\views\Plugin\views\filter\BooleanOperator */ class FilterBooleanOperatorGroupTest extends ViewsKernelTestBase { /** * The modules to enable for this test. * * @var array */ protected static $modules = [ 'system', 'field', 'text', 'node', 'user', 'views_test_config', ]; /** * Views used by this test. * * @var array */ public static $testViews = ['test_boolean_grouped_filter_view']; /** * {@inheritdoc} */ public function setUp($import_test_views = TRUE): void { parent::setUp($import_test_views); $this->installEntitySchema('node'); $this->installEntitySchema('user'); $this->installSchema('node', ['node_access']); $this->installConfig(['node']); $node_type = NodeType::create(['type' => 'page']); $node_type->setDisplaySubmitted(FALSE); $node_type->save(); FieldStorageConfig::create([ 'entity_type' => 'node', 'type' => 'boolean', 'field_name' => 'field_test_boolean_field', ])->save(); FieldConfig::create([ 'entity_type' => 'node', 'bundle' => 'page', 'field_name' => 'field_test_boolean_field', ])->save(); Node::create([ 'title' => 'Checked', 'type' => 'page', 'field_test_boolean_field' => 1, 'status' => TRUE, ])->save(); Node::create([ 'title' => 'Un-checked', 'type' => 'page', 'field_test_boolean_field' => 0, 'status' => TRUE, ])->save(); } /** * Tests that grouped boolean exposed form works as expected. */ public function testViewsBooleanGroupedFilter(): void { /** @var \Drupal\views\ViewExecutable $view */ $view = Views::getView('test_boolean_grouped_filter_view'); $view->setDisplay('page_1'); $view->setExposedInput(['field_test_boolean_field_value' => 'All']); $view->execute(); $this->assertEquals(2, count($view->result)); $build = $view->rowPlugin->render($view->result[0]); $output = \Drupal::service('renderer')->renderRoot($build); $this->assertStringContainsString('Checked', $output->__toString()); $build = $view->rowPlugin->render($view->result[1]); $output = \Drupal::service('renderer')->renderRoot($build); $this->assertStringContainsString('Un-checked', $output->__toString()); $view = Views::getView('test_boolean_grouped_filter_view'); $view->setDisplay('page_1'); $view->setExposedInput(['field_test_boolean_field_value' => 1]); $view->execute(); $this->assertEquals(1, count($view->result)); $build = $view->rowPlugin->render($view->result[0]); $output = \Drupal::service('renderer')->renderRoot($build); $this->assertStringContainsString('Checked', $output->__toString()); $view = Views::getView('test_boolean_grouped_filter_view'); $view->setDisplay('page_1'); $view->setExposedInput(['field_test_boolean_field_value' => '2']); $view->execute(); $this->assertEquals(1, count($view->result)); $build = $view->rowPlugin->render($view->result[0]); $output = \Drupal::service('renderer')->renderRoot($build); $this->assertStringContainsString('Un-checked', $output->__toString()); } } Loading
core/modules/views/src/Plugin/views/filter/FilterPluginBase.php +8 −4 Original line number Diff line number Diff line Loading @@ -1400,13 +1400,17 @@ public function convertExposedInput(&$input, $selected_group_id = NULL) { return FALSE; } if (isset($selected_group) && isset($this->options['group_info']['group_items'][$selected_group])) { $input[$this->options['expose']['operator']] = $this->options['group_info']['group_items'][$selected_group]['operator']; $selected_group_options = $this->options['group_info']['group_items'][$selected_group]; $operator_id = $this->options['expose']['operator']; $input[$operator_id] = $selected_group_options['operator']; $this->options['expose']['operator_id'] = $operator_id; $this->options['expose']['use_operator'] = TRUE; // 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['group_info']['identifier']] = $this->options['group_info']['group_items'][$selected_group]['value']; if (isset($selected_group_options['value']) && $selected_group_options['value'] !== '') { $input[$this->options['group_info']['identifier']] = $selected_group_options['value']; } $this->options['expose']['use_operator'] = TRUE; $this->group_info = $input[$this->options['group_info']['identifier']]; return TRUE; Loading
core/modules/views/tests/modules/views_test_config/test_views/views.view.test_boolean_grouped_filter_view.yml 0 → 100644 +191 −0 Original line number Diff line number Diff line langcode: en status: true dependencies: module: - node - user id: test_boolean_grouped_filter_view label: 'Test Boolean Grouped Filter View' module: views description: '' tag: '' base_table: node_field_data base_field: nid display: default: id: default display_title: Default display_plugin: default position: 0 display_options: fields: title: id: title table: node_field_data field: title relationship: none group_type: group admin_label: '' entity_type: node entity_field: title plugin_id: field label: '' exclude: false alter: alter_text: false make_link: false absolute: false word_boundary: false ellipsis: false strip_tags: false trim: false html: false element_type: '' element_class: '' element_label_type: '' element_label_class: '' element_label_colon: true element_wrapper_type: '' element_wrapper_class: '' element_default_classes: true empty: '' hide_empty: false empty_zero: false hide_alter_empty: true click_sort_column: value type: string settings: link_to_entity: true group_column: value group_columns: { } group_rows: true delta_limit: 0 delta_offset: 0 delta_reversed: false delta_first_last: false multi_type: separator separator: ', ' field_api_classes: false pager: type: none options: offset: 0 exposed_form: type: basic options: submit_button: Apply reset_button: false reset_button_label: Reset exposed_sorts_label: 'Sort by' expose_sort_order: true sort_asc_label: Asc sort_desc_label: Desc access: type: perm options: perm: 'access content' cache: type: tag options: { } empty: { } sorts: { } arguments: { } filters: field_test_boolean_field_value: id: field_test_boolean_field_value table: node__field_test_boolean_field field: field_test_boolean_field_value relationship: none group_type: group admin_label: '' plugin_id: boolean operator: '=' value: '' group: 1 exposed: true expose: operator_id: '' label: 'Test Boolean Field (field_test_boolean_field)' description: null use_operator: false operator: field_test_boolean_field_value_op operator_limit_selection: false operator_list: { } identifier: field_test_boolean_field_value required: true remember: false multiple: false remember_roles: authenticated: authenticated is_grouped: true group_info: label: 'Test Boolean Field (field_test_boolean_field)' description: '' identifier: field_test_boolean_field_value optional: true widget: select multiple: false remember: false default_group: All default_group_multiple: { } group_items: 1: title: 'True' operator: '=' value: '1' 2: title: 'Not True' operator: '!=' value: '1' style: type: default options: grouping: { } row_class: '' default_row_class: true uses_fields: false row: type: fields options: default_field_elements: true inline: { } separator: '' hide_empty: false query: type: views_query options: query_comment: '' disable_sql_rewrite: false distinct: false replica: false query_tags: { } relationships: { } header: { } footer: { } display_extenders: { } cache_metadata: max-age: -1 contexts: - 'languages:language_content' - 'languages:language_interface' - url - 'user.node_grants:view' - user.permissions tags: { } page_1: id: page_1 display_title: Page display_plugin: page position: 1 display_options: display_extenders: { } path: test0page cache_metadata: max-age: -1 contexts: - 'languages:language_content' - 'languages:language_interface' - url - 'user.node_grants:view' - user.permissions tags: { }
core/modules/views/tests/src/Kernel/Handler/FilterBooleanOperatorGroupTest.php 0 → 100644 +122 −0 Original line number Diff line number Diff line <?php declare(strict_types=1); namespace Drupal\Tests\views\Kernel\Handler; use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; use Drupal\node\Entity\Node; use Drupal\node\Entity\NodeType; use Drupal\Tests\views\Kernel\ViewsKernelTestBase; use Drupal\views\Views; /** * Tests the core Drupal\views\Plugin\views\filter\BooleanOperator handler. * * @group views * @see \Drupal\views\Plugin\views\filter\BooleanOperator */ class FilterBooleanOperatorGroupTest extends ViewsKernelTestBase { /** * The modules to enable for this test. * * @var array */ protected static $modules = [ 'system', 'field', 'text', 'node', 'user', 'views_test_config', ]; /** * Views used by this test. * * @var array */ public static $testViews = ['test_boolean_grouped_filter_view']; /** * {@inheritdoc} */ public function setUp($import_test_views = TRUE): void { parent::setUp($import_test_views); $this->installEntitySchema('node'); $this->installEntitySchema('user'); $this->installSchema('node', ['node_access']); $this->installConfig(['node']); $node_type = NodeType::create(['type' => 'page']); $node_type->setDisplaySubmitted(FALSE); $node_type->save(); FieldStorageConfig::create([ 'entity_type' => 'node', 'type' => 'boolean', 'field_name' => 'field_test_boolean_field', ])->save(); FieldConfig::create([ 'entity_type' => 'node', 'bundle' => 'page', 'field_name' => 'field_test_boolean_field', ])->save(); Node::create([ 'title' => 'Checked', 'type' => 'page', 'field_test_boolean_field' => 1, 'status' => TRUE, ])->save(); Node::create([ 'title' => 'Un-checked', 'type' => 'page', 'field_test_boolean_field' => 0, 'status' => TRUE, ])->save(); } /** * Tests that grouped boolean exposed form works as expected. */ public function testViewsBooleanGroupedFilter(): void { /** @var \Drupal\views\ViewExecutable $view */ $view = Views::getView('test_boolean_grouped_filter_view'); $view->setDisplay('page_1'); $view->setExposedInput(['field_test_boolean_field_value' => 'All']); $view->execute(); $this->assertEquals(2, count($view->result)); $build = $view->rowPlugin->render($view->result[0]); $output = \Drupal::service('renderer')->renderRoot($build); $this->assertStringContainsString('Checked', $output->__toString()); $build = $view->rowPlugin->render($view->result[1]); $output = \Drupal::service('renderer')->renderRoot($build); $this->assertStringContainsString('Un-checked', $output->__toString()); $view = Views::getView('test_boolean_grouped_filter_view'); $view->setDisplay('page_1'); $view->setExposedInput(['field_test_boolean_field_value' => 1]); $view->execute(); $this->assertEquals(1, count($view->result)); $build = $view->rowPlugin->render($view->result[0]); $output = \Drupal::service('renderer')->renderRoot($build); $this->assertStringContainsString('Checked', $output->__toString()); $view = Views::getView('test_boolean_grouped_filter_view'); $view->setDisplay('page_1'); $view->setExposedInput(['field_test_boolean_field_value' => '2']); $view->execute(); $this->assertEquals(1, count($view->result)); $build = $view->rowPlugin->render($view->result[0]); $output = \Drupal::service('renderer')->renderRoot($build); $this->assertStringContainsString('Un-checked', $output->__toString()); } }