Я хотел бы получить список всех пользователей, которым была назначена определенная роль. Я мог бы написать свой собственный SQL, но я хотел бы использовать api как можно больше.
Как правило, для этой задачи нет функций API Drupal (вытягивание объектов, соответствующих определенным критериям). Он имеет тенденцию сосредотачиваться на функциях CRUD одного объекта в API; все остальное зависит от собственных навыков разработчика SQL.
Модуль Views позволяет создавать списки пользователей, отфильтрованных по ролям, разрешениям и т. Д., Но его можно легко переусердствовать.
Вы можете использовать entity_load для получения массива пользователей. Вот пример, который будет создавать список всех писем для пользователей admin (используемых для отправки уведомлений)
<?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 пользователей пользователей 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-> имя_пользователя; // или делать что угодно } echo $ users;
Имейте в виду, что это для Drupal 6, и я не уверен в производительности этого для больших пользовательских баз. Не уверен в Drupal 7.
Один простой вариант – использовать Views для генерации 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 . Хотя SO – отличный сервис, я предлагаю использовать drupal.org или #drupal channel на irc.freenode.org для вопросов, связанных с Drupal.
Ps .: иногда SQL не так злой 🙂
В Drupal 7 используется EntityFieldQuery.
В Drupal 8 следующие работы (в этом примере загрузите всех пользователей с ролью administrator
)
\Drupal::service('entity_type.manager') ->getStorage('user') ->loadByProperties(['roles' => 'administrator']);
вернет список пользовательских объектов.
Чтобы получить список uid
s, запрос поля объекта:
$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; } }