From 4b86bb0827f17f7cc6514c674bb31d846a996986 Mon Sep 17 00:00:00 2001 From: skodak Date: Mon, 21 Jan 2008 18:42:03 +0000 Subject: [PATCH] MDL-12773, MDL-12144 grade category selection on modedit page; merged from MOODLE_19_STABLE --- course/modedit.php | 127 ++++++++++++++++++++------------------ course/moodleform_mod.php | 96 +++++++++++++++++++++------- lib/gradelib.php | 34 ++++++++++ mod/resource/mod_form.php | 2 +- 4 files changed, 174 insertions(+), 85 deletions(-) diff --git a/course/modedit.php b/course/modedit.php index 7a7c650465..bee718346f 100644 --- a/course/modedit.php +++ b/course/modedit.php @@ -112,14 +112,32 @@ $form->return = $return; $form->update = $update; - // add existing outcomes if ($items = grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>$form->modulename, 'iteminstance'=>$form->instance, 'courseid'=>$COURSE->id))) { + // add existing outcomes foreach ($items as $item) { if (!empty($item->outcomeid)) { $form->{'outcome_'.$item->outcomeid} = 1; } } + + // set category if present + $gradecat = false; + foreach ($items as $item) { + if ($gradecat === false) { + $gradecat = $item->categoryid; + continue; + } + if ($gradecat != $item->categoryid) { + //mixed categories + $gradecat = false; + break; + } + } + if ($gradecat !== false) { + // do not set if mixed categories present + $form->gradecat = $gradecat; + } } $sectionname = get_section_name($course->format); @@ -300,7 +318,7 @@ error("Data submitted is invalid."); } - //sync idnumber with grade_item + // sync idnumber with grade_item if ($grade_item = grade_item::fetch(array('itemtype'=>'mod', 'itemmodule'=>$fromform->modulename, 'iteminstance'=>$fromform->instance, 'itemnumber'=>0, 'courseid'=>$COURSE->id))) { if ($grade_item->idnumber != $fromform->cmidnumber) { @@ -309,6 +327,31 @@ } } + $items = grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>$fromform->modulename, + 'iteminstance'=>$fromform->instance, 'courseid'=>$COURSE->id)); + + // create parent category if requested and move to correct parent category + if ($items and isset($fromform->gradecat)) { + if ($fromform->gradecat == -1) { + $grade_category = new grade_category(); + $grade_category->courseid = $COURSE->id; + $grade_category->fullname = stripslashes($fromform->name); + $grade_category->insert(); + if ($grade_item) { + $parent = $grade_item->get_parent_category(); + $grade_category->set_parent($parent->id); + } + $fromform->gradecat = $grade_category->id; + } + foreach ($items as $itemid=>$unused) { + $items[$itemid]->set_parent($fromform->gradecat); + if ($item->id == $grade_item->id) { + // use updated grade_item + $grade_item = $item; + } + } + } + // add outcomes if requested if ($outcomes = grade_outcome::fetch_all_available($COURSE->id)) { $grade_items = array(); @@ -318,13 +361,10 @@ if (array_key_exists($elname, $fromform) and $fromform->$elname) { // we have a request for new outcome grade item - $grade_item = new grade_item(); - // Outcome grade_item.itemnumber start at 1000 $max_itemnumber = 999; - $exists = false; - if ($items = grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>$fromform->modulename, - 'iteminstance'=>$fromform->instance, 'courseid'=>$COURSE->id))) { + if ($items) { + $exists = false; foreach($items as $item) { if ($item->outcomeid == $outcome->id) { $exists = true; @@ -341,61 +381,26 @@ if ($exists) { continue; } - $grade_item->courseid = $COURSE->id; - $grade_item->itemtype = 'mod'; - $grade_item->itemmodule = $fromform->modulename; - $grade_item->iteminstance = $fromform->instance; - $grade_item->itemnumber = $max_itemnumber + 1; - $grade_item->itemname = $outcome->fullname; - $grade_item->outcomeid = $outcome->id; - $grade_item->gradetype = GRADE_TYPE_SCALE; - $grade_item->scaleid = $outcome->scaleid; - - $grade_item->insert(); - - // TODO comment on these next 4 lines - if ($item = grade_item::fetch(array('itemtype'=>'mod', 'itemmodule'=>$grade_item->itemmodule, - 'iteminstance'=>$grade_item->iteminstance, 'itemnumber'=>0, 'courseid'=>$COURSE->id))) { - $grade_item->set_parent($item->categoryid); - $grade_item->move_after_sortorder($item->sortorder); - } - $grade_items[] = $grade_item; - } - } - - // Create a grade_category to represent this module, if outcomes have been attached - if (!empty($grade_items)) { - // Add the module's normal grade_item as a child of this category - $item_params = array('itemtype'=>'mod', - 'itemmodule'=>$fromform->modulename, - 'iteminstance'=>$fromform->instance, - 'itemnumber'=>0, - 'courseid'=>$COURSE->id); - $item = grade_item::fetch($item_params); - - // Only create the category if it will contain at least 2 items - if ($item OR count($grade_items) > 1) { // If we are here it means there is at least 1 outcome - $cat_params = array('courseid'=>$COURSE->id, 'fullname'=>$fromform->name); - $grade_category = grade_category::fetch($cat_params); - - if (!$grade_category) { - $grade_category = new grade_category($cat_params); - $grade_category->courseid = $COURSE->id; - $grade_category->fullname = $fromform->name; - $grade_category->insert(); - } - - $sortorder = $grade_category->sortorder; - - if ($item) { - $item->set_parent($grade_category->id); - $sortorder = $item->sortorder; - } - // Add the outcomes as children of this category - foreach ($grade_items as $gi) { - $gi->set_parent($grade_category->id); - $gi->move_after_sortorder($sortorder); + $outcome_item = new grade_item(); + $outcome_item->courseid = $COURSE->id; + $outcome_item->itemtype = 'mod'; + $outcome_item->itemmodule = $fromform->modulename; + $outcome_item->iteminstance = $fromform->instance; + $outcome_item->itemnumber = $max_itemnumber + 1; + $outcome_item->itemname = $outcome->fullname; + $outcome_item->outcomeid = $outcome->id; + $outcome_item->gradetype = GRADE_TYPE_SCALE; + $outcome_item->scaleid = $outcome->scaleid; + $outcome_item->insert(); + + // move the new outcome into correct category and fix sortorder if needed + if ($grade_item) { + $outcome_item->set_parent($grade_item->categoryid); + $outcome_item->move_after_sortorder($grade_item->sortorder); + + } else if (isset($fromform->gradecat)) { + $outcome_item->set_parent($fromform->gradecat); } } } diff --git a/course/moodleform_mod.php b/course/moodleform_mod.php index 9f5b2f34e8..49222a089a 100644 --- a/course/moodleform_mod.php +++ b/course/moodleform_mod.php @@ -28,6 +28,10 @@ class moodleform_mod extends moodleform { * @var mixed */ var $_cm; + /** + * List of modform features + */ + var $_features; function moodleform_mod($instance, $section, $cm) { $this->_instance = $instance; @@ -44,22 +48,52 @@ class moodleform_mod extends moodleform { function data_preprocessing(&$default_values){ } + /** + * Each module which defines definition_after_data() must call this method using parent::definition_after_data(); + */ function definition_after_data() { - global $COURSE; + global $CFG, $COURSE; $mform =& $this->_form; if ($id = $mform->getElementValue('update')) { $modulename = $mform->getElementValue('modulename'); $instance = $mform->getElementValue('instance'); - if ($items = grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>$modulename, - 'iteminstance'=>$instance, 'courseid'=>$COURSE->id))) { - foreach ($items as $item) { - if (!empty($item->outcomeid)) { - $elname = 'outcome_'.$item->outcomeid; - if ($mform->elementExists($elname)) { - $mform->hardFreeze($elname); // prevent removing of existing outcomes + if ($this->_features->gradecat) { + $gradecat = false; + if (!empty($CFG->enableoutcomes) and $this->_features->outcomes) { + if ($outcomes = grade_outcome::fetch_all_available($COURSE->id)) { + $gradecat = true; + } + } + if ($items = grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>$modulename, + 'iteminstance'=>$instance, 'courseid'=>$COURSE->id))) { + foreach ($items as $item) { + if (!empty($item->outcomeid)) { + $elname = 'outcome_'.$item->outcomeid; + if ($mform->elementExists($elname)) { + $mform->hardFreeze($elname); // prevent removing of existing outcomes + } + } + } + foreach ($items as $item) { + if (is_bool($gradecat)) { + $gradecat = $item->categoryid; + continue; } + if ($gradecat != $item->categoryid) { + //mixed categories + $gradecat = false; + break; + } + } + } + + if ($gradecat === false) { + // items and outcomes in different categories - remove the option + // TODO: it might be better to add a "Mixed categories" text instead + if ($mform->elementExists('gradecat')) { + $mform->removeElement('gradecat'); } } } @@ -76,7 +110,7 @@ class moodleform_mod extends moodleform { } else if (!$mform->elementExists('groupmode') and $mform->elementExists('groupmembersonly')) { $mform->disabledIf('groupingid', 'groupmembersonly', 'notchecked'); - + } else if (!$mform->elementExists('groupmode') and !$mform->elementExists('groupmembersonly')) { // groupings have no use without groupmode or groupmembersonly if ($mform->elementExists('groupingid')) { @@ -146,29 +180,40 @@ class moodleform_mod extends moodleform { // deal with legacy $supportgroups param if ($features === true or $features === false) { $groupmode = $features; - $features = new object(); - $features->groups = $groupmode; + $this->_features = new object(); + $this->_features->groups = $groupmode; } else if (is_array($features)) { - $features = (object)$features; + $this->_features = (object)$features; } else if (empty($features)) { - $features = new object(); + $this->_features = new object(); + + } else { + $this->_features = $features; } - if (!isset($features->groups)) { - $features->groups = true; + if (!isset($this->_features->groups)) { + $this->_features->groups = true; } - if (!isset($features->groupings)) { - $features->groupings = false; + if (!isset($this->_features->groupings)) { + $this->_features->groupings = false; } - if (!isset($features->groupmembersonly)) { - $features->groupmembersonly = false; + if (!isset($this->_features->groupmembersonly)) { + $this->_features->groupmembersonly = false; } - if (!empty($CFG->enableoutcomes)) { + if (!isset($this->_features->outcomes)) { + $this->_features->outcomes = true; + } + + if (!isset($this->_features->gradecat)) { + $this->_features->gradecat = true; + } + + if (!empty($CFG->enableoutcomes) and $this->_features->outcomes) { if ($outcomes = grade_outcome::fetch_all_available($COURSE->id)) { $mform->addElement('header', 'modoutcomes', get_string('outcomes', 'grades')); foreach($outcomes as $outcome) { @@ -178,7 +223,7 @@ class moodleform_mod extends moodleform { } $mform->addElement('header', 'modstandardelshdr', get_string('modstandardels', 'form')); - if ($features->groups) { + if ($this->_features->groups) { $options = array(NOGROUPS => get_string('groupsnone'), SEPARATEGROUPS => get_string('groupsseparate'), VISIBLEGROUPS => get_string('groupsvisible')); @@ -187,7 +232,7 @@ class moodleform_mod extends moodleform { } if (!empty($CFG->enablegroupings)) { - if ($features->groupings or $features->groupmembersonly) { + if ($this->_features->groupings or $this->_features->groupmembersonly) { //groupings selector - used for normal grouping mode or also when restricting access with groupmembersonly $options = array(); $options[0] = get_string('none'); @@ -200,7 +245,7 @@ class moodleform_mod extends moodleform { $mform->setAdvanced('groupingid'); } - if ($features->groupmembersonly) { + if ($this->_features->groupmembersonly) { $mform->addElement('checkbox', 'groupmembersonly', get_string('groupmembersonly', 'group')); $mform->setAdvanced('groupmembersonly'); } @@ -209,6 +254,11 @@ class moodleform_mod extends moodleform { $mform->addElement('modvisible', 'visible', get_string('visible')); $mform->addElement('text', 'cmidnumber', get_string('idnumber')); + if ($this->_features->gradecat) { + $categories = grade_get_categories_menu($COURSE->id, true); + $mform->addElement('select', 'gradecat', get_string('gradecategory', 'grades'), $categories); + } + $this->standard_hidden_coursemodule_elements(); } diff --git a/lib/gradelib.php b/lib/gradelib.php index 85b769dc02..444cb6c88b 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -619,6 +619,40 @@ function grade_format_gradevalue($value, &$grade_item, $localized=true, $display } } +/** + * Returns grade options for gradebook category menu + * @param int $courseid + * @param bool $includenew include option for new category (-1) + * @return array of grade categories in course + */ +function grade_get_categories_menu($courseid, $includenew=false) { + $result = array(); + if (!$categories = grade_category::fetch_all(array('courseid'=>$courseid))) { + //make sure course category exists + if (!grade_category::fetch_course_category()) { + debugging('Can not create course grade category!'); + return $result; + } + $categories = grade_category::fetch_all(array('courseid'=>$courseid)); + } + foreach ($categories as $key=>$category) { + if ($category->is_course_category()) { + $result[$category->id] = get_string('uncategorised', 'grades'); + unset($categories[$key]); + } + } + if ($includenew) { + $result[-1] = get_string('newcategory', 'grades'); + } + $cats = array(); + foreach ($categories as $category) { + $cats[$category->id] = $category->get_name(); + } + asort($cats, SORT_LOCALE_STRING); + + return ($result+$cats); +} + /** * Returns grade letters array used in context * @param object $context object or null for defaults diff --git a/mod/resource/mod_form.php b/mod/resource/mod_form.php index f1d64f814e..ed7a615690 100644 --- a/mod/resource/mod_form.php +++ b/mod/resource/mod_form.php @@ -43,7 +43,7 @@ class mod_resource_mod_form extends moodleform_mod { $mform->addElement('header', 'typedesc', get_string('resourcetype'.$type,'resource')); $this->_resinstance->setup_elements($mform); - $this->standard_coursemodule_elements(array('groups'=>false, 'groupmembersonly'=>true)); + $this->standard_coursemodule_elements(array('groups'=>false, 'groupmembersonly'=>true, 'gradecat'=>false)); $this->add_action_buttons(); } -- 2.39.5