function UserSearch::execute

Same name and namespace in other branches
  1. 9 core/modules/user/src/Plugin/Search/UserSearch.php \Drupal\user\Plugin\Search\UserSearch::execute()
  2. 8.9.x core/modules/user/src/Plugin/Search/UserSearch.php \Drupal\user\Plugin\Search\UserSearch::execute()
  3. 11.x core/modules/user/src/Plugin/Search/UserSearch.php \Drupal\user\Plugin\Search\UserSearch::execute()

Executes the search.

Return value

array A structured list of search results.

Overrides SearchInterface::execute

File

core/modules/user/src/Plugin/Search/UserSearch.php, line 108

Class

UserSearch
Executes a keyword search for users against the {users} database table.

Namespace

Drupal\user\Plugin\Search

Code

public function execute() {
  $results = [];
  if (!$this->isSearchExecutable()) {
    return $results;
  }
  // Process the keywords.
  $keys = $this->keywords;
  // Escape for LIKE matching.
  $keys = $this->database
    ->escapeLike($keys);
  // Replace wildcards with MySQL/PostgreSQL wildcards.
  $keys = preg_replace('!\\*+!', '%', $keys);
  // Run the query to find matching users.
  $query = $this->database
    ->select('users_field_data', 'users')
    ->extend(PagerSelectExtender::class);
  $query->fields('users', [
    'uid',
  ]);
  $query->condition('default_langcode', 1);
  if ($this->currentUser
    ->hasPermission('administer users')) {
    // Administrators can also search in the otherwise private email field,
    // and they don't need to be restricted to only active users.
    $query->fields('users', [
      'mail',
    ]);
    $query->condition($query->orConditionGroup()
      ->condition('name', '%' . $keys . '%', 'LIKE')
      ->condition('mail', '%' . $keys . '%', 'LIKE'));
  }
  else {
    // Regular users can only search via usernames, and we do not show them
    // blocked accounts.
    $query->condition('name', '%' . $keys . '%', 'LIKE')
      ->condition('status', 1);
  }
  $uids = $query->limit(15)
    ->execute()
    ->fetchCol();
  $accounts = $this->entityTypeManager
    ->getStorage('user')
    ->loadMultiple($uids);
  foreach ($accounts as $account) {
    $result = [
      'title' => $account->getDisplayName(),
      'link' => $account->toUrl('canonical', [
        'absolute' => TRUE,
      ])
        ->toString(),
    ];
    if ($this->currentUser
      ->hasPermission('administer users')) {
      $result['title'] .= ' (' . $account->getEmail() . ')';
    }
    $this->addCacheableDependency($account);
    $results[] = $result;
  }
  return $results;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.