autocomplete for genres and langues search form fields is working
This commit is contained in:
@@ -15,6 +15,15 @@ edlp_search.edlp_search_controller_searchForm_ajax:
|
|||||||
requirements:
|
requirements:
|
||||||
_permission: 'access content'
|
_permission: 'access content'
|
||||||
|
|
||||||
|
edlp_search.edlp_search_controller_autocomplete:
|
||||||
|
path: '/edlp_search/searchform/autocomplete'
|
||||||
|
defaults:
|
||||||
|
_controller: '\Drupal\edlp_search\Controller\EdlpSearchController::autocomplete'
|
||||||
|
_title: 'Autocomplete'
|
||||||
|
requirements:
|
||||||
|
_permission: 'access content'
|
||||||
|
|
||||||
|
|
||||||
edlp_search.edlp_search_controller_search_results:
|
edlp_search.edlp_search_controller_search_results:
|
||||||
path: '/edlp_search/searchresults'
|
path: '/edlp_search/searchresults'
|
||||||
defaults:
|
defaults:
|
||||||
|
|||||||
@@ -21,11 +21,14 @@ class EdlpSearchController extends ControllerBase {
|
|||||||
*/
|
*/
|
||||||
protected $formBuilder;
|
protected $formBuilder;
|
||||||
|
|
||||||
|
protected $sapi_index_id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct.
|
* Construct.
|
||||||
*/
|
*/
|
||||||
public function __construct(FormBuilder $formBuilder) {
|
public function __construct(FormBuilder $formBuilder) {
|
||||||
$this->formBuilder = $formBuilder;
|
$this->formBuilder = $formBuilder;
|
||||||
|
$this->sapi_index_id = "collection";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -78,6 +81,98 @@ class EdlpSearchController extends ControllerBase {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function autocomplete(Request $request){
|
||||||
|
// TODO: get field_name parameter
|
||||||
|
$this->request = $request;
|
||||||
|
$this->getRequestAutocompleteArgs();
|
||||||
|
|
||||||
|
// run a search on selected field and get the fields unique values
|
||||||
|
$this->autocompleteQuery();
|
||||||
|
|
||||||
|
$response = new JsonResponse($this->matches);
|
||||||
|
return $response;
|
||||||
|
|
||||||
|
// return array(
|
||||||
|
// "#markup" => "autocomplete"
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* autocompleteQuery
|
||||||
|
*/
|
||||||
|
private function autocompleteQuery(){
|
||||||
|
|
||||||
|
// TODO: get the sapi index id with settings
|
||||||
|
/* @var $sapi_index \Drupal\search_api\IndexInterface */
|
||||||
|
$sapi_index = Index::load($this->sapi_index_id);
|
||||||
|
// dpm($sapi_index);
|
||||||
|
|
||||||
|
// Create the query.
|
||||||
|
$query = $sapi_index->query();
|
||||||
|
|
||||||
|
$query->setSearchID('edlp_search:autocomplete');
|
||||||
|
|
||||||
|
$parse_mode = \Drupal::getContainer()
|
||||||
|
->get('plugin.manager.search_api.parse_mode')
|
||||||
|
->createInstance('direct');
|
||||||
|
$query->setParseMode($parse_mode);
|
||||||
|
|
||||||
|
// $query->range(0, 20);
|
||||||
|
|
||||||
|
// workflow
|
||||||
|
$wf_condition_group = $query->createConditionGroup('OR');
|
||||||
|
$wf_condition_group->addCondition('field_workflow', 'corpus_documents_publie', "=");
|
||||||
|
// TODO: add condition with the other workflow field
|
||||||
|
$query->addConditionGroup($wf_condition_group);
|
||||||
|
|
||||||
|
// Search for keys.
|
||||||
|
if (!empty($this->keys)) {
|
||||||
|
// dpm($this->keys);
|
||||||
|
$query->keys($this->keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
// select the field in which search will be performed
|
||||||
|
$query->setFulltextFields(array($this->field_name));
|
||||||
|
|
||||||
|
$result = $query->execute();
|
||||||
|
$items = $result->getResultItems();
|
||||||
|
|
||||||
|
$this->matches = [];
|
||||||
|
foreach ($items as $item) {
|
||||||
|
try {
|
||||||
|
/** @var \Drupal\Core\Entity\EntityInterface $entity */
|
||||||
|
$fields = $item->getField($this->field_name)->getValues();
|
||||||
|
}catch (SearchApiException $e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!$fields) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$field_text = $fields[0]->getText();
|
||||||
|
|
||||||
|
if( in_array($field_text, $this->matches) ){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->matches[] = $field_text;
|
||||||
|
|
||||||
|
if(count($this->matches) > 14){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// dpm($this->matches);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getRequestArgs
|
||||||
|
*/
|
||||||
|
private function getRequestAutocompleteArgs(){
|
||||||
|
// dpm($this->request);
|
||||||
|
$this->field_name = $this->request->query->get('field_name');
|
||||||
|
$this->keys = $this->request->query->get('q');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* searchResults
|
* searchResults
|
||||||
*/
|
*/
|
||||||
@@ -85,7 +180,7 @@ class EdlpSearchController extends ControllerBase {
|
|||||||
|
|
||||||
$this->request = $request;
|
$this->request = $request;
|
||||||
|
|
||||||
// TODO: what if no results
|
$this->getRequestSearchArgs();
|
||||||
|
|
||||||
return $this->getrenderable();
|
return $this->getrenderable();
|
||||||
}
|
}
|
||||||
@@ -97,6 +192,8 @@ class EdlpSearchController extends ControllerBase {
|
|||||||
|
|
||||||
$this->request = $request;
|
$this->request = $request;
|
||||||
|
|
||||||
|
$this->getRequestSearchArgs();
|
||||||
|
|
||||||
$renderable = $this->getrenderable();
|
$renderable = $this->getrenderable();
|
||||||
$rendered = render($renderable);
|
$rendered = render($renderable);
|
||||||
|
|
||||||
@@ -106,8 +203,6 @@ class EdlpSearchController extends ControllerBase {
|
|||||||
$results_nids[] = $item->id();
|
$results_nids[] = $item->id();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: what if no results
|
|
||||||
|
|
||||||
$response = new JsonResponse();
|
$response = new JsonResponse();
|
||||||
$response->setData([
|
$response->setData([
|
||||||
'test'=>'search results',
|
'test'=>'search results',
|
||||||
@@ -151,11 +246,9 @@ class EdlpSearchController extends ControllerBase {
|
|||||||
*/
|
*/
|
||||||
private function query(){
|
private function query(){
|
||||||
|
|
||||||
$this->getRequestArgs();
|
|
||||||
|
|
||||||
// TODO: get the sapi index id with settings
|
// TODO: get the sapi index id with settings
|
||||||
/* @var $sapi_index \Drupal\search_api\IndexInterface */
|
/* @var $sapi_index \Drupal\search_api\IndexInterface */
|
||||||
$sapi_index = Index::load('collection');
|
$sapi_index = Index::load($this->sapi_index_id);
|
||||||
// dpm($sapi_index);
|
// dpm($sapi_index);
|
||||||
|
|
||||||
// Create the query.
|
// Create the query.
|
||||||
@@ -222,7 +315,8 @@ class EdlpSearchController extends ControllerBase {
|
|||||||
/**
|
/**
|
||||||
* getRequestArgs
|
* getRequestArgs
|
||||||
*/
|
*/
|
||||||
private function getRequestArgs(){
|
private function getRequestSearchArgs(){
|
||||||
|
// dpm($this->request);
|
||||||
$this->keys = $this->request->query->get('keys');
|
$this->keys = $this->request->query->get('keys');
|
||||||
$this->entries = $this->request->query->get('entries');
|
$this->entries = $this->request->query->get('entries');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,26 @@ class EdlpSearchForm extends FormBase {
|
|||||||
'#weight' => '0',
|
'#weight' => '0',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
$form['language'] = [
|
||||||
|
'#type' => 'textfield',
|
||||||
|
'#title' => $this->t('Language'),
|
||||||
|
'#autocomplete_route_name' => 'edlp_search.edlp_search_controller_autocomplete',
|
||||||
|
'#autocomplete_route_parameters' => array('field_name' => 'field_langues'),
|
||||||
|
'#maxlength' => 64,
|
||||||
|
'#size' => 15,
|
||||||
|
'#weight' => '0',
|
||||||
|
];
|
||||||
|
|
||||||
|
$form['genres'] = [
|
||||||
|
'#type' => 'textfield',
|
||||||
|
'#title' => $this->t('Genres'),
|
||||||
|
'#autocomplete_route_name' => 'edlp_search.edlp_search_controller_autocomplete',
|
||||||
|
'#autocomplete_route_parameters' => array('field_name' => 'field_genres'),
|
||||||
|
'#maxlength' => 64,
|
||||||
|
'#size' => 15,
|
||||||
|
'#weight' => '0',
|
||||||
|
];
|
||||||
|
|
||||||
$this->getEntries();
|
$this->getEntries();
|
||||||
|
|
||||||
$form['entries'] = [
|
$form['entries'] = [
|
||||||
|
|||||||
Reference in New Issue
Block a user