Можно ли использовать api Drupal для получения списка пользователей?
Я хотел бы получить список всех пользователей, которым была назначена определенная роль. Я мог бы написать свой собственный SQL, но я хотел бы использовать api как можно больше.
8 answers
Как правило, для такого рода задач нет функций API Drupal (поиск объектов, соответствующих определенным критериям). Он, как правило, фокусируется на функциях CRUD с одним объектом в API; все остальное зависит от собственных навыков разработчика в области SQL.
Модуль Представления позволяет создавать списки пользователей, отфильтрованных по ролям, разрешениям и т. Д., Но это может быть излишним.
Вы можете использовать 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;
}
}
}
?>
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.
Один из простых вариантов - использовать представления для создания 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
}
Просто добавьте больше полей в представление, чтобы получить полный запрос.
Я не знаю ни о каком API, который мог бы помочь собирать пользователей по ролям. Вот вам ссылка, по которой вы можете что-то получить: http://drupal.org/node/82002 . Хотя это потрясающий сервис, который я предлагаю использовать drupal.org или канал #drupal на irc.freenode.org для вопросов, связанных с Drupal.
Ps.: иногда SQL не такое уж и зло:)
В Drupal 7 правильно использовать EntityFieldQuery.
В 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();
В Drupal 8:
$users = \Drupal\user\Entity\User::loadMultiple();
И если вы хотите получить, например, только администраторов:
$admins = [];
foreach ($users as $user) {
if ($user->hasRole('administrator')) {
$admins[] = $user;
}
}