annotate core/modules/user/src/Plugin/Search/UserSearch.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\user\Plugin\Search;
Chris@0 4
Chris@0 5 use Drupal\Core\Access\AccessResult;
Chris@0 6 use Drupal\Core\Database\Connection;
Chris@0 7 use Drupal\Core\Entity\EntityManagerInterface;
Chris@0 8 use Drupal\Core\Extension\ModuleHandlerInterface;
Chris@0 9 use Drupal\Core\Session\AccountInterface;
Chris@0 10 use Drupal\Core\Access\AccessibleInterface;
Chris@0 11 use Drupal\search\Plugin\SearchPluginBase;
Chris@0 12 use Symfony\Component\DependencyInjection\ContainerInterface;
Chris@0 13
Chris@0 14 /**
Chris@0 15 * Executes a keyword search for users against the {users} database table.
Chris@0 16 *
Chris@0 17 * @SearchPlugin(
Chris@0 18 * id = "user_search",
Chris@0 19 * title = @Translation("Users")
Chris@0 20 * )
Chris@0 21 */
Chris@0 22 class UserSearch extends SearchPluginBase implements AccessibleInterface {
Chris@0 23
Chris@0 24 /**
Chris@0 25 * The database connection.
Chris@0 26 *
Chris@0 27 * @var \Drupal\Core\Database\Connection
Chris@0 28 */
Chris@0 29 protected $database;
Chris@0 30
Chris@0 31 /**
Chris@0 32 * The entity manager.
Chris@0 33 *
Chris@0 34 * @var \Drupal\Core\Entity\EntityManagerInterface
Chris@0 35 */
Chris@0 36 protected $entityManager;
Chris@0 37
Chris@0 38 /**
Chris@0 39 * The module handler.
Chris@0 40 *
Chris@0 41 * @var \Drupal\Core\Extension\ModuleHandlerInterface
Chris@0 42 */
Chris@0 43 protected $moduleHandler;
Chris@0 44
Chris@0 45 /**
Chris@0 46 * The current user.
Chris@0 47 *
Chris@0 48 * @var \Drupal\Core\Session\AccountInterface
Chris@0 49 */
Chris@0 50 protected $currentUser;
Chris@0 51
Chris@0 52 /**
Chris@0 53 * {@inheritdoc}
Chris@0 54 */
Chris@0 55 public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
Chris@0 56 return new static(
Chris@0 57 $container->get('database'),
Chris@0 58 $container->get('entity.manager'),
Chris@0 59 $container->get('module_handler'),
Chris@0 60 $container->get('current_user'),
Chris@0 61 $configuration,
Chris@0 62 $plugin_id,
Chris@0 63 $plugin_definition
Chris@0 64 );
Chris@0 65 }
Chris@0 66
Chris@0 67 /**
Chris@0 68 * Creates a UserSearch object.
Chris@0 69 *
Chris@12 70 * @param \Drupal\Core\Database\Connection $database
Chris@0 71 * The database connection.
Chris@0 72 * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
Chris@0 73 * The entity manager.
Chris@12 74 * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
Chris@0 75 * The module handler.
Chris@0 76 * @param \Drupal\Core\Session\AccountInterface $current_user
Chris@0 77 * The current user.
Chris@0 78 * @param array $configuration
Chris@0 79 * A configuration array containing information about the plugin instance.
Chris@0 80 * @param string $plugin_id
Chris@0 81 * The plugin_id for the plugin instance.
Chris@0 82 * @param mixed $plugin_definition
Chris@0 83 * The plugin implementation definition.
Chris@0 84 */
Chris@0 85 public function __construct(Connection $database, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler, AccountInterface $current_user, array $configuration, $plugin_id, $plugin_definition) {
Chris@0 86 $this->database = $database;
Chris@0 87 $this->entityManager = $entity_manager;
Chris@0 88 $this->moduleHandler = $module_handler;
Chris@0 89 $this->currentUser = $current_user;
Chris@0 90 parent::__construct($configuration, $plugin_id, $plugin_definition);
Chris@0 91
Chris@0 92 $this->addCacheTags(['user_list']);
Chris@0 93 }
Chris@0 94
Chris@0 95 /**
Chris@0 96 * {@inheritdoc}
Chris@0 97 */
Chris@0 98 public function access($operation = 'view', AccountInterface $account = NULL, $return_as_object = FALSE) {
Chris@0 99 $result = AccessResult::allowedIf(!empty($account) && $account->hasPermission('access user profiles'))->cachePerPermissions();
Chris@0 100 return $return_as_object ? $result : $result->isAllowed();
Chris@0 101 }
Chris@0 102
Chris@0 103 /**
Chris@0 104 * {@inheritdoc}
Chris@0 105 */
Chris@0 106 public function execute() {
Chris@0 107 $results = [];
Chris@0 108 if (!$this->isSearchExecutable()) {
Chris@0 109 return $results;
Chris@0 110 }
Chris@0 111
Chris@0 112 // Process the keywords.
Chris@0 113 $keys = $this->keywords;
Chris@0 114 // Escape for LIKE matching.
Chris@0 115 $keys = $this->database->escapeLike($keys);
Chris@0 116 // Replace wildcards with MySQL/PostgreSQL wildcards.
Chris@0 117 $keys = preg_replace('!\*+!', '%', $keys);
Chris@0 118
Chris@0 119 // Run the query to find matching users.
Chris@0 120 $query = $this->database
Chris@0 121 ->select('users_field_data', 'users')
Chris@0 122 ->extend('Drupal\Core\Database\Query\PagerSelectExtender');
Chris@0 123 $query->fields('users', ['uid']);
Chris@0 124 $query->condition('default_langcode', 1);
Chris@0 125 if ($this->currentUser->hasPermission('administer users')) {
Chris@0 126 // Administrators can also search in the otherwise private email field,
Chris@0 127 // and they don't need to be restricted to only active users.
Chris@0 128 $query->fields('users', ['mail']);
Chris@0 129 $query->condition($query->orConditionGroup()
Chris@0 130 ->condition('name', '%' . $keys . '%', 'LIKE')
Chris@0 131 ->condition('mail', '%' . $keys . '%', 'LIKE')
Chris@0 132 );
Chris@0 133 }
Chris@0 134 else {
Chris@0 135 // Regular users can only search via usernames, and we do not show them
Chris@0 136 // blocked accounts.
Chris@0 137 $query->condition('name', '%' . $keys . '%', 'LIKE')
Chris@0 138 ->condition('status', 1);
Chris@0 139 }
Chris@0 140 $uids = $query
Chris@0 141 ->limit(15)
Chris@0 142 ->execute()
Chris@0 143 ->fetchCol();
Chris@0 144 $accounts = $this->entityManager->getStorage('user')->loadMultiple($uids);
Chris@0 145
Chris@0 146 foreach ($accounts as $account) {
Chris@0 147 $result = [
Chris@0 148 'title' => $account->getDisplayName(),
Chris@18 149 'link' => $account->toUrl('canonical', ['absolute' => TRUE])->toString(),
Chris@0 150 ];
Chris@0 151 if ($this->currentUser->hasPermission('administer users')) {
Chris@0 152 $result['title'] .= ' (' . $account->getEmail() . ')';
Chris@0 153 }
Chris@0 154 $this->addCacheableDependency($account);
Chris@0 155 $results[] = $result;
Chris@0 156 }
Chris@0 157
Chris@0 158 return $results;
Chris@0 159 }
Chris@0 160
Chris@0 161 /**
Chris@0 162 * {@inheritdoc}
Chris@0 163 */
Chris@0 164 public function getHelp() {
Chris@0 165 $help = [
Chris@0 166 'list' => [
Chris@0 167 '#theme' => 'item_list',
Chris@0 168 '#items' => [
Chris@0 169 $this->t('User search looks for user names and partial user names. Example: mar would match usernames mar, delmar, and maryjane.'),
Chris@0 170 $this->t('You can use * as a wildcard within your keyword. Example: m*r would match user names mar, delmar, and elementary.'),
Chris@0 171 ],
Chris@0 172 ],
Chris@0 173 ];
Chris@0 174
Chris@0 175 return $help;
Chris@0 176 }
Chris@0 177
Chris@0 178 }