You are here

function search_api_saved_searches_tokens in Search API Saved Searches 8

Same name and namespace in other branches
  1. 7 search_api_saved_searches.tokens.inc \search_api_saved_searches_tokens()

Implements hook_tokens().

File

./search_api_saved_searches.tokens.inc, line 91
Builds placeholder replacement tokens for saved searches.

Code

function search_api_saved_searches_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
  $token_service = \Drupal::token();
  $url_options = [
    'absolute' => TRUE,
  ];
  if (isset($options['langcode'])) {
    $url_options['language'] = \Drupal::languageManager()
      ->getLanguage($options['langcode']);
    $langcode = $options['langcode'];
  }
  else {
    $langcode = NULL;
  }
  $replacements = [];
  if ($type === 'user' && !empty($data['user'])) {

    /** @var \Drupal\user\UserInterface $user */
    $user = $data['user'];
    if (isset($tokens['search-api-saved-searches-url'])) {
      $original = $tokens['search-api-saved-searches-url'];
      $replacements[$original] = '';
      try {
        $params = [
          'user' => $user
            ->id(),
        ];
        $url = Url::fromRoute('view.saved_searches.page', $params, $url_options);
        $replacements[$original] = $url;
      } catch (\Exception $e) {

        // This will happen when the user deleted the view, or when Views isn't
        // installed – none of which is an error.
      }
    }
  }
  if ($type === 'search-api-saved-search' && !empty($data['search_api_saved_search'])) {

    /** @var \Drupal\search_api_saved_searches\SavedSearchInterface $search */
    $search = $data['search_api_saved_search'];
    foreach ($tokens as $name => $original) {
      try {
        switch ($name) {
          case 'id':
            $replacements[$original] = $search
              ->id();
            break;
          case 'label':
            $replacements[$original] = $search
              ->label();
            break;

          // Default values for the chained tokens handled below.
          case 'owner':
            $account = $search
              ->getOwner() ?: User::load(0);
            $replacements[$original] = $account
              ->label();
            $bubbleable_metadata
              ->addCacheableDependency($account);
            break;

          // Default values for the chained tokens handled below.
          case 'created':
            $created = $search
              ->get('created')->value;
            $replacements[$original] = \Drupal::getContainer()
              ->get('date.formatter')
              ->format($created, 'medium', '', NULL, $langcode);
            break;
          case 'view-url':
            $url = $search
              ->toUrl('canonical', $url_options);
            $replacements[$original] = $url
              ->toString();
            break;
          case 'activate-url':
            $url = $search
              ->toUrl('activate', $url_options);
            $replacements[$original] = $url
              ->toString();
            break;
          case 'edit-url':
            $url = $search
              ->toUrl('edit-form', $url_options);
            $replacements[$original] = $url
              ->toString();
            break;
          case 'delete-url':
            $url = $search
              ->toUrl('delete-form', $url_options);
            $replacements[$original] = $url
              ->toString();
            break;
        }
      } catch (\Exception $e) {
        watchdog_exception('search_api_saved_searches', $e, '%type while generating replacement tokens: @message in %function (line %line of %file).');
      }
    }
    $author_tokens = $token_service
      ->findWithPrefix($tokens, 'owner');
    if ($author_tokens) {
      $replacements += $token_service
        ->generate('user', $author_tokens, [
        'user' => $search
          ->getOwner(),
      ], $options, $bubbleable_metadata);
    }
    $created_tokens = $token_service
      ->findWithPrefix($tokens, 'created');
    if ($created_tokens) {
      $created = $search
        ->get('created')->value;
      $replacements += $token_service
        ->generate('date', $created_tokens, [
        'date' => $created,
      ], $options, $bubbleable_metadata);
    }
  }
  if ($type === 'search-api-saved-search-results' && !empty($data['search_api_results'])) {

    /** @var \Drupal\search_api\Query\ResultSetInterface $results */
    $results = $data['search_api_results'];
    foreach ($tokens as $name => $original) {
      switch ($name) {
        case 'count':
          $replacements[$original] = $results
            ->getResultCount();
          break;
        case 'links':
          $links = [];
          foreach ($results
            ->getResultItems() as $item) {
            try {
              $datasource = $item
                ->getDatasource();
              $object = $item
                ->getOriginalObject();
              $label = $datasource
                ->getItemLabel($object) ?: $item
                ->getId();
              $url = $datasource
                ->getItemUrl($object);
              if ($url) {
                $url
                  ->setAbsolute(TRUE);
                $label .= "\n  " . $url
                  ->toString();
              }
              $links[] = "- {$label}";
            } catch (SearchApiException $e) {
              watchdog_exception('search_api_saved_searches', $e, '%type while generating replacement tokens: @message in %function (line %line of %file).');
            }
          }
          $replacements[$original] = implode("\n", $links);
          break;
      }
    }
  }
  return $replacements;
}