Base.php 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. // https://drupal.stackexchange.com/questions/225008/programatically-use-search-api
  12. /**
  13. * Defines a route controller for entity autocomplete form elements.
  14. */
  15. class Base extends ControllerBase {
  16. /**
  17. * Handler for autocomplete request.
  18. */
  19. public function getResults(Request $request) {
  20. $resp = [
  21. 'tes' => 'ok',
  22. 'autocomplete' => $request->query->get('autocomplete'),
  23. 'keys' => $request->query->get('keys'),
  24. 'range' => array(
  25. 'offset' => $request->query->get('offset'),
  26. 'limit' => $request->query->get('limit'),
  27. ),
  28. ];
  29. // Get the typed string from the URL, if it exists.
  30. if ($keys = $resp['keys']) {
  31. $typed_string = Tags::explode($keys);
  32. $typed_string = Unicode::strtolower($keys);
  33. \Drupal::logger('materio_sapi')->notice($typed_string);
  34. $index = Index::load('database');
  35. $query = $index->query();
  36. // Change the parse mode for the search.
  37. $parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')
  38. ->createInstance('direct');
  39. $parse_mode->setConjunction('OR');
  40. $query->setParseMode($parse_mode);
  41. // Set fulltext search keywords and fields.
  42. $query->keys($typed_string);
  43. // $query->setFulltextFields(['name']);
  44. // Set additional conditions.
  45. // $query->addCondition('status', 1)
  46. // ->addCondition('author', 1, '<>');
  47. // Restrict the search to specific languages.
  48. // $query->setLanguages(['de', 'it']);
  49. // Do paging.
  50. $query->range($resp['range']['offset'], $resp['range']['limit']);
  51. // Add sorting.
  52. $query->sort('search_api_relevance', 'DESC');
  53. // Set one or more tags for the query.
  54. // @see hook_search_api_query_TAG_alter()
  55. // @see hook_search_api_results_TAG_alter()
  56. $query->addTag('materio_sapi_search');
  57. $results = $query->execute();
  58. $resultitems = $results->getResultItems();
  59. $resp['count'] = $results->getResultCount();
  60. $resp['resultitems'] = array_keys($resultitems);
  61. $resp['options'] = $query->getOptions();
  62. $items = [];
  63. foreach ($results as $result) {
  64. // \Drupal::logger('materio_sapi')->notice(print_r($result->getField('tid')->getValues(),true));
  65. // \Drupal::logger('materio_sapi')->notice(print_r($result->getField('name')->getValues(),true));
  66. $nid = $result->getField('nid')->getValues()[0];
  67. $title = $result->getField('title')->getValues()[0]->getText();
  68. $items[] = [
  69. 'nid' => $nid,
  70. 'title' => $title,
  71. ];
  72. }
  73. $resp['items'] = $items;
  74. }
  75. return new JsonResponse($resp);
  76. }
  77. }