From 35a0aeb84acd8f45fb201fdc0eaea85b379e51b6 Mon Sep 17 00:00:00 2001 From: Vadimon Date: Sat, 30 Jan 2010 00:59:36 +0700 Subject: [PATCH] Sub-categories management for users with non-global admin rights --- course/category.php | 208 ++++++++++++++++++++++++++++++++++++++++++----- lang/en_utf8/moodle.php | 1 + 2 files changed, 188 insertions(+), 21 deletions(-) diff --git a/course/category.php b/course/category.php index 1f0cb5f..70ec80a 100644 --- a/course/category.php +++ b/course/category.php @@ -16,6 +16,11 @@ $movedown = optional_param('movedown', 0, PARAM_INT); $moveto = optional_param('moveto', 0, PARAM_INT); $resort = optional_param('resort', 0, PARAM_BOOL); + $hidesubcategory = optional_param('hidesubcategory', 0, PARAM_INT); + $showsubcategory = optional_param('showsubcategory', 0, PARAM_INT); + $movecategoryup = optional_param('movecategoryup', 0, PARAM_INT); + $movecategorydown = optional_param('movecategorydown', 0, PARAM_INT); + $resortsubcategories = optional_param('resortsubcategories', 0, PARAM_BOOL); if ($CFG->forcelogin) { require_login(); @@ -53,6 +58,20 @@ // Process any category actions. if (has_capability('moodle/category:manage', $context)) { + /// Resort subcategories if requested + if ($resortsubcategories and confirm_sesskey()) { + if ($subcategories = get_records('course_categories', 'parent', $category->id, 'name ASC')) { + // move it off the range + $count = 1; + begin_sql(); + foreach ($subcategories as $subcategory) { + set_field('course_categories', 'sortorder', $count, 'id', $subcategory->id); + $count++; + } + commit_sql(); + } + } + /// Resort the category if requested if ($resort and confirm_sesskey()) { if ($courses = get_courses($category->id, "fullname ASC", 'c.id,c.fullname,c.sortorder')) { @@ -70,8 +89,51 @@ } } } + if ($editingon) { + /// Hide or show subcategory + if ((!empty($hidesubcategory) or !empty($showsubcategory)) and confirm_sesskey()) { + if (!empty($hidesubcategory)) { + $subcategory = get_record('course_categories', 'id', $hidesubcategory); + $visible = 0; + } else { + $subcategory = get_record('course_categories', 'id', $showsubcategory); + $visible = 1; + } + + if ($subcategory) { + $subcategorycontext = get_context_instance(CONTEXT_COURSECAT, $subcategory->id); + require_capability('moodle/category:manage', $subcategorycontext); + if (!set_field('course_categories', 'visible', $visible, 'id', $subcategory->id)) { + notify('Could not update that course!'); + } + } + } - if(!empty($CFG->allowcategorythemes) && isset($category->theme)) { + /// Move a sub-category up or down + if ((!empty($movecategoryup) or !empty($movecategorydown)) and confirm_sesskey()) { + require_capability('moodle/category:manage', $context); + if ($subcategories = get_records('course_categories', 'parent', $category->id, 'sortorder ASC')) { + // move it off the range + $count = 2; + begin_sql(); + foreach ($subcategories as $subcategory) { + set_field('course_categories', 'sortorder', $count * 2, 'id', $subcategory->id); + if (!empty($movecategoryup) && ($subcategory->id == $movecategoryup)) { + set_field('course_categories', 'sortorder', $count * 2 - 3, 'id', $subcategory->id); + } elseif (!empty($movecategorydown) && ($subcategory->id == $movecategorydown)) { + set_field('course_categories', 'sortorder', $count * 2 + 3, 'id', $subcategory->id); + } else { + set_field('course_categories', 'sortorder', $count * 2, 'id', $subcategory->id); + } + $count++; + } + commit_sql(); + } + } + + } // End of subcategory editing + +if(!empty($CFG->allowcategorythemes) && isset($category->theme)) { // specifying theme here saves us some dbqs theme_setup($category->theme); } @@ -232,10 +294,6 @@ $options = array('id' => $category->id); print_single_button($CFG->wwwroot.'/course/editcategory.php', $options, get_string('editcategorythis'), 'get'); - // Print button for creating new categories - $options = array('parent' => $category->id); - print_single_button($CFG->wwwroot.'/course/editcategory.php', $options, get_string('addsubcategory'), 'get'); - // Print button to delete this category $options = array('id' => $category->id); print_single_button($CFG->wwwroot.'/course/deletecategory.php', $options, get_string('deletecategorythis'), 'get'); @@ -245,28 +303,136 @@ /// Print out all the sub-categories if ($subcategories = get_records('course_categories', 'parent', $category->id, 'sortorder ASC')) { - $firstentry = true; - foreach ($subcategories as $subcategory) { - if ($subcategory->visible || has_capability('moodle/category:viewhiddencategories', $context)) { - $subcategorieswereshown = true; - if ($firstentry) { - echo ''; - echo ''; + if (!$editingon) { + //display simply sub-categories list + $firstentry = true; + foreach ($subcategories as $subcategory) { + if ($subcategory->visible || has_capability('moodle/category:viewhiddencategories', $context)) { + $subcategorieswereshown = true; + if ($firstentry) { + echo '
'.get_string('subcategories').'
'; + echo ''; + echo '
'.get_string('subcategories').'
'; + $firstentry = false; + } + $catlinkcss = $subcategory->visible ? '' : 'class="dimmed" '; + echo ''. + format_string($subcategory->name).'
'; + } + } + if (!$firstentry) { + echo '
'; + echo '
'; + } + } else { + // display tho-column sub-categories list with editing buttons in second column + $firstentry = true; + $count=0; + $numcategories=count($subcategories); + foreach ($subcategories as $subcategory) { + $count++; + $up = ($count > 1); + $down = ($count < $numcategories); + if ($subcategory->visible || has_capability('moodle/category:viewhiddencategories', $context)) { + $subcategorieswereshown = true; + if ($firstentry) { + echo ''; + echo ''; + echo ''; + $firstentry = false; + } echo ''; } - $catlinkcss = $subcategory->visible ? '' : 'class="dimmed" '; - echo ''. - format_string($subcategory->name).'
'; + } + if (!$firstentry) { + echo '
'.get_string('subcategories').''.get_string('edit').'
'; - $firstentry = false; + $catlinkcss = $subcategory->visible ? '' : 'class="dimmed" '; + echo ''. + format_string($subcategory->name).''; + echo ''; + + $subcategorycontext = get_context_instance(CONTEXT_COURSECAT, $subcategory->id); + $spacer = ' '; + + if (has_capability('moodle/category:manage', $subcategorycontext)) { + echo ''. + ''.get_string('edit').' '; + } else { + echo $spacer; + } + + if (has_capability('moodle/role:assign', $subcategorycontext)) { + echo ''. + ''.get_string('assignroles', 'role').' '; + } else { + echo $spacer; + } + + $childcat = get_child_categories($subcategory->id); + $courses = get_courses($subcategory->id); + if (has_capability('moodle/category:manage', $context) && has_capability('moodle/category:manage', $subcategorycontext) && + empty($childcat) && empty($courses)) { + echo ''. + ''.get_string('delete').' '; + } else { + echo $spacer; + } + + if (has_capability('moodle/category:viewhiddencategories', $context) && has_capability('moodle/category:manage', $subcategorycontext)) { + if ($subcategory->visible) { + echo ''. + ''.get_string('hide').' '; + } else { + echo ''. + ''.get_string('show').' '; + } + } else { + echo $spacer; + } + + if (has_capability('moodle/category:manage', $context)) { + if ($up) { + echo ''. + ''.get_string('moveup').' '; + } else { + echo $spacer; + } + + if ($down) { + echo ''. + ''.get_string('movedown').' '; + } else { + echo $spacer; + } + } else { + echo $spacer, $spacer; + } + + echo '
'; } } - if (!$firstentry) { - echo ''; - echo '
'; - } - } + + }/// end of sub-categories form + if (has_capability('moodle/category:manage', $context)) { + echo '
'; + $numcategories=count($subcategories); + if ($numcategories > 1) { + unset($options); + $options['id'] = $category->id; + $options['resortsubcategories'] = 'name'; + $options['sesskey'] = $USER->sesskey; + print_single_button('category.php', $options, get_string('resortcategoriesbyname'), 'get'); + } + $options = array('parent' => $category->id); + print_single_button($CFG->wwwroot.'/course/editcategory.php', $options, get_string('addsubcategory'), 'get'); + echo '
'; + } /// Print out all the courses $courses = get_courses_page($category->id, 'c.sortorder ASC', 'c.id,c.sortorder,c.shortname,c.fullname,c.summary,c.visible,c.teacher,c.guest,c.password', diff --git a/lang/en_utf8/moodle.php b/lang/en_utf8/moodle.php index 1ae46f6..e592f7f 100644 --- a/lang/en_utf8/moodle.php +++ b/lang/en_utf8/moodle.php @@ -1305,6 +1305,7 @@ $string['resetcourse'] = 'Reset course'; $string['resetinfo'] = 'This page allows you to empty a course of user data, while retaining the activities and other settings. Please be warned that by choosing items below and submitting this page you will delete your chosen user data from this course forever!'; $string['resetstartdate'] = 'Reset start date'; $string['resettodefaults'] = 'Reset to defaults'; +$string['resortcategoriesbyname'] = 'Re-sort sub-categories by name'; $string['resortcoursesbyname'] = 'Re-sort courses by name'; $string['resource'] = 'Resource'; $string['resources'] = 'Resources'; -- 1.6.5.1.1367.gcd48