Browse Source

Get subgroups - refs BT#9431

Angel Fernando Quiroz Campos 10 years ago
parent
commit
67e3566cae
2 changed files with 60 additions and 1 deletions
  1. 13 0
      main/inc/ajax/model.ajax.php
  2. 47 1
      main/inc/lib/group_portal_manager.lib.php

+ 13 - 0
main/inc/ajax/model.ajax.php

@@ -213,8 +213,21 @@ switch ($action) {
         if ($searchByGroups) {
             $groups = GroupPortalManager::get_groups_by_user(api_get_user_id(), GROUP_USER_PERMISSION_ADMIN);
             $groupsId = array_keys($groups);
+            $subgroupsId = [];
 
             if (is_array($groupsId)) {
+                foreach ($groupsId as $groupId) {
+                    $subgroupsId = array_merge(
+                        $subgroupsId,
+                        GroupPortalManager::getGroupsByDepthLevel($groupId)
+                    );
+                }
+
+                $groupsId = array_merge(
+                    $groupsId,
+                    $subgroupsId
+                );
+
                 foreach ($groupsId as $groupId) {
                     $groupUsers = GroupPortalManager::get_users_by_group($groupId);
 

+ 47 - 1
main/inc/lib/group_portal_manager.lib.php

@@ -217,6 +217,52 @@ class GroupPortalManager
         }
     }
 
+    /**
+     * Get the subgroups ID from a group.
+     * The default $levels value is 10 considering it as a extensive level of depth
+     * @param int $groupId The parent group ID
+     * @param int $levels The depth levels
+     * @return array The list of ID
+     */
+    public static function getGroupsByDepthLevel($groupId, $levels = 10)
+    {
+        $groups = array();
+
+        $groupTable = Database::get_main_table(TABLE_MAIN_GROUP);
+        $groupRelGroupTable = Database :: get_main_table(TABLE_MAIN_GROUP_REL_GROUP);
+
+        $select = "SELECT ";
+        $from = "FROM $groupTable g1 ";
+
+        for ($i = 1; $i <= $levels; $i++) {
+            $gNumber = $i;
+            $ggNumber = $i - 1;
+
+            $select .= "g$i.id as id_$i ";
+
+            $select .= ($i != $levels ? ", " : null);
+
+            if ($i == 1) {
+                $from .= "INNER JOIN $groupRelGroupTable gg0 ON g1.id = gg0.subgroup_id and gg0.group_id = $groupId ";
+            } else {
+                $from .= "LEFT JOIN $groupRelGroupTable gg$ggNumber ON g$ggNumber.id = gg$ggNumber.group_id ";
+                $from .= "LEFT JOIN $groupTable g$gNumber ON gg$ggNumber.subgroup_id = g$gNumber.id ";
+            }
+        }
+
+        $result = Database::query("$select $from");
+
+        while ($item = Database::fetch_assoc($result)) {
+            foreach ($item as $groupId) {
+                if (!empty($groupId)) {
+                    $groups[] = $groupId;
+                }
+            }
+        }
+
+        return array_map('intval', $groups);
+    }
+
     /**
      * @param int $root
      * @param int $level
@@ -234,7 +280,7 @@ class GroupPortalManager
             if ($i == $level) {
                 $select_part .= "g$i.id as id_$i, g$i.name as name_$i ";
             } else {
-                $select_part .="g$i.id as id_$i, g$i.name name_$i, ";
+                $select_part .= "g$i.id as id_$i, g$i.name name_$i, ";
             }
             if ($i == 1) {
                 $cond_part .= "FROM $t_group g1 JOIN $t_rel_group rg0 on g1.id = rg0.subgroup_id and rg0.group_id = $root ";