$categorieslist = coursecat::make_categories_list('moodle/category:manage'); $categoryids = array_keys($categorieslist); $categories = coursecat::get_many($categoryids); unset($categorieslist); } else { break; } } } foreach ($categories as $cat) { if ($sortcategoriesby && $cat->can_resort_subcategories()) { // Don't clean up here, we'll do it once we're all done. \core_course\management\helper::action_category_resort_subcategories($cat, $sortcategoriesby, false); } if ($sortcoursesby && $cat->can_resort_courses()) { \core_course\management\helper::action_category_resort_courses($cat, $sortcoursesby, false); } } coursecat::resort_categories_cleanup($sortcoursesby !== false); if ($category === null && count($categoryids) === 1) { // They're bulk sorting just a single category and they've not selected a category. // Lets for convenience sake auto-select the category that has been resorted for them. redirect(new moodle_url($PAGE->url, array('categoryid' => reset($categoryids)))); } } } } } if ($redirectback) { if ($redirectmessage) { redirect($PAGE->url, $redirectmessage, 5);
/** * Test resorting of courses within a category. * * \core_course\management\helper::action_category_resort_courses */ public function test_action_category_resort_courses() { global $DB; $this->resetAfterTest(true); $generator = $this->getDataGenerator(); $category = $generator->create_category(); $course1 = $generator->create_course(array('category' => $category->id, 'fullname' => 'Experimental Chemistry', 'shortname' => 'Course A', 'idnumber' => '10001')); $course2 = $generator->create_course(array('category' => $category->id, 'fullname' => 'Learn to program: Jade', 'shortname' => 'Beginning Jade', 'idnumber' => '10003')); $course3 = $generator->create_course(array('category' => $category->id, 'fullname' => 'Advanced algebra', 'shortname' => 'Advanced algebra', 'idnumber' => '10002')); $syscontext = context_system::instance(); // Update category object from DB so the course count is correct. $category = coursecat::get($category->id); list($user, $roleid) = $this->get_user_objects($generator, $syscontext->id); $caps = course_capability_assignment::allow(self::CATEGORY_MANAGE, $roleid, $syscontext->id); // Check that sort order in the DB matches what we've got in the cache. $courses = $category->get_courses(); $this->assertInternalType('array', $courses); $dbcourses = $DB->get_records('course', array('category' => $category->id), 'sortorder'); $this->assertEquals(array_keys($dbcourses), array_keys($courses)); // Resort by fullname. \core_course\management\helper::action_category_resort_courses($category, 'fullname'); $courses = $category->get_courses(); $this->assertInternalType('array', $courses); $this->assertEquals(array($course3->id, $course1->id, $course2->id), array_keys($courses)); $dbcourses = $DB->get_records('course', array('category' => $category->id), 'sortorder'); $this->assertEquals(array_keys($dbcourses), array_keys($courses)); // Resort by shortname. \core_course\management\helper::action_category_resort_courses($category, 'shortname'); $courses = $category->get_courses(); $this->assertInternalType('array', $courses); $this->assertEquals(array($course3->id, $course2->id, $course1->id), array_keys($courses)); $dbcourses = $DB->get_records('course', array('category' => $category->id), 'sortorder'); $this->assertEquals(array_keys($dbcourses), array_keys($courses)); // Resort by idnumber. \core_course\management\helper::action_category_resort_courses($category, 'idnumber'); $courses = $category->get_courses(); $this->assertInternalType('array', $courses); $this->assertEquals(array($course1->id, $course3->id, $course2->id), array_keys($courses)); $dbcourses = $DB->get_records('course', array('category' => $category->id), 'sortorder'); $this->assertEquals(array_keys($dbcourses), array_keys($courses)); // Try with a field that cannot be sorted on. try { \core_course\management\helper::action_category_resort_courses($category, 'category'); $this->fail('Category courses resorted by invalid sort field.'); } catch (coding_exception $exception) { // Test things are as they were before. $courses = $category->get_courses(); $this->assertInternalType('array', $courses); $this->assertEquals(array($course1->id, $course3->id, $course2->id), array_keys($courses)); $dbcourses = $DB->get_records('course', array('category' => $category->id), 'sortorder'); $this->assertEquals(array_keys($dbcourses), array_keys($courses)); } // Try with a completely bogus field. try { \core_course\management\helper::action_category_resort_courses($category, 'monkeys'); $this->fail('Category courses resorted by completely ridiculous field.'); } catch (coding_exception $exception) { // Test things are as they were before. $courses = $category->get_courses(); $this->assertInternalType('array', $courses); $this->assertEquals(array($course1->id, $course3->id, $course2->id), array_keys($courses)); $dbcourses = $DB->get_records('course', array('category' => $category->id), 'sortorder'); $this->assertEquals(array_keys($dbcourses), array_keys($courses)); } // Prohibit resorting. $caps->assign(CAP_PROHIBIT); // Refresh our coursecat object. $category = coursecat::get($category->id); // We should no longer have permission to do this. Test it out! try { \core_course\management\helper::action_category_resort_courses($category, 'shortname'); $this->fail('Courses sorted without having the required permission.'); } catch (moodle_exception $exception) { // Check its the right exception. $this->assertEquals('coursecat::can_resort', $exception->debuginfo); // Test things are as they were before. $courses = $category->get_courses(); $this->assertInternalType('array', $courses); $this->assertEquals(array($course1->id, $course3->id, $course2->id), array_keys($courses)); $dbcourses = $DB->get_records('course', array('category' => $category->id), 'sortorder'); $this->assertEquals(array_keys($dbcourses), array_keys($courses)); } }