devel_wizard-2.x-dev/src/Controller/AutocompleteBase.php

src/Controller/AutocompleteBase.php
<?php

declare(strict_types=1);

namespace Drupal\devel_wizard\Controller;

use Drupal\Core\Controller\ControllerBase;
use Fuse\Fuse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;

abstract class AutocompleteBase extends ControllerBase {

  protected int $minKeywordLength = 3;

  /**
   * @abstract
   */
  protected function getFuzzyOptions(): array {
    return [
      'keys' => [],
      'threshold' => 0.5,
      'includeScore' => TRUE,
      'shouldSort' => TRUE,
      'limit' => 20,
    ];
  }

  public function body(Request $request) {
    $keyword = mb_strtolower($request->query->get('q', ''));
    $items = mb_strlen($keyword) >= $this->minKeywordLength ?
      $this->getAutocompleteItems($keyword)
      : [];

    return new JsonResponse($items);
  }

  protected function getAutocompleteItems(string $keyword): array {
    $fuse = new Fuse(
      $this->getFuzzyDocuments($keyword),
      $this->getFuzzyOptions(),
    );
    $items = [];
    foreach ($fuse->search($keyword) as $result) {
      $items[] = $this->convertFuzzyResultToAutocompleteItem($result);
    }

    return $items;
  }

  abstract protected function getFuzzyDocuments(string $keyword): array;

  abstract protected function convertEntryToFuzzyDocument(array $entry): array;

  abstract protected function convertFuzzyResultToAutocompleteItem(array $result): array;

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc