3a016e2784
It has been detected, thanks to php80 specially, that there are various places in core where support for localised floats is missing. Before php80, some locale-dependent conversions were performed by PHP, allowing things to work. But with php80 all those comparisons are now locale-independent. See: https://wiki.php.net/rfc/locale_independent_float_to_string That implies that we now need to, always, unformat floats to be internally the correct (decimal point as separator) in order to compare it. While this was visited in the php80 epic (MDL-70745), nothing was found, all automated tests were passing ok. Problem is that we run behat tests with en-AU laguage that has the decimal point separator. So, in this issue we are fixing all the problems detected by running those Behat tests using localised (comma) decimal separator. Note that there may be other places still causing problems, but it's really hard to find them programmatically, so we'll have to wait for real use reports / issues and go fixing them while they happen. Back to this commit, this is the list of changes performed (note that in the next commit, we'll be adding scenarios explicitly using a localised decimal separator to ensure that they work ok). A. Changes to various grade forms to ensure that, on their validation floats are unformatted properly. Also, changed the corresponding form element from current text/PARAM_RAW to proper float ones that take care of the conversion in a number of places (but when disabled, that's the reason we still have to unformat in validation. This includes the following forms: - edit_category_form - edit_item_form (this is the original problem reported that cause all the research to be performed against full behat runs) B. Changes to edit_letter_form, so it uses a proper PARAM_LOCALISEDFLOAT (note this is the type of change that surely should be used for all the rest of /grade/edit/tree form, including those in the previous point). C. Changes to the grade_item behat generator, so it's able to work with localised floats, un-formatting them when needed. At lib/behat/classes/behat_core_generator.php D. Fix problem passing localised floats to scales, not displaying properly. At grade/report/singleview/classes/local/ui/finalgrade.php E. Change the behat text matcher in order to allow comparison of localised floats when they are the current ones. Before this change the matches was using soft/lazy comparison, so '50' and '50.0000' match. Now, when the comma (for example) is used (and only then), '50' and '50,000' will also match. This comparison is in use in a bunch of tests and makes sense to make it localisation-aware. At grade/report/singleview/classes/local/ui/finalgrade.php F. Fix a couple of number_format() uses in lesson, because they are not localised-aware. Switched to format_float(). At mod/lesson/locallib.php G. Change the quiz_contains_the_following_questions() step to accept localised maxmark expectations. At mod/quiz/tests/behat/behat_mod_quiz.php H. Change the quiz generator so it accepts localised gradepass. At mod/quiz/tests/generator/lib.php I. Change the edit question form to show proper localised penalties, previously it was always showing point-decimal ones. Of course, leaving the values of the select element unmodified (internal floats). Related, also change a couple of tests to, instead of try to match the value (always internal floats), match the description (now localised), so we can test them with different separators. At: - question/type/ddimageortext/tests/behat/backup_and_restore.feature - question/type/ddmarker/tests/behat/backup_and_restore.feature - question/type/edit_question_form.php
579 lines
28 KiB
PHP
579 lines
28 KiB
PHP
<?php
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/**
|
|
* A moodleform to edit the grade options for an individual grade category
|
|
*
|
|
* @package core_grades
|
|
* @copyright 2007 Petr Skoda
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
if (!defined('MOODLE_INTERNAL')) {
|
|
die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page
|
|
}
|
|
|
|
require_once $CFG->libdir.'/formslib.php';
|
|
|
|
class edit_category_form extends moodleform {
|
|
private $aggregation_options = array();
|
|
|
|
function definition() {
|
|
global $CFG, $COURSE, $DB, $OUTPUT;
|
|
$mform =& $this->_form;
|
|
|
|
$category = $this->_customdata['current'];
|
|
|
|
$this->aggregation_options = grade_helper::get_aggregation_strings();
|
|
|
|
// visible elements
|
|
$mform->addElement('header', 'headercategory', get_string('gradecategory', 'grades'));
|
|
$mform->addElement('text', 'fullname', get_string('categoryname', 'grades'));
|
|
$mform->setType('fullname', PARAM_TEXT);
|
|
$mform->addRule('fullname', null, 'required', null, 'client');
|
|
|
|
$mform->addElement('select', 'aggregation', get_string('aggregation', 'grades'), $this->aggregation_options);
|
|
$mform->addHelpButton('aggregation', 'aggregation', 'grades');
|
|
|
|
if ((int)$CFG->grade_aggregation_flag & 2) {
|
|
$mform->setAdvanced('aggregation');
|
|
}
|
|
|
|
$mform->addElement('checkbox', 'aggregateonlygraded', get_string('aggregateonlygraded', 'grades'));
|
|
$mform->addHelpButton('aggregateonlygraded', 'aggregateonlygraded', 'grades');
|
|
|
|
if ((int)$CFG->grade_aggregateonlygraded_flag & 2) {
|
|
$mform->setAdvanced('aggregateonlygraded');
|
|
}
|
|
|
|
if (empty($CFG->enableoutcomes)) {
|
|
$mform->addElement('hidden', 'aggregateoutcomes');
|
|
$mform->setType('aggregateoutcomes', PARAM_INT);
|
|
} else {
|
|
$mform->addElement('checkbox', 'aggregateoutcomes', get_string('aggregateoutcomes', 'grades'));
|
|
$mform->addHelpButton('aggregateoutcomes', 'aggregateoutcomes', 'grades');
|
|
if ((int)$CFG->grade_aggregateoutcomes_flag & 2) {
|
|
$mform->setAdvanced('aggregateoutcomes');
|
|
}
|
|
}
|
|
|
|
$mform->addElement('text', 'keephigh', get_string('keephigh', 'grades'), 'size="3"');
|
|
$mform->setType('keephigh', PARAM_INT);
|
|
$mform->addHelpButton('keephigh', 'keephigh', 'grades');
|
|
if ((int)$CFG->grade_keephigh_flag & 2) {
|
|
$mform->setAdvanced('keephigh');
|
|
}
|
|
|
|
$mform->addElement('text', 'droplow', get_string('droplow', 'grades'), 'size="3"');
|
|
$mform->setType('droplow', PARAM_INT);
|
|
$mform->addHelpButton('droplow', 'droplow', 'grades');
|
|
$mform->disabledIf('droplow', 'keephigh', 'noteq', 0);
|
|
if ((int)$CFG->grade_droplow_flag & 2) {
|
|
$mform->setAdvanced('droplow');
|
|
}
|
|
|
|
$mform->disabledIf('keephigh', 'droplow', 'noteq', 0);
|
|
$mform->disabledIf('droplow', 'keephigh', 'noteq', 0);
|
|
|
|
// Grade item settings
|
|
// Displayed as Category total to avoid confusion between grade items requiring marking and category totals
|
|
$mform->addElement('header', 'general', get_string('categorytotal', 'grades'));
|
|
|
|
$mform->addElement('text', 'grade_item_itemname', get_string('categorytotalname', 'grades'));
|
|
$mform->setType('grade_item_itemname', PARAM_TEXT);
|
|
$mform->setAdvanced('grade_item_itemname');
|
|
|
|
$mform->addElement('text', 'grade_item_iteminfo', get_string('iteminfo', 'grades'));
|
|
$mform->addHelpButton('grade_item_iteminfo', 'iteminfo', 'grades');
|
|
$mform->setType('grade_item_iteminfo', PARAM_TEXT);
|
|
|
|
$mform->addElement('text', 'grade_item_idnumber', get_string('idnumbermod'));
|
|
$mform->addHelpButton('grade_item_idnumber', 'idnumbermod');
|
|
$mform->setType('grade_item_idnumber', PARAM_RAW);
|
|
|
|
if (!empty($category->id)) {
|
|
$gradecategory = grade_category::fetch(array('id' => $category->id));
|
|
$gradeitem = $gradecategory->load_grade_item();
|
|
|
|
// If grades exist set a message so the user knows why they can not alter the grade type or scale.
|
|
// We could never change the grade type for external items, so only need to show this for manual grade items.
|
|
if ($gradeitem->has_overridden_grades()) {
|
|
// Set a message so the user knows why the can not alter the grade type or scale.
|
|
if ($gradeitem->gradetype == GRADE_TYPE_SCALE) {
|
|
$gradesexistmsg = get_string('modgradecategorycantchangegradetyporscalemsg', 'grades');
|
|
} else {
|
|
$gradesexistmsg = get_string('modgradecategorycantchangegradetypemsg', 'grades');
|
|
}
|
|
$notification = new \core\output\notification($gradesexistmsg, \core\output\notification::NOTIFY_INFO);
|
|
$notification->set_show_closebutton(false);
|
|
$mform->addElement('static', 'gradesexistmsg', '', $OUTPUT->render($notification));
|
|
}
|
|
}
|
|
|
|
$options = array(GRADE_TYPE_NONE=>get_string('typenone', 'grades'),
|
|
GRADE_TYPE_VALUE=>get_string('typevalue', 'grades'),
|
|
GRADE_TYPE_SCALE=>get_string('typescale', 'grades'),
|
|
GRADE_TYPE_TEXT=>get_string('typetext', 'grades'));
|
|
|
|
$mform->addElement('select', 'grade_item_gradetype', get_string('gradetype', 'grades'), $options);
|
|
$mform->addHelpButton('grade_item_gradetype', 'gradetype', 'grades');
|
|
$mform->setDefault('grade_item_gradetype', GRADE_TYPE_VALUE);
|
|
$mform->disabledIf('grade_item_gradetype', 'aggregation', 'eq', GRADE_AGGREGATE_SUM);
|
|
|
|
//$mform->addElement('text', 'calculation', get_string('calculation', 'grades'));
|
|
//$mform->disabledIf('calculation', 'gradetype', 'eq', GRADE_TYPE_TEXT);
|
|
//$mform->disabledIf('calculation', 'gradetype', 'eq', GRADE_TYPE_NONE);
|
|
|
|
$options = array(0=>get_string('usenoscale', 'grades'));
|
|
if ($scales = grade_scale::fetch_all_local($COURSE->id)) {
|
|
foreach ($scales as $scale) {
|
|
$options[$scale->id] = $scale->get_name();
|
|
}
|
|
}
|
|
if ($scales = grade_scale::fetch_all_global()) {
|
|
foreach ($scales as $scale) {
|
|
$options[$scale->id] = $scale->get_name();
|
|
}
|
|
}
|
|
// ugly BC hack - it was possible to use custom scale from other courses :-(
|
|
if (!empty($category->grade_item_scaleid) and !isset($options[$category->grade_item_scaleid])) {
|
|
if ($scale = grade_scale::fetch(array('id'=>$category->grade_item_scaleid))) {
|
|
$options[$scale->id] = $scale->get_name().' '.get_string('incorrectcustomscale', 'grades');
|
|
}
|
|
}
|
|
$mform->addElement('select', 'grade_item_scaleid', get_string('scale'), $options);
|
|
$mform->addHelpButton('grade_item_scaleid', 'typescale', 'grades');
|
|
$mform->disabledIf('grade_item_scaleid', 'grade_item_gradetype', 'noteq', GRADE_TYPE_SCALE);
|
|
$mform->disabledIf('grade_item_scaleid', 'aggregation', 'eq', GRADE_AGGREGATE_SUM);
|
|
|
|
$choices = array();
|
|
$choices[''] = get_string('choose');
|
|
$choices['no'] = get_string('no');
|
|
$choices['yes'] = get_string('yes');
|
|
$mform->addElement('select', 'grade_item_rescalegrades', get_string('modgradecategoryrescalegrades', 'grades'), $choices);
|
|
$mform->addHelpButton('grade_item_rescalegrades', 'modgradecategoryrescalegrades', 'grades');
|
|
$mform->disabledIf('grade_item_rescalegrades', 'grade_item_gradetype', 'noteq', GRADE_TYPE_VALUE);
|
|
|
|
$mform->addElement('float', 'grade_item_grademax', get_string('grademax', 'grades'));
|
|
$mform->addHelpButton('grade_item_grademax', 'grademax', 'grades');
|
|
$mform->disabledIf('grade_item_grademax', 'grade_item_gradetype', 'noteq', GRADE_TYPE_VALUE);
|
|
$mform->disabledIf('grade_item_grademax', 'aggregation', 'eq', GRADE_AGGREGATE_SUM);
|
|
|
|
if ((bool) get_config('moodle', 'grade_report_showmin')) {
|
|
$mform->addElement('float', 'grade_item_grademin', get_string('grademin', 'grades'));
|
|
$mform->addHelpButton('grade_item_grademin', 'grademin', 'grades');
|
|
$mform->disabledIf('grade_item_grademin', 'grade_item_gradetype', 'noteq', GRADE_TYPE_VALUE);
|
|
$mform->disabledIf('grade_item_grademin', 'aggregation', 'eq', GRADE_AGGREGATE_SUM);
|
|
}
|
|
|
|
$mform->addElement('float', 'grade_item_gradepass', get_string('gradepass', 'grades'));
|
|
$mform->addHelpButton('grade_item_gradepass', 'gradepass', 'grades');
|
|
$mform->disabledIf('grade_item_gradepass', 'grade_item_gradetype', 'eq', GRADE_TYPE_NONE);
|
|
$mform->disabledIf('grade_item_gradepass', 'grade_item_gradetype', 'eq', GRADE_TYPE_TEXT);
|
|
|
|
/// grade display prefs
|
|
$default_gradedisplaytype = grade_get_setting($COURSE->id, 'displaytype', $CFG->grade_displaytype);
|
|
$options = array(GRADE_DISPLAY_TYPE_DEFAULT => get_string('default', 'grades'),
|
|
GRADE_DISPLAY_TYPE_REAL => get_string('real', 'grades'),
|
|
GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades'),
|
|
GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades'),
|
|
GRADE_DISPLAY_TYPE_REAL_PERCENTAGE => get_string('realpercentage', 'grades'),
|
|
GRADE_DISPLAY_TYPE_REAL_LETTER => get_string('realletter', 'grades'),
|
|
GRADE_DISPLAY_TYPE_LETTER_REAL => get_string('letterreal', 'grades'),
|
|
GRADE_DISPLAY_TYPE_LETTER_PERCENTAGE => get_string('letterpercentage', 'grades'),
|
|
GRADE_DISPLAY_TYPE_PERCENTAGE_LETTER => get_string('percentageletter', 'grades'),
|
|
GRADE_DISPLAY_TYPE_PERCENTAGE_REAL => get_string('percentagereal', 'grades')
|
|
);
|
|
|
|
asort($options);
|
|
|
|
foreach ($options as $key=>$option) {
|
|
if ($key == $default_gradedisplaytype) {
|
|
$options[GRADE_DISPLAY_TYPE_DEFAULT] = get_string('defaultprev', 'grades', $option);
|
|
break;
|
|
}
|
|
}
|
|
$mform->addElement('select', 'grade_item_display', get_string('gradedisplaytype', 'grades'), $options);
|
|
$mform->addHelpButton('grade_item_display', 'gradedisplaytype', 'grades');
|
|
$mform->disabledIf('grade_item_display', 'grade_item_gradetype', 'in',
|
|
array(GRADE_TYPE_TEXT, GRADE_TYPE_NONE));
|
|
|
|
$default_gradedecimals = grade_get_setting($COURSE->id, 'decimalpoints', $CFG->grade_decimalpoints);
|
|
$options = array(-1=>get_string('defaultprev', 'grades', $default_gradedecimals), 0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5);
|
|
$mform->addElement('select', 'grade_item_decimals', get_string('decimalpoints', 'grades'), $options);
|
|
$mform->addHelpButton('grade_item_decimals', 'decimalpoints', 'grades');
|
|
$mform->setDefault('grade_item_decimals', -1);
|
|
$mform->disabledIf('grade_item_decimals', 'grade_item_display', 'eq', GRADE_DISPLAY_TYPE_LETTER);
|
|
$mform->disabledIf('grade_item_decimals', 'grade_item_gradetype', 'in',
|
|
array(GRADE_TYPE_TEXT, GRADE_TYPE_NONE));
|
|
|
|
if ($default_gradedisplaytype == GRADE_DISPLAY_TYPE_LETTER) {
|
|
$mform->disabledIf('grade_item_decimals', 'grade_item_display', "eq", GRADE_DISPLAY_TYPE_DEFAULT);
|
|
}
|
|
|
|
/// hiding
|
|
// advcheckbox is not compatible with disabledIf!
|
|
$mform->addElement('checkbox', 'grade_item_hidden', get_string('hidden', 'grades'));
|
|
$mform->addHelpButton('grade_item_hidden', 'hidden', 'grades');
|
|
$mform->addElement('date_time_selector', 'grade_item_hiddenuntil', get_string('hiddenuntil', 'grades'), array('optional'=>true));
|
|
$mform->disabledIf('grade_item_hidden', 'grade_item_hiddenuntil[off]', 'notchecked');
|
|
|
|
/// locking
|
|
$mform->addElement('checkbox', 'grade_item_locked', get_string('locked', 'grades'));
|
|
$mform->addHelpButton('grade_item_locked', 'locked', 'grades');
|
|
|
|
$mform->addElement('date_time_selector', 'grade_item_locktime', get_string('locktime', 'grades'), array('optional'=>true));
|
|
$mform->disabledIf('grade_item_locktime', 'grade_item_gradetype', 'eq', GRADE_TYPE_NONE);
|
|
|
|
/// parent category related settings
|
|
$mform->addElement('header', 'headerparent', get_string('parentcategory', 'grades'));
|
|
|
|
$mform->addElement('advcheckbox', 'grade_item_weightoverride', get_string('adjustedweight', 'grades'));
|
|
$mform->addHelpButton('grade_item_weightoverride', 'weightoverride', 'grades');
|
|
|
|
$mform->addElement('float', 'grade_item_aggregationcoef2', get_string('weight', 'grades'));
|
|
$mform->addHelpButton('grade_item_aggregationcoef2', 'weight', 'grades');
|
|
$mform->disabledIf('grade_item_aggregationcoef2', 'grade_item_weightoverride');
|
|
|
|
$options = array();
|
|
$default = -1;
|
|
$categories = grade_category::fetch_all(array('courseid'=>$COURSE->id));
|
|
|
|
foreach ($categories as $cat) {
|
|
$cat->apply_forced_settings();
|
|
$options[$cat->id] = $cat->get_name();
|
|
if ($cat->is_course_category()) {
|
|
$default = $cat->id;
|
|
}
|
|
}
|
|
|
|
if (count($categories) > 1) {
|
|
$mform->addElement('select', 'parentcategory', get_string('parentcategory', 'grades'), $options);
|
|
$mform->setDefault('parentcategory', $default);
|
|
$mform->addElement('static', 'currentparentaggregation', get_string('currentparentaggregation', 'grades'));
|
|
}
|
|
|
|
// hidden params
|
|
$mform->addElement('hidden', 'id', 0);
|
|
$mform->setType('id', PARAM_INT);
|
|
|
|
$mform->addElement('hidden', 'courseid', 0);
|
|
$mform->setType('courseid', PARAM_INT);
|
|
|
|
/// add return tracking info
|
|
$gpr = $this->_customdata['gpr'];
|
|
$gpr->add_mform_elements($mform);
|
|
|
|
/// mark advanced according to site settings
|
|
if (isset($CFG->grade_item_advanced)) {
|
|
$advanced = explode(',', $CFG->grade_item_advanced);
|
|
foreach ($advanced as $el) {
|
|
$el = 'grade_item_'.$el;
|
|
if ($mform->elementExists($el)) {
|
|
$mform->setAdvanced($el);
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
// buttons
|
|
$this->add_action_buttons();
|
|
//-------------------------------------------------------------------------------
|
|
$this->set_data($category);
|
|
}
|
|
|
|
|
|
/// tweak the form - depending on existing data
|
|
function definition_after_data() {
|
|
global $CFG, $COURSE;
|
|
|
|
$mform =& $this->_form;
|
|
|
|
$somecat = new grade_category();
|
|
|
|
foreach ($somecat->forceable as $property) {
|
|
if ((int)$CFG->{"grade_{$property}_flag"} & 1) {
|
|
if ($mform->elementExists($property)) {
|
|
if (empty($CFG->grade_hideforcedsettings)) {
|
|
$mform->hardFreeze($property);
|
|
} else {
|
|
if ($mform->elementExists($property)) {
|
|
$mform->removeElement($property);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($CFG->grade_droplow > 0) {
|
|
if ($mform->elementExists('keephigh')) {
|
|
$mform->removeElement('keephigh');
|
|
}
|
|
} else if ($CFG->grade_keephigh > 0) {
|
|
if ($mform->elementExists('droplow')) {
|
|
$mform->removeElement('droplow');
|
|
}
|
|
}
|
|
|
|
if ($id = $mform->getElementValue('id')) {
|
|
$grade_category = grade_category::fetch(array('id'=>$id));
|
|
$grade_item = $grade_category->load_grade_item();
|
|
|
|
// remove agg coef if not used
|
|
if ($grade_category->is_course_category()) {
|
|
if ($mform->elementExists('parentcategory')) {
|
|
$mform->removeElement('parentcategory');
|
|
}
|
|
if ($mform->elementExists('currentparentaggregation')) {
|
|
$mform->removeElement('currentparentaggregation');
|
|
}
|
|
|
|
} else {
|
|
// if we wanted to change parent of existing category - we would have to verify there are no circular references in parents!!!
|
|
if ($mform->elementExists('parentcategory')) {
|
|
$mform->hardFreeze('parentcategory');
|
|
}
|
|
$parent_cat = $grade_category->get_parent_category();
|
|
$mform->setDefault('currentparentaggregation', $this->aggregation_options[$parent_cat->aggregation]);
|
|
|
|
}
|
|
|
|
// Prevent the user from using drop lowest/keep highest when the aggregation method cannot handle it.
|
|
if (!$grade_category->can_apply_limit_rules()) {
|
|
if ($mform->elementExists('keephigh')) {
|
|
$mform->setConstant('keephigh', 0);
|
|
$mform->hardFreeze('keephigh');
|
|
}
|
|
if ($mform->elementExists('droplow')) {
|
|
$mform->setConstant('droplow', 0);
|
|
$mform->hardFreeze('droplow');
|
|
}
|
|
}
|
|
|
|
if ($grade_item->is_calculated()) {
|
|
// following elements are ignored when calculation formula used
|
|
if ($mform->elementExists('aggregation')) {
|
|
$mform->removeElement('aggregation');
|
|
}
|
|
if ($mform->elementExists('keephigh')) {
|
|
$mform->removeElement('keephigh');
|
|
}
|
|
if ($mform->elementExists('droplow')) {
|
|
$mform->removeElement('droplow');
|
|
}
|
|
if ($mform->elementExists('aggregateonlygraded')) {
|
|
$mform->removeElement('aggregateonlygraded');
|
|
}
|
|
if ($mform->elementExists('aggregateoutcomes')) {
|
|
$mform->removeElement('aggregateoutcomes');
|
|
}
|
|
}
|
|
|
|
// If it is a course category, remove the "required" rule from the "fullname" element
|
|
if ($grade_category->is_course_category()) {
|
|
unset($mform->_rules['fullname']);
|
|
$key = array_search('fullname', $mform->_required);
|
|
unset($mform->_required[$key]);
|
|
}
|
|
|
|
// If it is a course category and its fullname is ?, show an empty field
|
|
if ($grade_category->is_course_category() && $mform->getElementValue('fullname') == '?') {
|
|
$mform->setDefault('fullname', '');
|
|
}
|
|
// remove unwanted aggregation options
|
|
if ($mform->elementExists('aggregation')) {
|
|
$allaggoptions = array_keys($this->aggregation_options);
|
|
$agg_el =& $mform->getElement('aggregation');
|
|
$visible = explode(',', $CFG->grade_aggregations_visible);
|
|
if (!is_null($grade_category->aggregation)) {
|
|
// current type is always visible
|
|
$visible[] = $grade_category->aggregation;
|
|
}
|
|
foreach ($allaggoptions as $type) {
|
|
if (!in_array($type, $visible)) {
|
|
$agg_el->removeOption($type);
|
|
}
|
|
}
|
|
}
|
|
|
|
} else {
|
|
// adding new category
|
|
if ($mform->elementExists('currentparentaggregation')) {
|
|
$mform->removeElement('currentparentaggregation');
|
|
}
|
|
// remove unwanted aggregation options
|
|
if ($mform->elementExists('aggregation')) {
|
|
$allaggoptions = array_keys($this->aggregation_options);
|
|
$agg_el =& $mform->getElement('aggregation');
|
|
$visible = explode(',', $CFG->grade_aggregations_visible);
|
|
foreach ($allaggoptions as $type) {
|
|
if (!in_array($type, $visible)) {
|
|
$agg_el->removeOption($type);
|
|
}
|
|
}
|
|
}
|
|
|
|
$mform->removeElement('grade_item_rescalegrades');
|
|
}
|
|
|
|
|
|
// no parent header for course category
|
|
if (!$mform->elementExists('parentcategory')) {
|
|
$mform->removeElement('headerparent');
|
|
}
|
|
|
|
/// GRADE ITEM
|
|
if ($id = $mform->getElementValue('id')) {
|
|
$grade_category = grade_category::fetch(array('id'=>$id));
|
|
$grade_item = $grade_category->load_grade_item();
|
|
|
|
$mform->setDefault('grade_item_hidden', (int) $grade_item->hidden);
|
|
|
|
if ($grade_item->is_outcome_item()) {
|
|
// we have to prevent incompatible modifications of outcomes if outcomes disabled
|
|
$mform->removeElement('grade_item_grademax');
|
|
if ($mform->elementExists('grade_item_grademin')) {
|
|
$mform->removeElement('grade_item_grademin');
|
|
}
|
|
$mform->removeElement('grade_item_gradetype');
|
|
$mform->removeElement('grade_item_display');
|
|
$mform->removeElement('grade_item_decimals');
|
|
$mform->hardFreeze('grade_item_scaleid');
|
|
// Only show the option to rescale grades on a category if its corresponding grade_item has overridden grade_grades.
|
|
} else if ($grade_item->has_overridden_grades()) {
|
|
// Can't change the grade type or the scale if there are grades.
|
|
$mform->hardFreeze('grade_item_gradetype, grade_item_scaleid');
|
|
|
|
// If we are using scles then remove the unnecessary rescale and grade fields.
|
|
if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
|
|
$mform->removeElement('grade_item_rescalegrades');
|
|
$mform->removeElement('grade_item_grademax');
|
|
if ($mform->elementExists('grade_item_grademin')) {
|
|
$mform->removeElement('grade_item_grademin');
|
|
}
|
|
} else { // Not using scale, so remove it.
|
|
$mform->removeElement('grade_item_scaleid');
|
|
$mform->disabledIf('grade_item_grademax', 'grade_item_rescalegrades', 'eq', '');
|
|
$mform->disabledIf('grade_item_grademin', 'grade_item_rescalegrades', 'eq', '');
|
|
}
|
|
} else { // Remove the rescale element if there are no grades.
|
|
$mform->removeElement('grade_item_rescalegrades');
|
|
}
|
|
|
|
//remove the aggregation coef element if not needed
|
|
if ($grade_item->is_course_item()) {
|
|
if ($mform->elementExists('grade_item_aggregationcoef')) {
|
|
$mform->removeElement('grade_item_aggregationcoef');
|
|
}
|
|
|
|
if ($mform->elementExists('grade_item_weightoverride')) {
|
|
$mform->removeElement('grade_item_weightoverride');
|
|
}
|
|
if ($mform->elementExists('grade_item_aggregationcoef2')) {
|
|
$mform->removeElement('grade_item_aggregationcoef2');
|
|
}
|
|
} else {
|
|
if ($grade_item->is_category_item()) {
|
|
$category = $grade_item->get_item_category();
|
|
$parent_category = $category->get_parent_category();
|
|
} else {
|
|
$parent_category = $grade_item->get_parent_category();
|
|
}
|
|
|
|
$parent_category->apply_forced_settings();
|
|
|
|
if (!$parent_category->is_aggregationcoef_used()) {
|
|
if ($mform->elementExists('grade_item_aggregationcoef')) {
|
|
$mform->removeElement('grade_item_aggregationcoef');
|
|
}
|
|
} else {
|
|
|
|
$coefstring = $grade_item->get_coefstring();
|
|
|
|
if ($coefstring == 'aggregationcoefextrasum' || $coefstring == 'aggregationcoefextraweightsum') {
|
|
// advcheckbox is not compatible with disabledIf!
|
|
$coefstring = 'aggregationcoefextrasum';
|
|
$element =& $mform->createElement('checkbox', 'grade_item_aggregationcoef', get_string($coefstring, 'grades'));
|
|
} else {
|
|
$element =& $mform->createElement('text', 'grade_item_aggregationcoef', get_string($coefstring, 'grades'));
|
|
}
|
|
$mform->insertElementBefore($element, 'parentcategory');
|
|
$mform->addHelpButton('grade_item_aggregationcoef', $coefstring, 'grades');
|
|
}
|
|
|
|
// Remove fields used by natural weighting if the parent category is not using natural weighting.
|
|
// Or if the item is a scale and scales are not used in aggregation.
|
|
if ($parent_category->aggregation != GRADE_AGGREGATE_SUM
|
|
|| (empty($CFG->grade_includescalesinaggregation) && $grade_item->gradetype == GRADE_TYPE_SCALE)) {
|
|
if ($mform->elementExists('grade_item_weightoverride')) {
|
|
$mform->removeElement('grade_item_weightoverride');
|
|
}
|
|
if ($mform->elementExists('grade_item_aggregationcoef2')) {
|
|
$mform->removeElement('grade_item_aggregationcoef2');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// perform extra validation before submission
|
|
function validation($data, $files) {
|
|
global $COURSE;
|
|
$gradeitem = false;
|
|
if ($data['id']) {
|
|
$gradecategory = grade_category::fetch(array('id' => $data['id']));
|
|
$gradeitem = $gradecategory->load_grade_item();
|
|
}
|
|
|
|
$errors = parent::validation($data, $files);
|
|
|
|
if (array_key_exists('grade_item_gradetype', $data) and $data['grade_item_gradetype'] == GRADE_TYPE_SCALE) {
|
|
if (empty($data['grade_item_scaleid'])) {
|
|
$errors['grade_item_scaleid'] = get_string('missingscale', 'grades');
|
|
}
|
|
}
|
|
|
|
// We need to make all the validations related with grademax and grademin
|
|
// with them being correct floats, keeping the originals unmodified for
|
|
// later validations / showing the form back...
|
|
// TODO: Note that once MDL-73994 is fixed we'll have to re-visit this and
|
|
// adapt the code below to the new values arriving here, without forgetting
|
|
// the special case of empties and nulls.
|
|
$grademax = isset($data['grade_item_grademax']) ? unformat_float($data['grade_item_grademax']) : null;
|
|
$grademin = isset($data['grade_item_grademin']) ? unformat_float($data['grade_item_grademin']) : null;
|
|
|
|
if (!is_null($grademin) and !is_null($grademax)) {
|
|
if (($grademax != 0 OR $grademin != 0) AND
|
|
($grademax == $grademin OR $grademax < $grademin)) {
|
|
$errors['grade_item_grademin'] = get_string('incorrectminmax', 'grades');
|
|
$errors['grade_item_grademax'] = get_string('incorrectminmax', 'grades');
|
|
}
|
|
}
|
|
|
|
if ($data['id'] && $gradeitem->has_overridden_grades()) {
|
|
if ($gradeitem->gradetype == GRADE_TYPE_VALUE) {
|
|
if (grade_floats_different($grademin, $gradeitem->grademin) ||
|
|
grade_floats_different($grademax, $gradeitem->grademax)) {
|
|
if (empty($data['grade_item_rescalegrades'])) {
|
|
$errors['grade_item_rescalegrades'] = get_string('mustchooserescaleyesorno', 'grades');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $errors;
|
|
}
|
|
}
|