diff --git a/lib/navigationlib.php b/lib/navigationlib.php index f8627217923..da03b029ccc 100644 --- a/lib/navigationlib.php +++ b/lib/navigationlib.php @@ -2880,20 +2880,49 @@ class global_navigation_for_ajax extends global_navigation { $this->add_category($category, $this, $nodetype); $basecategory = $this->addedcategories[$category->id]; } else { - $subcategories[] = $category; + $subcategories[$category->id] = $category; } } $categories->close(); - if (!is_null($basecategory)) { - foreach ($subcategories as $category) { - $this->add_category($category, $basecategory, $nodetype); - } - } - // If category is shown in MyHome then only show enrolled courses, else show all courses. + // If category is shown in MyHome then only show enrolled courses and hide empty subcategories, + // else show all courses. if ($nodetype === self::TYPE_MY_CATEGORY) { $courses = enrol_get_my_courses(); + $categoryids = array(); + + // Only search for categories if basecategory was found. + if (!is_null($basecategory)) { + // Get course parent category ids. + foreach ($courses as $course) { + $categoryids[] = $course->category; + } + + // Get a unique list of category ids which a part of the path + // to user's courses. + $coursesubcategories = array(); + $addedsubcategories = array(); + + list($sql, $params) = $DB->get_in_or_equal($categoryids); + $categories = $DB->get_recordset_select('course_categories', 'id '.$sql, $params, 'sortorder, id', 'id, path'); + + foreach ($categories as $category){ + $coursesubcategories = array_merge($coursesubcategories, explode('/', trim($category->path, "/"))); + } + $coursesubcategories = array_unique($coursesubcategories); + + // Only add a subcategory if it is part of the path to user's course and + // wasn't already added. + foreach ($subcategories as $subid => $subcategory) { + if (in_array($subid, $coursesubcategories) && + !in_array($subid, $addedsubcategories)) { + $this->add_category($subcategory, $basecategory, $nodetype); + $addedsubcategories[] = $subid; + } + } + } + foreach ($courses as $course) { // Add course if it's in category. if (in_array($course->category, $categorylist)) { @@ -2901,6 +2930,11 @@ class global_navigation_for_ajax extends global_navigation { } } } else { + if (!is_null($basecategory)) { + foreach ($subcategories as $key=>$category) { + $this->add_category($category, $basecategory, $nodetype); + } + } $courses = $DB->get_recordset('course', array('category' => $categoryid), 'sortorder', '*' , 0, $limit); foreach ($courses as $course) { $this->add_course($course);