Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否可以使用Drupal api获取用户列表?_Php_Drupal - Fatal编程技术网

Php 是否可以使用Drupal api获取用户列表?

Php 是否可以使用Drupal api获取用户列表?,php,drupal,Php,Drupal,我想得到一个已经被分配了某个角色的所有用户的列表。我可以编写自己的SQL,但我希望尽可能多地使用api。我不知道有哪种api可以帮助按角色收集用户。这里是一些链接,您可以获得一些信息:。 虽然这是一项很棒的服务,但我建议使用drupal.org或irc.freenode.org上的drupal频道来解答与drupal相关的问题 注:有时SQL并不是那么邪恶:通常没有Drupal API函数用于此类任务,用于提取符合特定条件的实体。它倾向于关注API中的单个实体CRUD函数;其他一切都取决于开发人

我想得到一个已经被分配了某个角色的所有用户的列表。我可以编写自己的SQL,但我希望尽可能多地使用api。

我不知道有哪种api可以帮助按角色收集用户。这里是一些链接,您可以获得一些信息:。 虽然这是一项很棒的服务,但我建议使用drupal.org或irc.freenode.org上的drupal频道来解答与drupal相关的问题


注:有时SQL并不是那么邪恶:

通常没有Drupal API函数用于此类任务,用于提取符合特定条件的实体。它倾向于关注API中的单个实体CRUD函数;其他一切都取决于开发人员自己的SQL技能


“视图”模块允许您生成按角色、权限和权限筛选的用户列表,etc-但它很容易被过度使用。

一个简单的选择是,当您按下预览按钮时,使用视图生成视图下方显示的SQL,然后如果您需要访问原始数据而不是显示视图,则使用获取所需的结果

看起来有点像这样:

$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
  }

只需向视图中添加更多字段即可获得完整的查询。

为我工作的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。

您可以使用实体加载来获取用户数组。下面的示例将为管理员用户创建用于发送通知的所有电子邮件列表

<?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;
    }
  }
}
?>

在Drupal 7中,使用EntityFieldQuery是正确的方法。

在Drupal 8中,以下工作在本例中,使用管理员角色加载所有用户

将返回用户实体的列表

要获取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;
  }
}

我同意。我看到很多Wordpress插件直接查询数据库,而不是使用预定义的函数。只是补充说StackOverflow非常适合Drupal问题,更多的人应该在这里提问。应该避免sql查询,因为drupal7将使用新的db api来抽象SQL,所以您可以使用mongodb之类的东西:我会给出我自己的答案,但我觉得我应该对此进行扩展。至少在Drupal core中没有允许您列出用户和按角色筛选的功能。你可以编写自己的函数,或者像伊顿说的那样,使用视图创建用户列表。你真的应该使用视图。这是您正在寻找的解决方案。性能会很好。D7代码中的示例:var_dumpdb_query'SELECT name FROM{users}u internal JOIN{users\u roles}r ON u.uid=r.uid,其中r.rid=4'->fetchCol;虽然Eaton普遍接受的答案似乎是Drupal的情况,但entity_load'user'实际上会将所有站点用户作为对象加载到一个由uid索引的数组中。这一方法虽然有效,但效率极低,对于拥有数千用户的站点来说,这将是一个糟糕的主意。SQL视图不必要地复杂,请尝试“选择uid,邮件,来自{users}的名称您能提供一个如何做到这一点的示例吗?
$admins = [];
foreach ($users as $user) {
  if ($user->hasRole('administrator')) {
    $admins[] = $user;
  }
}