Можно ли использовать api Drupal для получения списка пользователей?


Я хотел бы получить список всех пользователей, которым была назначена определенная роль. Я мог бы написать свой собственный SQL, но я хотел бы использовать api как можно больше.

 6
Author: benlumley, 2009-07-26

8 answers

Как правило, для такого рода задач нет функций API Drupal (поиск объектов, соответствующих определенным критериям). Он, как правило, фокусируется на функциях CRUD с одним объектом в API; все остальное зависит от собственных навыков разработчика в области SQL.

Модуль Представления позволяет создавать списки пользователей, отфильтрованных по ролям, разрешениям и т. Д., Но это может быть излишним.

 5
Author: Eaton, 2009-07-26 13:05:17

Вы можете использовать entity_load для получения массива пользователей. Вот пример, который создаст список всех электронных писем для пользователей-администраторов (используется для отправки уведомлений)

<?php
$users = entity_load('user');
$emails = '';
foreach($users as $user) {
  if (array_key_exists(3, $user->roles)) {
    if (strlen($emails) > 0) {
      $emails .= ' ' . $user->mail;
    } else {
      $emails = $user->mail;
    }
  }
}
?>
 9
Author: Dmitry Trifonov, 2011-07-20 17:45:22

SQL, который работал для меня:

$users = "";
$result = db_query('SELECT users.name AS users_name FROM users users
      INNER JOIN users_roles users_roles ON users.uid = users_roles.uid
      WHERE users_roles.rid = 4');

while ($existing_user = db_fetch_object($result)) {
      if ($users != "") $users .= ", ";
      $users .= $existing_user->users_name; // or do whatever
}
echo $users;

Имейте в виду, что это для Drupal 6, и я не уверен в производительности этого для больших баз пользователей. Не уверен насчет Drupal 7.

 2
Author: joshmiller, 2011-01-20 19:44:54

Один из простых вариантов - использовать представления для создания SQL (отображается под самим представлением при нажатии кнопки предварительного просмотра) для вас, а затем использовать Уровень абстракции SQL Drupal для получения результатов, которые вам нужны, если вам нужно получить доступ к необработанным данным, а не отображать представление.

Это выглядело бы примерно так:

$result = db_query('SELECT users.uid AS uid,
   users.mail AS users_mail,
   users.name AS users_name
 FROM users users');
while ($existing_user = db_fetch_object($result)) {
    print_r($existing_user); // or do whatever
  }

Просто добавьте больше полей в представление, чтобы получить полный запрос.

 1
Author: bloke zero, 2009-11-20 17:21:51

Я не знаю ни о каком API, который мог бы помочь собирать пользователей по ролям. Вот вам ссылка, по которой вы можете что-то получить: http://drupal.org/node/82002 . Хотя это потрясающий сервис, который я предлагаю использовать drupal.org или канал #drupal на irc.freenode.org для вопросов, связанных с Drupal.

Ps.: иногда SQL не такое уж и зло:)

 0
Author: , 2009-07-25 22:07:04

В Drupal 7 правильно использовать EntityFieldQuery.

 0
Author: Reign.85, 2013-04-23 15:54:51

В Drupal 8 работает следующее (в этом примере загрузите всех пользователей с ролью administrator)

\Drupal::service('entity_type.manager')
  ->getStorage('user')
  ->loadByProperties(['roles' => 'administrator']);

Вернет список пользовательских сущностей.

Чтобы получить список uid вместо этого, запрос поля сущности:

$query = \Drupal::service('entity_type.manager')->getStorage('user')->getQuery();
$query->condition('roles', 'administrator');
$query->execute();
 0
Author: jhedstrom, 2016-03-09 22:19:57

В Drupal 8:

$users = \Drupal\user\Entity\User::loadMultiple();

И если вы хотите получить, например, только администраторов:

$admins = [];
foreach ($users as $user) {
  if ($user->hasRole('administrator')) {
    $admins[] = $user;
  }
}
 0
Author: Antonín Slejška, 2017-08-07 11:52:52