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 }
|