draft of materio_sapi autocomplete
This commit is contained in:
		@@ -44,6 +44,8 @@
 | 
			
		||||
        "drupal/migrate_tools": "4.x-dev",
 | 
			
		||||
        "drupal/mimemail": "1.x-dev",
 | 
			
		||||
        "drupal/restui": "^1.16",
 | 
			
		||||
        "drupal/search_api_autocomplete": "^1.2",
 | 
			
		||||
        "drupal/search_api_page": "1.x-dev",
 | 
			
		||||
        "drupal/search_api_solr": "^3.0",
 | 
			
		||||
        "drupal/select_translation": "1.x-dev",
 | 
			
		||||
        "drupal/simplenews": "1.x-dev",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										114
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										114
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
 | 
			
		||||
        "This file is @generated automatically"
 | 
			
		||||
    ],
 | 
			
		||||
    "content-hash": "5b5c2c51bef1aa5e0078a95dafa3e5b5",
 | 
			
		||||
    "content-hash": "8a8cacad3f133bac4dc306fda59b40d7",
 | 
			
		||||
    "packages": [
 | 
			
		||||
        {
 | 
			
		||||
            "name": "alchemy/zippy",
 | 
			
		||||
@@ -8554,6 +8554,63 @@
 | 
			
		||||
                "irc": "irc://irc.freenode.org/drupal-search-api"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "drupal/search_api_autocomplete",
 | 
			
		||||
            "version": "1.2.0",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://git.drupalcode.org/project/search_api_autocomplete.git",
 | 
			
		||||
                "reference": "8.x-1.2"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://ftp.drupal.org/files/projects/search_api_autocomplete-8.x-1.2.zip",
 | 
			
		||||
                "reference": "8.x-1.2",
 | 
			
		||||
                "shasum": "606908583c1e0aff57a4215355d1d3e07a1d50d2"
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "drupal/core": "~8.0",
 | 
			
		||||
                "drupal/search_api": "1.x"
 | 
			
		||||
            },
 | 
			
		||||
            "require-dev": {
 | 
			
		||||
                "drupal/search_api_page": "@dev"
 | 
			
		||||
            },
 | 
			
		||||
            "type": "drupal-module",
 | 
			
		||||
            "extra": {
 | 
			
		||||
                "branch-alias": {
 | 
			
		||||
                    "dev-1.x": "1.x-dev"
 | 
			
		||||
                },
 | 
			
		||||
                "drupal": {
 | 
			
		||||
                    "version": "8.x-1.2",
 | 
			
		||||
                    "datestamp": "1552333980",
 | 
			
		||||
                    "security-coverage": {
 | 
			
		||||
                        "status": "covered",
 | 
			
		||||
                        "message": "Covered by Drupal's security advisory policy"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "notification-url": "https://packages.drupal.org/8/downloads",
 | 
			
		||||
            "license": [
 | 
			
		||||
                "GPL-2.0+"
 | 
			
		||||
            ],
 | 
			
		||||
            "authors": [
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "Thomas Seidl",
 | 
			
		||||
                    "homepage": "https://www.drupal.org/u/drunken-monkey"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "See other contributors",
 | 
			
		||||
                    "homepage": "https://www.drupal.org/node/1142202/committers"
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "description": "Adds autocomplete functionality to searches.",
 | 
			
		||||
            "homepage": "https://www.drupal.org/project/search_api_autocomplete",
 | 
			
		||||
            "support": {
 | 
			
		||||
                "source": "http://git.drupal.org/project/search_api_autocomplete.git",
 | 
			
		||||
                "issues": "https://www.drupal.org/project/issues/search_api_autocomplete",
 | 
			
		||||
                "irc": "irc://irc.freenode.org/drupal-search-api"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "drupal/search_api_db",
 | 
			
		||||
            "version": "1.13.0",
 | 
			
		||||
@@ -8599,6 +8656,60 @@
 | 
			
		||||
                "source": "https://git.drupalcode.org/project/search_api"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "drupal/search_api_page",
 | 
			
		||||
            "version": "dev-1.x",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://git.drupalcode.org/project/search_api_page.git",
 | 
			
		||||
                "reference": "b0b4e96d85077722aaece1e2e48f1312352a90c4"
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "drupal/core": "~8.0",
 | 
			
		||||
                "drupal/search_api": "*"
 | 
			
		||||
            },
 | 
			
		||||
            "require-dev": {
 | 
			
		||||
                "drupal/facets": "*"
 | 
			
		||||
            },
 | 
			
		||||
            "type": "drupal-module",
 | 
			
		||||
            "extra": {
 | 
			
		||||
                "branch-alias": {
 | 
			
		||||
                    "dev-1.x": "1.x-dev"
 | 
			
		||||
                },
 | 
			
		||||
                "drupal": {
 | 
			
		||||
                    "version": "8.x-1.0-alpha12+4-dev",
 | 
			
		||||
                    "datestamp": "1557232081",
 | 
			
		||||
                    "security-coverage": {
 | 
			
		||||
                        "status": "not-covered",
 | 
			
		||||
                        "message": "Dev releases are not covered by Drupal security advisories."
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "notification-url": "https://packages.drupal.org/8/downloads",
 | 
			
		||||
            "license": [
 | 
			
		||||
                "GPL-2.0-or-later"
 | 
			
		||||
            ],
 | 
			
		||||
            "authors": [
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "borisson_",
 | 
			
		||||
                    "homepage": "https://www.drupal.org/user/2393360"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "drunken monkey",
 | 
			
		||||
                    "homepage": "https://www.drupal.org/user/205582"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "swentel",
 | 
			
		||||
                    "homepage": "https://www.drupal.org/user/107403"
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "description": "Create search pages using Search API indexes.",
 | 
			
		||||
            "homepage": "https://www.drupal.org/project/search_api_page",
 | 
			
		||||
            "support": {
 | 
			
		||||
                "source": "https://git.drupalcode.org/project/search_api_page"
 | 
			
		||||
            },
 | 
			
		||||
            "time": "2019-05-07T18:19:46+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "drupal/search_api_solr",
 | 
			
		||||
            "version": "3.0.0-beta4",
 | 
			
		||||
@@ -17074,6 +17185,7 @@
 | 
			
		||||
        "drupal/migrate_plus": 20,
 | 
			
		||||
        "drupal/migrate_tools": 20,
 | 
			
		||||
        "drupal/mimemail": 20,
 | 
			
		||||
        "drupal/search_api_page": 20,
 | 
			
		||||
        "drupal/select_translation": 20,
 | 
			
		||||
        "drupal/simplenews": 20,
 | 
			
		||||
        "drupal/telephone_formatter": 10,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										108
									
								
								config/sync/search_api.index.autocomplete.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								config/sync/search_api.index.autocomplete.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,108 @@
 | 
			
		||||
uuid: 89507e1b-4a2c-4e27-9e90-e3278f805e3b
 | 
			
		||||
langcode: en
 | 
			
		||||
status: true
 | 
			
		||||
dependencies:
 | 
			
		||||
  module:
 | 
			
		||||
    - search_api_solr
 | 
			
		||||
    - taxonomy
 | 
			
		||||
    - search_api
 | 
			
		||||
  config:
 | 
			
		||||
    - field.storage.taxonomy_term.field_synonyms
 | 
			
		||||
    - search_api.server.materio
 | 
			
		||||
third_party_settings:
 | 
			
		||||
  search_api_solr:
 | 
			
		||||
    finalize: false
 | 
			
		||||
    commit_before_finalize: false
 | 
			
		||||
    commit_after_finalize: false
 | 
			
		||||
    multilingual:
 | 
			
		||||
      limit_to_content_language: true
 | 
			
		||||
      include_language_independent: true
 | 
			
		||||
    highlighter:
 | 
			
		||||
      maxAnalyzedChars: 51200
 | 
			
		||||
      fragmenter: gap
 | 
			
		||||
      regex:
 | 
			
		||||
        slop: 0.5
 | 
			
		||||
        pattern: blank
 | 
			
		||||
        maxAnalyzedChars: 10000
 | 
			
		||||
      usePhraseHighlighter: true
 | 
			
		||||
      highlightMultiTerm: true
 | 
			
		||||
      preserveMulti: false
 | 
			
		||||
      highlight:
 | 
			
		||||
        mergeContiguous: false
 | 
			
		||||
        requireFieldMatch: false
 | 
			
		||||
        snippets: 3
 | 
			
		||||
        fragsize: 0
 | 
			
		||||
    advanced:
 | 
			
		||||
      index_prefix: ''
 | 
			
		||||
id: autocomplete
 | 
			
		||||
name: autocomplete
 | 
			
		||||
description: ''
 | 
			
		||||
read_only: false
 | 
			
		||||
field_settings:
 | 
			
		||||
  field_synonyms:
 | 
			
		||||
    label: Synonyms
 | 
			
		||||
    datasource_id: 'entity:taxonomy_term'
 | 
			
		||||
    property_path: field_synonyms
 | 
			
		||||
    type: 'solr_text_custom:ngram'
 | 
			
		||||
    dependencies:
 | 
			
		||||
      config:
 | 
			
		||||
        - field.storage.taxonomy_term.field_synonyms
 | 
			
		||||
  langcode:
 | 
			
		||||
    label: Language
 | 
			
		||||
    datasource_id: 'entity:taxonomy_term'
 | 
			
		||||
    property_path: langcode
 | 
			
		||||
    type: string
 | 
			
		||||
    dependencies:
 | 
			
		||||
      module:
 | 
			
		||||
        - taxonomy
 | 
			
		||||
  name:
 | 
			
		||||
    label: Name
 | 
			
		||||
    datasource_id: 'entity:taxonomy_term'
 | 
			
		||||
    property_path: name
 | 
			
		||||
    type: 'solr_text_custom:ngram'
 | 
			
		||||
    dependencies:
 | 
			
		||||
      module:
 | 
			
		||||
        - taxonomy
 | 
			
		||||
  status:
 | 
			
		||||
    label: Published
 | 
			
		||||
    datasource_id: 'entity:taxonomy_term'
 | 
			
		||||
    property_path: status
 | 
			
		||||
    type: boolean
 | 
			
		||||
    dependencies:
 | 
			
		||||
      module:
 | 
			
		||||
        - taxonomy
 | 
			
		||||
  tid:
 | 
			
		||||
    label: 'Term ID'
 | 
			
		||||
    datasource_id: 'entity:taxonomy_term'
 | 
			
		||||
    property_path: tid
 | 
			
		||||
    type: integer
 | 
			
		||||
    dependencies:
 | 
			
		||||
      module:
 | 
			
		||||
        - taxonomy
 | 
			
		||||
datasource_settings:
 | 
			
		||||
  'entity:taxonomy_term':
 | 
			
		||||
    bundles:
 | 
			
		||||
      default: false
 | 
			
		||||
      selected:
 | 
			
		||||
        - tags
 | 
			
		||||
        - thesaurus
 | 
			
		||||
    languages:
 | 
			
		||||
      default: false
 | 
			
		||||
      selected:
 | 
			
		||||
        - en
 | 
			
		||||
        - fr
 | 
			
		||||
processor_settings:
 | 
			
		||||
  add_url: {  }
 | 
			
		||||
  aggregated_field: {  }
 | 
			
		||||
  entity_status: {  }
 | 
			
		||||
  rendered_item: {  }
 | 
			
		||||
  solr_date_range:
 | 
			
		||||
    weights:
 | 
			
		||||
      preprocess_index: 0
 | 
			
		||||
tracker_settings:
 | 
			
		||||
  default:
 | 
			
		||||
    indexing_order: fifo
 | 
			
		||||
options:
 | 
			
		||||
  index_directly: true
 | 
			
		||||
  cron_limit: 50
 | 
			
		||||
server: materio
 | 
			
		||||
@@ -1,3 +1,10 @@
 | 
			
		||||
materio_sapi.search_autocomplete:
 | 
			
		||||
  path: '/materio_sapi/form/autocomplete'
 | 
			
		||||
  defaults:
 | 
			
		||||
    _controller: '\Drupal\materio_sapi\Controller\FormAutocomplete::Autocomplete'
 | 
			
		||||
    _format: json
 | 
			
		||||
  requirements:
 | 
			
		||||
    _permission: 'access materio search'
 | 
			
		||||
#
 | 
			
		||||
# materio_sapi.materio_sapi_search_form:
 | 
			
		||||
#   path: '/materio_sapi/form/materio_sapi_search'
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,88 @@
 | 
			
		||||
<?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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Defines a route controller for entity autocomplete form elements.
 | 
			
		||||
 */
 | 
			
		||||
class FormAutocomplete extends ControllerBase {
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Handler for autocomplete request.
 | 
			
		||||
   */
 | 
			
		||||
  public function autocomplete(Request $request) {
 | 
			
		||||
    // Get the typed string from the URL, if it exists.
 | 
			
		||||
    if ($input = $request->query->get('q')) {
 | 
			
		||||
      $typed_string = Tags::explode($input);
 | 
			
		||||
      $typed_string = Unicode::strtolower(array_pop($typed_string));
 | 
			
		||||
      // \Drupal::logger('materio_sapi')->notice($typed_string);
 | 
			
		||||
 | 
			
		||||
      $index = Index::load('autocomplete');
 | 
			
		||||
      $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(0, 10);
 | 
			
		||||
 | 
			
		||||
      // 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_autocomplete');
 | 
			
		||||
 | 
			
		||||
      // Execute the search.
 | 
			
		||||
      $results = $query->execute();
 | 
			
		||||
 | 
			
		||||
      // echo "Result count: {$results->getResultCount()}\n";
 | 
			
		||||
      // $ids = implode(', ', array_keys($results->getResultItems()));
 | 
			
		||||
      // echo "Returned IDs: $ids.\n";
 | 
			
		||||
 | 
			
		||||
      // $items = $results->getResultItems();
 | 
			
		||||
      // \Drupal::logger('materio_sapi')->notice($results->getResultCount());
 | 
			
		||||
      // \Drupal::logger('materio_sapi')->notice(implode(', ', array_keys($items)));
 | 
			
		||||
 | 
			
		||||
      $response = [];
 | 
			
		||||
      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));
 | 
			
		||||
        $tid = $result->getField('tid')->getValues()[0];
 | 
			
		||||
        $term_name = $result->getField('name')->getValues()[0]->getText();
 | 
			
		||||
        $response[] = [
 | 
			
		||||
          'value' => $tid,
 | 
			
		||||
          'label' => $term_name,
 | 
			
		||||
        ];
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return new JsonResponse($response);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -24,14 +24,18 @@ class MaterioSapiSearchForm extends FormBase {
 | 
			
		||||
  public function buildForm(array $form, FormStateInterface $form_state) {
 | 
			
		||||
    $form['search'] = [
 | 
			
		||||
      '#type' => 'textfield',
 | 
			
		||||
      '#title' => $this->t('Search'),
 | 
			
		||||
      // '#title' => $this->t('Search'),
 | 
			
		||||
      '#maxlength' => 64,
 | 
			
		||||
      '#size' => 64,
 | 
			
		||||
      '#size' => 25,
 | 
			
		||||
      '#weight' => '0',
 | 
			
		||||
      '#attributes' => [
 | 
			
		||||
        "placeholder" => $this->t('Search'),
 | 
			
		||||
      ],
 | 
			
		||||
      '#autocomplete_route_name' => 'materio_sapi.search_autocomplete',
 | 
			
		||||
    ];
 | 
			
		||||
    $form['submit'] = [
 | 
			
		||||
      '#type' => 'submit',
 | 
			
		||||
      '#value' => $this->t('Submit'),
 | 
			
		||||
      '#value' => $this->t('Search'),
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    return $form;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user