From 75d67d4ce8deafee645bb29387c0969d93a62da7 Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Sat, 30 May 2020 21:22:37 +0100 Subject: [PATCH] =?UTF-8?q?Issue=20#2710407=20by=20bobbygryzynger,=20dww,?= =?UTF-8?q?=20Kingdutch,=20Krzysztof=20Doma=C5=84ski,=20jp.stacey,=20johnn?= =?UTF-8?q?y5th,=20tea.time,=20joachim,=20andileco,=20Lendude,=20xjm,=20pe?= =?UTF-8?q?rcoction:=20Option=20for=20'Transform=20dashes=20in=20URL=20to?= =?UTF-8?q?=20spaces=20in=20term=20name=20filter=20values'=20on=20term=20a?= =?UTF-8?q?rguments=20doesn't=20affect=20the=20query?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/argument_validator/TermName.php | 1 + .../Views/ArgumentTransformTermTest.php | 64 ++++++ ...iews.view.test_argument_transform_term.yml | 217 ++++++++++++++++++ 3 files changed, 282 insertions(+) create mode 100644 core/modules/taxonomy/tests/src/Kernel/Views/ArgumentTransformTermTest.php create mode 100644 core/modules/views/tests/modules/views_test_config/test_views/views.view.test_argument_transform_term.yml diff --git a/core/modules/taxonomy/src/Plugin/views/argument_validator/TermName.php b/core/modules/taxonomy/src/Plugin/views/argument_validator/TermName.php index 5b32531bb9df..1a81b2f95257 100644 --- a/core/modules/taxonomy/src/Plugin/views/argument_validator/TermName.php +++ b/core/modules/taxonomy/src/Plugin/views/argument_validator/TermName.php @@ -64,6 +64,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) { public function validateArgument($argument) { if ($this->options['transform']) { $argument = str_replace('-', ' ', $argument); + $this->argument->argument = $argument; } $terms = $this->termStorage->loadByProperties(['name' => $argument]); diff --git a/core/modules/taxonomy/tests/src/Kernel/Views/ArgumentTransformTermTest.php b/core/modules/taxonomy/tests/src/Kernel/Views/ArgumentTransformTermTest.php new file mode 100644 index 000000000000..04c36a660189 --- /dev/null +++ b/core/modules/taxonomy/tests/src/Kernel/Views/ArgumentTransformTermTest.php @@ -0,0 +1,64 @@ +<?php + +namespace Drupal\Tests\taxonomy\Kernel\Views; + +use Drupal\views\Views; + +/** + * Tests taxonomy term argument transformation. + * + * @group taxonomy + * + * @see \Drupal\taxonomy\Plugin\views\argument_validator\TermName + */ +class ArgumentTransformTermTest extends TaxonomyTestBase { + + /** + * {@inheritdoc} + */ + public static $testViews = ['test_argument_transform_term']; + + /** + * Tests term argument transformation of hyphens and spaces. + * + * @dataProvider termArgumentTransformationProvider + * + * @param string $name + * The name of the taxonomy term to use for the test. + */ + public function testTermArgumentTransformation($name) { + /** @var \Drupal\taxonomy\TermInterface $term */ + $term = $this->createTerm(['name' => $name]); + + /** @var \Drupal\views\ViewExecutable $view */ + $view = Views::getView('test_argument_transform_term'); + $view->initHandlers(); + + /** @var string $hyphenated_term */ + $hyphenated_term = str_replace(' ', '-', $term->label()); + $this->assertTrue($view->argument['tid']->setArgument($hyphenated_term)); + // Assert hyphens are converted back to spaces. + $this->assertEquals($term->label(), $view->argument['tid']->argument); + } + + /** + * Provides data for testTermArgumentTransformation(). + * + * @return array[] + * Test data. + */ + public function termArgumentTransformationProvider() { + return [ + 'space in the middle' => [ + 'name' => $this->randomMachineName() . ' ' . $this->randomMachineName(), + ], + 'space at the start' => [ + 'name' => ' ' . $this->randomMachineName(), + ], + 'space at the end' => [ + 'name' => $this->randomMachineName() . ' ', + ], + ]; + } + +} diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_argument_transform_term.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_argument_transform_term.yml new file mode 100644 index 000000000000..7d7d8b1904e7 --- /dev/null +++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_argument_transform_term.yml @@ -0,0 +1,217 @@ +langcode: en +status: true +dependencies: + module: + - node + - taxonomy + - user +id: test_argument_transform_term +label: test_argument_transform_term +module: views +description: '' +tag: '' +base_table: node_field_data +base_field: nid +display: + default: + display_plugin: default + id: default + display_title: Master + position: 0 + display_options: + access: + type: perm + options: + perm: 'access content' + cache: + type: none + options: { } + query: + type: views_query + options: + disable_sql_rewrite: false + distinct: false + replica: false + query_comment: '' + query_tags: { } + 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 + pager: + type: full + options: + items_per_page: 10 + offset: 0 + id: 0 + total_pages: null + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '5, 10, 25, 50' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + tags: + previous: '‹ Previous' + next: 'Next ›' + first: '« First' + last: 'Last »' + quantity: 9 + style: + type: default + options: + grouping: { } + row_class: '' + default_row_class: true + uses_fields: false + row: + type: fields + options: + inline: { } + separator: '' + hide_empty: false + default_field_elements: true + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + label: '' + alter: + alter_text: false + make_link: false + absolute: false + trim: false + word_boundary: false + ellipsis: false + strip_tags: false + html: false + hide_empty: false + empty_zero: false + settings: + link_to_entity: true + plugin_id: field + relationship: none + group_type: group + admin_label: '' + exclude: 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_alter_empty: true + click_sort_column: value + type: string + 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 + filters: + status: + value: '1' + table: node_field_data + field: status + plugin_id: boolean + entity_type: node + entity_field: status + id: status + expose: + operator: '' + operator_limit_selection: false + operator_list: { } + group: 1 + sorts: + created: + id: created + table: node_field_data + field: created + order: DESC + entity_type: node + entity_field: created + plugin_id: date + relationship: none + group_type: group + admin_label: '' + exposed: false + expose: + label: '' + granularity: second + header: { } + footer: { } + empty: { } + relationships: { } + arguments: + tid: + id: tid + table: taxonomy_index + field: tid + relationship: none + group_type: group + admin_label: '' + default_action: ignore + exception: + value: all + title_enable: false + title: All + title_enable: true + title: '{{ raw_arguments.tid }}' + default_argument_type: fixed + default_argument_options: + argument: '' + default_argument_skip_url: false + summary_options: + base_path: '' + count: true + items_per_page: 25 + override: false + summary: + sort_order: asc + number_of_records: 0 + format: default_summary + specify_validation: true + validate: + type: taxonomy_term_name + fail: 'not found' + validate_options: + operation: view + transform: true + bundles: { } + access: false + break_phrase: false + add_table: false + require_value: false + reduce_duplicates: false + plugin_id: taxonomy_index_tid + display_extenders: { } + cache_metadata: + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url + - url.query_args + - 'user.node_grants:view' + - user.permissions + cacheable: false + max-age: -1 + tags: { } -- GitLab