drafted ajax search call
This commit is contained in:
@@ -21,3 +21,18 @@ materio_sapi.search_form:
|
||||
# _title: 'MaterioSapiSearchForm'
|
||||
# requirements:
|
||||
# _access: 'TRUE'
|
||||
|
||||
materio_sapi.getresults:
|
||||
path: '/materio_sapi/getresults'
|
||||
defaults:
|
||||
_controller: '\Drupal\materio_sapi\Controller\Base::getResults'
|
||||
_format: json
|
||||
requirements:
|
||||
_permission: 'access materio search'
|
||||
|
||||
# materio_sapi.base:
|
||||
# path: '/base/{keys}/{autocomplete}'
|
||||
# defaults:
|
||||
# _controller: '\Drupal\materio_sapi\Controller\Base::base'
|
||||
# requirements:
|
||||
# _permission: 'access materio search'
|
||||
|
97
web/modules/custom/materio_sapi/src/Controller/Base.php
Normal file
97
web/modules/custom/materio_sapi/src/Controller/Base.php
Normal file
@@ -0,0 +1,97 @@
|
||||
<?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);
|
||||
}
|
||||
|
||||
}
|
@@ -30,12 +30,19 @@ class MaterioSapiSearchForm extends FormBase {
|
||||
'#weight' => '0',
|
||||
'#attributes' => [
|
||||
"placeholder" => $this->t('Search'),
|
||||
"@keyup" => "keyup",
|
||||
// "@keyup" => "keyup",
|
||||
"@keyup.enter" => "submit",
|
||||
"v-model" => "typed"
|
||||
|
||||
"v-model" => "keys",
|
||||
// "v-on:select" => "typed",
|
||||
],
|
||||
'#autocomplete_route_name' => 'materio_sapi.search_autocomplete',
|
||||
|
||||
];
|
||||
$form['searchautocomplete'] = [
|
||||
'#type' => 'hidden',
|
||||
'#attributes' => [
|
||||
"v-model" => "autocomplete"
|
||||
],
|
||||
];
|
||||
$form['submit'] = [
|
||||
'#type' => 'submit',
|
||||
|
Reference in New Issue
Block a user