diff --git a/src/Plugin/search_api_autocomplete/search/Views.php b/src/Plugin/search_api_autocomplete/search/Views.php index 2db6e31..ea93389 100644 --- a/src/Plugin/search_api_autocomplete/search/Views.php +++ b/src/Plugin/search_api_autocomplete/search/Views.php @@ -21,7 +21,8 @@ * group_label = @Translation("Search views"), * group_description = @Translation("Searches provided by Views"), * provider = "views", - * deriver = "Drupal\search_api_autocomplete\Plugin\search_api_autocomplete\search\ViewsDeriver" + * deriver = + * "Drupal\search_api_autocomplete\Plugin\search_api_autocomplete\search\ViewsDeriver" * ) */ class Views extends SearchPluginBase implements PluginFormInterface { @@ -169,6 +170,21 @@ public function createQuery($keys, array $data = []) { } $view->preExecute(); + + // If the fulltext filter was set to "Required", the search query will be + // aborted during the build (unless keys were given), potentially ending up + // with an incomplete set of filters. To avoid this, we remove the filter's + // "Required" setting. + if (!$single_field_filter && trim($keys) === '') { + /** @var \Drupal\views\Plugin\views\filter\FilterPluginBase $filter */ + foreach ($view->display_handler->getHandlers('filter') as $filter) { + // In theory, we only need to remove the setting for our own "Search: + // Fulltext search" filter – but it's really both simpler and safer to + // just do it for all of them. + $filter->options['expose']['required'] = FALSE; + } + } + $view->build(); $query_plugin = $view->getQuery(); diff --git a/tests/search_api_autocomplete_test/config/install/views.view.search_api_autocomplete_test_view.yml b/tests/search_api_autocomplete_test/config/install/views.view.search_api_autocomplete_test_view.yml index 0a25efc..6e9d4e3 100644 --- a/tests/search_api_autocomplete_test/config/install/views.view.search_api_autocomplete_test_view.yml +++ b/tests/search_api_autocomplete_test/config/install/views.view.search_api_autocomplete_test_view.yml @@ -79,7 +79,7 @@ display: use_operator: true operator: keys_op identifier: keys - required: false + required: true remember: false multiple: false remember_roles: diff --git a/tests/src/FunctionalJavascript/IntegrationTest.php b/tests/src/FunctionalJavascript/IntegrationTest.php index 31d89fe..ad0f588 100644 --- a/tests/src/FunctionalJavascript/IntegrationTest.php +++ b/tests/src/FunctionalJavascript/IntegrationTest.php @@ -257,6 +257,7 @@ protected function checkSearchAutocomplete($click_url_suggestion = FALSE) { // Make sure the query looks as it should. /** @var \Drupal\search_api\Query\QueryInterface $query */ list($query) = $this->getMethodArguments('backend', 'getAutocompleteSuggestions'); + $this->assertFalse($query->wasAborted()); $this->assertEquals(['body'], $query->getFulltextFields()); $this->assertEquals(['en'], array_values($query->getLanguages()));