You are here

public function AutocompleteController::handleAutocomplete in Font Awesome Icons 8.2

Handler for autocomplete request.

1 string reference to 'AutocompleteController::handleAutocomplete'
fontawesome.routing.yml in ./fontawesome.routing.yml
fontawesome.routing.yml

File

src/Controller/AutocompleteController.php, line 53

Class

AutocompleteController
Defines a route controller for entity autocomplete form elements.

Namespace

Drupal\fontawesome\Controller

Code

public function handleAutocomplete(Request $request) {
  $results = [];

  // Get the typed string from the URL, if it exists.
  if ($input = $request->query
    ->get('q')) {
    $typed_string = Tags::explode($input);
    $typed_string = mb_strtolower(array_pop($typed_string));

    // Load the icon data so we can check for a valid icon.
    $iconData = $this->fontAwesomeManager
      ->getIconsWithCategories();

    // Load the configuration settings.
    $configuration_settings = $this->configFactory
      ->get('fontawesome.settings');

    // Determine which files we are using.
    $activeFiles = [
      'use_solid_file' => is_null($configuration_settings
        ->get('use_solid_file')) === TRUE ? TRUE : $configuration_settings
        ->get('use_solid_file'),
      'use_regular_file' => is_null($configuration_settings
        ->get('use_regular_file')) === TRUE ? TRUE : $configuration_settings
        ->get('use_regular_file'),
      'use_light_file' => is_null($configuration_settings
        ->get('use_light_file')) === TRUE ? TRUE : $configuration_settings
        ->get('use_light_file'),
      'use_brands_file' => is_null($configuration_settings
        ->get('use_brands_file')) === TRUE ? TRUE : $configuration_settings
        ->get('use_brands_file'),
      'use_duotone_file' => is_null($configuration_settings
        ->get('use_duotone_file')) === TRUE ? TRUE : $configuration_settings
        ->get('use_duotone_file'),
    ];

    // Check each icon to see if it starts with the typed string.
    foreach ($iconData as $thisIcon) {

      // If the string is found.
      if (strpos($thisIcon['name'], $typed_string) === 0 || in_array($typed_string, $thisIcon['search_terms'])) {
        $iconRenders = [];

        // Loop over each style.
        foreach ($thisIcon['styles'] as $style) {

          // Determine the prefix.
          $iconPrefix = '';
          switch ($style) {
            case 'brands':

              // Don't show if unavailable.
              if (!$activeFiles['use_brands_file']) {
                break;
              }
              $iconPrefix = 'fab';
              break;
            case 'light':

              // Don't show if unavailable.
              if (!$activeFiles['use_light_file']) {
                break;
              }
              $iconPrefix = 'fal';
              break;
            case 'regular':

              // Don't show if unavailable.
              if (!$activeFiles['use_regular_file']) {
                break;
              }
              $iconPrefix = 'far';
              break;
            case 'duotone':

              // Don't show if unavailable.
              if (!$activeFiles['use_duotone_file']) {
                break;
              }
              $iconPrefix = 'fad';
              break;
            case 'kit_uploads':
              $iconPrefix = 'fak';
              break;
            default:
            case 'solid':

              // Don't show if unavailable.
              if (!$activeFiles['use_solid_file']) {
                break;
              }
              $iconPrefix = 'fas';
              break;
          }

          // Render the icon.
          if (!empty($iconPrefix)) {
            $iconRenders[] = new FormattableMarkup('<i class=":prefix fa-:icon fa-fw fa-2x"></i> ', [
              ':prefix' => $iconPrefix,
              ':icon' => $thisIcon['name'],
            ]);
          }
        }

        // Don't show if we have no available icons.
        if (count($iconRenders) == 0) {
          continue;
        }
        $results[] = [
          'value' => $thisIcon['name'],
          'label' => implode('', $iconRenders) . $thisIcon['name'],
        ];
      }
    }
  }
  return new JsonResponse($results);
}