2009-07-25 2 views

ответ

5

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

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

+0

Я бы сделал свой собственный ответ, но я чувствую, что должен просто расширять это. Нет функции, которая позволяет вам перечислять пользователей и фильтровать по ролям в Drupal (по крайней мере, ядро). Вы можете написать свою собственную функцию или, например, сказать «съеденный», использовать представления для создания списка пользователей. – codeincarnate

+0

Здесь легко. –

+0

вы __really__ должны использовать представления. это решение, которое вы ищете. – alexanderpas

0

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

Ps .: иногда SQL не то, что зло :)

+0

Я согласен. Я вижу много плагинов Wordpress, которые напрямую запрашивают базу данных вместо использования предопределенных функций. –

+4

Просто комментируя, чтобы добавить, что StackOverflow отлично подходит для вопросов Drupal, и больше людей спрашивают их здесь. – alxp

+0

sql-запросов следует избегать, так как drupal7 будет использовать новый db api для абстрагирования SQL (так что вы можете использовать такие вещи, как mongodb :) –

1

Одним из простых вариантов является использование представлений для создания SQL (отображается под представлением его «я», когда вы нажимаете кнопку предварительного просмотра) для вас, а затем используйте Drupal SQL abstraction layer, чтобы получить нужные результаты, если вам нужно получить доступ к а не отображать представление.

Было бы выглядеть немного так:

$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

Представления SQL излишне сложны, попробуйте 'SELECT uid, mail, name FROM {users}' – Adaddinsane

2

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.

+1

Производительность будет прекрасной. Ваш пример в коде D7: 'var_dump (db_query ('SELECT name FROM {users} u INNER JOIN {users_roles} r ON u.uid = r.uid WHERE r.rid = 4') -> fetchCol()); ' – pfrenssen

9

Вы можете использовать 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; 
    } 
    } 
} 
?> 
+2

Хотя принятый ответ Eaton, как правило, имеет место в отношении Drupal,' entity_load ('user') 'фактически загружает всех пользователей сайта в виде объектов в массиве, индексированном uid. –

+0

Это работает, но крайне неэффективно и будет ужасной идеей на сайтах с тысячами пользователей. – chadpeppers

0

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

+1

Можете ли вы привести пример о том, как это сделать? – akalata

0

В 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

В Drupal 8:

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

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

$admins = []; 
foreach ($users as $user) { 
    if ($user->hasRole('administrator')) { 
    $admins[] = $user; 
    } 
} 
Смежные вопросы