在Drupal 7中加载用户组
今天,在与OrganicGroups一起工作时,我需要加载用户连接到的节点的列表。在看了一下源代码后,我找不到如何执行此操作的好方法。因此,在Google周围逛了一会儿之后,我就坐下来写了一个。
事实证明,获取用户所属的组节点非常容易,但是必须分多个步骤来完成。第一步是获取使用og_get_entity_groups()功能通过用户连接的组实体ID的列表。可以不使用任何参数(假定当前用户)使用。
//加载当前用户的组实体ID $groups = og_get_entity_groups();
或者,您可以加载用户并将该对象传递给函数。
//获取当前用户 global $user; //加载当前用户的组实体ID $groups = og_get_entity_groups('user', $user);
下一步是使用这些组实体ID来使用该og_load_multiple()功能加载实际的节点实体ID。
//加载实体对象ID $groups = og_load_multiple($groups);
现在,我们终于可以开始使用这些组实体加载节点对象了。这可以通过许多不同的方式来完成。第一种是遍历它们并一次加载一个节点对象。
//一次将它们转换为节点。 $nodes = array(); foreach ($groups as $group) { $nodes[] = node_load($group->etid); }
另一种选择是遍历组实体列表,并将所有节点实体ID加载到数组中。然后可以将其传递给entity_load()函数。
//通过一个函数调用加载所有节点 $nodes = array(); foreach ($groups as $group) { $nodes[] = $group->etid; } $nodes = entity_load('node', $nodes);
使用entity_load()是一个很好的选择,因为它意味着您可以使用conditions参数仅加载某些节点,而不必依次加载每个节点。在下面的示例中,我仅在$nodes数组中加载类型为'club'的节点。
//通过一个函数调用加载所有节点 $nodes = array(); foreach ($groups as $group) { $nodes[] = $group->etid; } $nodes = entity_load('node', $nodes, array('type' => 'club'), FALSE);
更新:
因此,事实证明,og_load_multiple()至少在该2.x版本中,它不再是OrganicGroups的一部分。替代方法是使用node_load_multiple(),它将把所有节点加载为节点对象。因此,要一次性加载连接到用户的所有节点,请执行以下操作:
global $user; $groups = og_get_entity_groups('user', $user); $groups = node_load_multiple($groups);
但是要小心,好像用户是许多组的成员一样,此代码将加载所有这些对象。