You are here

public function WebformElementController::autocomplete in Webform 8.5

Same name and namespace in other branches
  1. 6.x src/Controller/WebformElementController.php \Drupal\webform\Controller\WebformElementController::autocomplete()

Returns response for the element autocomplete route.

Parameters

\Symfony\Component\HttpFoundation\Request $request: The current request object containing the search string.

\Drupal\webform\WebformInterface $webform: A webform.

string $key: Webform element key.

Return value

\Symfony\Component\HttpFoundation\JsonResponse A JSON response containing the autocomplete suggestions.

1 string reference to 'WebformElementController::autocomplete'
webform.routing.yml in ./webform.routing.yml
webform.routing.yml

File

src/Controller/WebformElementController.php, line 56

Class

WebformElementController
Provides route responses for Webform elements.

Namespace

Drupal\webform\Controller

Code

public function autocomplete(Request $request, WebformInterface $webform, $key) {

  // Get autocomplete query.
  $q = $request->query
    ->get('q') ?: '';
  if ($q === '') {
    return new JsonResponse([]);
  }

  // Get the initialized webform element.
  $element = $webform
    ->getElement($key);
  if (!$element) {
    return new JsonResponse([]);
  }

  // Set default autocomplete properties.
  $element += [
    '#autocomplete_existing' => FALSE,
    '#autocomplete_items' => [],
    '#autocomplete_match' => 3,
    '#autocomplete_limit' => 10,
    '#autocomplete_match_operator' => 'CONTAINS',
  ];

  // Check minimum number of characters.
  if (mb_strlen($q) < (int) $element['#autocomplete_match']) {
    return new JsonResponse([]);
  }
  $matches = [];

  // Get existing matches.
  if (!empty($element['#autocomplete_existing'])) {
    $matches += $this
      ->getMatchesFromExistingValues($q, $webform
      ->id(), $key, $element['#autocomplete_match_operator'], $element['#autocomplete_limit']);
  }

  // Get items (aka options) matches.
  if (!empty($element['#autocomplete_items'])) {
    $element['#options'] = $element['#autocomplete_items'];
    $options = WebformOptions::getElementOptions($element);
    $matches += $this
      ->getMatchesFromOptions($q, $options, $element['#autocomplete_match_operator'], $element['#autocomplete_limit']);
  }

  // Sort matches by label and enforce the limit.
  if ($matches) {
    uasort($matches, function (array $a, array $b) {
      return $a['label'] > $b['label'];
    });
    $matches = array_values($matches);
    $matches = array_slice($matches, 0, $element['#autocomplete_limit']);
  }
  return new JsonResponse($matches);
}