Intereting Posts

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

Я хотел бы получить список всех пользователей, которым была назначена определенная роль. Я мог бы написать свой собственный 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; } }