12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- <?php
- // https://www.qed42.com/blog/autocomplete-drupal-8
- // https://www.drupal.org/docs/8/modules/search-api/developer-documentation/executing-a-search-in-code
- namespace Drupal\materio_sapi\Controller;
- use Drupal\Core\Controller\ControllerBase;
- use Symfony\Component\HttpFoundation\JsonResponse;
- use Symfony\Component\HttpFoundation\Request;
- use Drupal\Component\Utility\Tags;
- use Drupal\Component\Utility\Unicode;
- use Drupal\search_api\Entity\Index;
- // https://drupal.stackexchange.com/questions/225008/programatically-use-search-api
- /**
- * Defines a route controller for entity autocomplete form elements.
- */
- class Base extends ControllerBase {
- /**
- * Handler for autocomplete request.
- */
- public function getResults(Request $request) {
- $resp = [
- 'tes' => 'ok',
- 'autocomplete' => $request->query->get('autocomplete'),
- 'keys' => $request->query->get('keys'),
- 'range' => array(
- 'offset' => $request->query->get('offset'),
- 'limit' => $request->query->get('limit'),
- ),
- ];
- // Get the typed string from the URL, if it exists.
- if ($keys = $resp['keys']) {
- $typed_string = Tags::explode($keys);
- $typed_string = Unicode::strtolower($keys);
- \Drupal::logger('materio_sapi')->notice($typed_string);
- $index = Index::load('database');
- $query = $index->query();
- // Change the parse mode for the search.
- $parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')
- ->createInstance('direct');
- $parse_mode->setConjunction('OR');
- $query->setParseMode($parse_mode);
- // Set fulltext search keywords and fields.
- $query->keys($typed_string);
- // $query->setFulltextFields(['name']);
- // Set additional conditions.
- // $query->addCondition('status', 1)
- // ->addCondition('author', 1, '<>');
- // Restrict the search to specific languages.
- // $query->setLanguages(['de', 'it']);
- // Do paging.
- $query->range($resp['range']['offset'], $resp['range']['limit']);
- // Add sorting.
- $query->sort('search_api_relevance', 'DESC');
- // Set one or more tags for the query.
- // @see hook_search_api_query_TAG_alter()
- // @see hook_search_api_results_TAG_alter()
- $query->addTag('materio_sapi_search');
- $results = $query->execute();
- $resultitems = $results->getResultItems();
- $resp['count'] = $results->getResultCount();
- $resp['resultitems'] = array_keys($resultitems);
- $resp['options'] = $query->getOptions();
- $items = [];
- foreach ($results as $result) {
- // \Drupal::logger('materio_sapi')->notice(print_r($result->getField('tid')->getValues(),true));
- // \Drupal::logger('materio_sapi')->notice(print_r($result->getField('name')->getValues(),true));
- $nid = $result->getField('nid')->getValues()[0];
- $title = $result->getField('title')->getValues()[0]->getText();
- $items[] = [
- 'nid' => $nid,
- 'title' => $title,
- ];
- }
- $resp['items'] = $items;
- }
- return new JsonResponse($resp);
- }
- }
|