if ($sortcategoriesby && coursecat::get(0)->can_resort_subcategories()) { \core_course\management\helper::action_category_resort_subcategories(coursecat::get(0), $sortcategoriesby); } $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)))); } } } } }
/** * Tests resorting sub categories of a course. * * \core_course\management\helper::action_category_resort_courses */ public function test_action_category_resort_subcategories() { global $DB; $this->resetAfterTest(true); $generator = $this->getDataGenerator(); $parent = $generator->create_category(); $cat1 = $generator->create_category(array('parent' => $parent->id, 'name' => 'School of Science', 'idnumber' => '10001')); $cat2 = $generator->create_category(array('parent' => $parent->id, 'name' => 'School of Commerce', 'idnumber' => '10003')); $cat3 = $generator->create_category(array('parent' => $parent->id, 'name' => 'School of Arts', 'idnumber' => '10002')); $syscontext = context_system::instance(); list($user, $roleid) = $this->get_user_objects($generator, $syscontext->id); $caps = course_capability_assignment::allow(self::CATEGORY_MANAGE, $roleid, $syscontext->id); $categories = $parent->get_children(); $this->assertInternalType('array', $categories); $dbcategories = $DB->get_records('course_categories', array('parent' => $parent->id), 'sortorder'); $this->assertEquals(array_keys($dbcategories), array_keys($categories)); // Test sorting by name. \core_course\management\helper::action_category_resort_subcategories($parent, 'name'); $categories = $parent->get_children(); $this->assertInternalType('array', $categories); $this->assertEquals(array($cat3->id, $cat2->id, $cat1->id), array_keys($categories)); $dbcategories = $DB->get_records('course_categories', array('parent' => $parent->id), 'sortorder'); $this->assertEquals(array_keys($dbcategories), array_keys($categories)); // Test sorting by idnumber. \core_course\management\helper::action_category_resort_subcategories($parent, 'idnumber'); $categories = $parent->get_children(); $this->assertInternalType('array', $categories); $this->assertEquals(array($cat1->id, $cat3->id, $cat2->id), array_keys($categories)); $dbcategories = $DB->get_records('course_categories', array('parent' => $parent->id), 'sortorder'); $this->assertEquals(array_keys($dbcategories), array_keys($categories)); // Try with an invalid field. try { \core_course\management\helper::action_category_resort_subcategories($parent, 'summary'); $this->fail('Categories resorted by invalid field.'); } catch (coding_exception $exception) { // Check that nothing was changed. $categories = $parent->get_children(); $this->assertInternalType('array', $categories); $this->assertEquals(array($cat1->id, $cat3->id, $cat2->id), array_keys($categories)); $dbcategories = $DB->get_records('course_categories', array('parent' => $parent->id), 'sortorder'); $this->assertEquals(array_keys($dbcategories), array_keys($categories)); } // Try with a completely bogus field. try { \core_course\management\helper::action_category_resort_subcategories($parent, 'monkeys'); $this->fail('Categories resorted by completely bogus field.'); } catch (coding_exception $exception) { // Check that nothing was changed. $categories = $parent->get_children(); $this->assertInternalType('array', $categories); $this->assertEquals(array($cat1->id, $cat3->id, $cat2->id), array_keys($categories)); $dbcategories = $DB->get_records('course_categories', array('parent' => $parent->id), 'sortorder'); $this->assertEquals(array_keys($dbcategories), array_keys($categories)); } // Test resorting the top level category (puke). $topcat = coursecat::get(0); \core_course\management\helper::action_category_resort_subcategories($topcat, 'name'); $categories = $topcat->get_children(); $this->assertInternalType('array', $categories); $dbcategories = $DB->get_records('course_categories', array('parent' => '0'), 'sortorder'); $this->assertEquals(array_keys($dbcategories), array_keys($categories)); // Prohibit resorting. $caps->assign(CAP_PROHIBIT); // Refresh our coursecat object. $parent = coursecat::get($parent->id); // We should no longer have permission to do this. Test it out! try { \core_course\management\helper::action_category_resort_subcategories($parent, 'idnumber'); $this->fail('Categories 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. $categories = $parent->get_children(); $this->assertInternalType('array', $categories); $this->assertEquals(array($cat1->id, $cat3->id, $cat2->id), array_keys($categories)); $dbcategories = $DB->get_records('course_categories', array('parent' => $parent->id), 'sortorder'); $this->assertEquals(array_keys($dbcategories), array_keys($categories)); } }