FormAutocomplete.php 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. // https://www.qed42.com/blog/autocomplete-drupal-8
  3. // https://www.drupal.org/docs/8/modules/search-api/developer-documentation/executing-a-search-in-code
  4. namespace Drupal\materio_sapi\Controller;
  5. use Drupal\Core\Controller\ControllerBase;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Drupal\Component\Utility\Tags;
  9. use Drupal\Component\Utility\Unicode;
  10. use Drupal\search_api\Entity\Index;
  11. /**
  12. * Defines a route controller for entity autocomplete form elements.
  13. */
  14. class FormAutocomplete extends ControllerBase {
  15. /**
  16. * Handler for autocomplete request.
  17. */
  18. public function autocomplete(Request $request) {
  19. // Get the typed string from the URL, if it exists.
  20. if ($input = $request->query->get('q')) {
  21. $typed_string = Tags::explode($input);
  22. $typed_string = Unicode::strtolower(array_pop($typed_string));
  23. // \Drupal::logger('materio_sapi')->notice($typed_string);
  24. $index = Index::load('autocomplete');
  25. $query = $index->query();
  26. // Change the parse mode for the search.
  27. $parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')
  28. ->createInstance('direct');
  29. $parse_mode->setConjunction('OR');
  30. $query->setParseMode($parse_mode);
  31. // Set fulltext search keywords and fields.
  32. $query->keys($typed_string);
  33. $query->setFulltextFields(['name', 'field_synonyms']);
  34. // Set additional conditions.
  35. $query->addCondition('status', 1);
  36. // ->addCondition('author', 1, '<>');
  37. // Restrict the search to specific languages.
  38. $lang = \Drupal::languageManager()->getCurrentLanguage()->getId();
  39. $query->setLanguages([$lang]);
  40. // Do paging.
  41. $query->range(0, 15);
  42. // Add sorting.
  43. $query->sort('search_api_relevance', 'DESC');
  44. // Set one or more tags for the query.
  45. // @see hook_search_api_query_TAG_alter()
  46. // @see hook_search_api_results_TAG_alter()
  47. $query->addTag('materio_sapi_autocomplete');
  48. $results = $query->execute();
  49. \Drupal::logger('materio_sapi')->notice($results->getResultCount());
  50. // $items = $results->getResultItems();
  51. // \Drupal::logger('materio_sapi')->notice(implode(', ', array_keys($items)));
  52. $response = [];
  53. foreach ($results as $result) {
  54. // \Drupal::logger('materio_sapi')->notice(print_r($result->getField('tid')->getValues(),true));
  55. // \Drupal::logger('materio_sapi')->notice(print_r($result->getField('name')->getValues(),true));
  56. // \Drupal::logger('materio_sapi')->notice(implode(', ', array_keys($result)));
  57. $tid = $result->getField('tid')->getValues()[0];
  58. $term_name = $result->getField('name')->getValues()[0]->getText();
  59. $response[] = [
  60. 'value' => $tid,
  61. 'label' => $term_name,
  62. ];
  63. }
  64. }
  65. return new JsonResponse($response);
  66. }
  67. }