Chris@0: get('database'), Chris@0: $container->get('entity.manager'), Chris@0: $container->get('module_handler'), Chris@0: $container->get('current_user'), Chris@0: $configuration, Chris@0: $plugin_id, Chris@0: $plugin_definition Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Creates a UserSearch object. Chris@0: * Chris@12: * @param \Drupal\Core\Database\Connection $database Chris@0: * The database connection. Chris@0: * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager Chris@0: * The entity manager. Chris@12: * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler Chris@0: * The module handler. Chris@0: * @param \Drupal\Core\Session\AccountInterface $current_user Chris@0: * The current user. Chris@0: * @param array $configuration Chris@0: * A configuration array containing information about the plugin instance. Chris@0: * @param string $plugin_id Chris@0: * The plugin_id for the plugin instance. Chris@0: * @param mixed $plugin_definition Chris@0: * The plugin implementation definition. Chris@0: */ Chris@0: public function __construct(Connection $database, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler, AccountInterface $current_user, array $configuration, $plugin_id, $plugin_definition) { Chris@0: $this->database = $database; Chris@0: $this->entityManager = $entity_manager; Chris@0: $this->moduleHandler = $module_handler; Chris@0: $this->currentUser = $current_user; Chris@0: parent::__construct($configuration, $plugin_id, $plugin_definition); Chris@0: Chris@0: $this->addCacheTags(['user_list']); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function access($operation = 'view', AccountInterface $account = NULL, $return_as_object = FALSE) { Chris@0: $result = AccessResult::allowedIf(!empty($account) && $account->hasPermission('access user profiles'))->cachePerPermissions(); Chris@0: return $return_as_object ? $result : $result->isAllowed(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function execute() { Chris@0: $results = []; Chris@0: if (!$this->isSearchExecutable()) { Chris@0: return $results; Chris@0: } Chris@0: Chris@0: // Process the keywords. Chris@0: $keys = $this->keywords; Chris@0: // Escape for LIKE matching. Chris@0: $keys = $this->database->escapeLike($keys); Chris@0: // Replace wildcards with MySQL/PostgreSQL wildcards. Chris@0: $keys = preg_replace('!\*+!', '%', $keys); Chris@0: Chris@0: // Run the query to find matching users. Chris@0: $query = $this->database Chris@0: ->select('users_field_data', 'users') Chris@0: ->extend('Drupal\Core\Database\Query\PagerSelectExtender'); Chris@0: $query->fields('users', ['uid']); Chris@0: $query->condition('default_langcode', 1); Chris@0: if ($this->currentUser->hasPermission('administer users')) { Chris@0: // Administrators can also search in the otherwise private email field, Chris@0: // and they don't need to be restricted to only active users. Chris@0: $query->fields('users', ['mail']); Chris@0: $query->condition($query->orConditionGroup() Chris@0: ->condition('name', '%' . $keys . '%', 'LIKE') Chris@0: ->condition('mail', '%' . $keys . '%', 'LIKE') Chris@0: ); Chris@0: } Chris@0: else { Chris@0: // Regular users can only search via usernames, and we do not show them Chris@0: // blocked accounts. Chris@0: $query->condition('name', '%' . $keys . '%', 'LIKE') Chris@0: ->condition('status', 1); Chris@0: } Chris@0: $uids = $query Chris@0: ->limit(15) Chris@0: ->execute() Chris@0: ->fetchCol(); Chris@0: $accounts = $this->entityManager->getStorage('user')->loadMultiple($uids); Chris@0: Chris@0: foreach ($accounts as $account) { Chris@0: $result = [ Chris@0: 'title' => $account->getDisplayName(), Chris@18: 'link' => $account->toUrl('canonical', ['absolute' => TRUE])->toString(), Chris@0: ]; Chris@0: if ($this->currentUser->hasPermission('administer users')) { Chris@0: $result['title'] .= ' (' . $account->getEmail() . ')'; Chris@0: } Chris@0: $this->addCacheableDependency($account); Chris@0: $results[] = $result; Chris@0: } Chris@0: Chris@0: return $results; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getHelp() { Chris@0: $help = [ Chris@0: 'list' => [ Chris@0: '#theme' => 'item_list', Chris@0: '#items' => [ Chris@0: $this->t('User search looks for user names and partial user names. Example: mar would match usernames mar, delmar, and maryjane.'), Chris@0: $this->t('You can use * as a wildcard within your keyword. Example: m*r would match user names mar, delmar, and elementary.'), Chris@0: ], Chris@0: ], Chris@0: ]; Chris@0: Chris@0: return $help; Chris@0: } Chris@0: Chris@0: }