Moodle  2.2.1
http://www.collinsharper.com
C:/xampp/htdocs/moodle/grade/edit/tree/grade.php
Go to the documentation of this file.
00001 <?php
00002 
00003 // This file is part of Moodle - http://moodle.org/
00004 //
00005 // Moodle is free software: you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License as published by
00007 // the Free Software Foundation, either version 3 of the License, or
00008 // (at your option) any later version.
00009 //
00010 // Moodle is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
00017 
00018 require_once '../../../config.php';
00019 require_once $CFG->dirroot.'/grade/lib.php';
00020 require_once $CFG->dirroot.'/grade/report/lib.php';
00021 require_once 'grade_form.php';
00022 
00023 $courseid = required_param('courseid', PARAM_INT);
00024 $id       = optional_param('id', 0, PARAM_INT);
00025 $itemid   = optional_param('itemid', 0, PARAM_INT);
00026 $userid   = optional_param('userid', 0, PARAM_INT);
00027 
00028 $url = new moodle_url('/grade/edit/tree/grade.php', array('courseid'=>$courseid));
00029 if ($id !== 0) {
00030     $url->param('id', $id);
00031 }
00032 if ($itemid !== 0) {
00033     $url->param('itemid', $itemid);
00034 }
00035 if ($userid !== 0) {
00036     $url->param('userid', $userid);
00037 }
00038 $PAGE->set_url($url);
00039 
00040 if (!$course = $DB->get_record('course', array('id' => $courseid))) {
00041     print_error('nocourseid');
00042 }
00043 
00044 $PAGE->set_pagelayout('incourse');
00045 require_login($course);
00046 $context = get_context_instance(CONTEXT_COURSE, $course->id);
00047 if (!has_capability('moodle/grade:manage', $context)) {
00048     require_capability('moodle/grade:edit', $context);
00049 }
00050 
00051 // default return url
00052 $gpr = new grade_plugin_return();
00053 $returnurl = $gpr->get_return_url($CFG->wwwroot.'/grade/report.php?id='.$course->id);
00054 
00055 // security checks!
00056 if (!empty($id)) {
00057     if (!$grade = $DB->get_record('grade_grades', array('id' => $id))) {
00058         print_error('invalidgroupid');
00059     }
00060 
00061     if (!empty($itemid) and $itemid != $grade->itemid) {
00062         print_error('invaliditemid');
00063     }
00064     $itemid = $grade->itemid;
00065 
00066     if (!empty($userid) and $userid != $grade->userid) {
00067         print_error('invaliduser');
00068     }
00069     $userid = $grade->userid;
00070 
00071     unset($grade);
00072 
00073 } else if (empty($userid) or empty($itemid)) {
00074     print_error('missinguseranditemid');
00075 }
00076 
00077 if (!$grade_item = grade_item::fetch(array('id'=>$itemid, 'courseid'=>$courseid))) {
00078     print_error('cannotfindgradeitem');
00079 }
00080 
00081 // now verify grading user has access to all groups or is member of the same group when separate groups used in course
00082 if (groups_get_course_groupmode($COURSE) == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
00083     if ($groups = groups_get_all_groups($COURSE->id, $userid)) {
00084         $ok = false;
00085         foreach ($groups as $group) {
00086             if (groups_is_member($group->id, $USER->id)) {
00087                 $ok = true;
00088             }
00089         }
00090         if (!$ok) {
00091             print_error('cannotgradeuser');
00092         }
00093     } else {
00094         print_error('cannotgradeuser');
00095     }
00096 }
00097 
00098 $mform = new edit_grade_form(null, array('grade_item'=>$grade_item, 'gpr'=>$gpr));
00099 
00100 if ($grade = $DB->get_record('grade_grades', array('itemid' => $grade_item->id, 'userid' => $userid))) {
00101 
00102     // always clean existing feedback - grading should not have XSS risk
00103     if (can_use_html_editor()) {
00104         if (empty($grade->feedback)) {
00105             $grade->feedback  = '';
00106         } else {
00107             $options = new stdClass();
00108             $options->smiley  = false;
00109             $options->filter  = false;
00110             $options->noclean = false;
00111             $options->para    = false;
00112             $grade->feedback  = format_text($grade->feedback, $grade->feedbackformat, $options);
00113         }
00114         $grade->feedbackformat = FORMAT_HTML;
00115     } else {
00116         $grade->feedback       = clean_text($grade->feedback, $grade->feedbackformat);
00117     }
00118 
00119     $grade->locked      = $grade->locked     > 0 ? 1:0;
00120     $grade->overridden  = $grade->overridden > 0 ? 1:0;
00121     $grade->excluded    = $grade->excluded   > 0 ? 1:0;
00122 
00123     if ($grade->hidden > 1) {
00124         $grade->hiddenuntil = $grade->hidden;
00125         $grade->hidden = 1;
00126     } else {
00127         $grade->hiddenuntil = 0;
00128     }
00129 
00130     if ($grade_item->is_hidden()) {
00131         $grade->hidden = 1;
00132     }
00133 
00134     if ($grade_item->is_locked()) {
00135         $grade->locked = 1;
00136     }
00137 
00138     // normalize the final grade value
00139     if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
00140         if (empty($grade->finalgrade)) {
00141             $grade->finalgrade = -1;
00142         } else {
00143             $grade->finalgrade = (int)$grade->finalgrade;
00144         }
00145     } else if ($grade_item->gradetype == GRADE_TYPE_VALUE) {
00146         $grade->finalgrade = format_float($grade->finalgrade, $grade_item->get_decimals());
00147     }
00148 
00149     $grade->oldgrade    = $grade->finalgrade;
00150     $grade->oldfeedback = $grade->feedback;
00151 
00152     $grade->feedback = array('text'=>$grade->feedback, 'format'=>$grade->feedbackformat);
00153 
00154     $mform->set_data($grade);
00155 } else {
00156     $grade->feedback = array('text'=>'', 'format'=>FORMAT_HTML);
00157     $mform->set_data(array('itemid'=>$itemid, 'userid'=>$userid, 'locked'=>$grade_item->locked, 'locktime'=>$grade_item->locktime));
00158 }
00159 
00160 if ($mform->is_cancelled()) {
00161     redirect($returnurl);
00162 
00163 // form processing
00164 } else if ($data = $mform->get_data(false)) {
00165 
00166     if (is_array($data->feedback)) {
00167         $data->feedbackformat = $data->feedback['format'];
00168         $data->feedback = $data->feedback['text'];
00169     }
00170 
00171     $old_grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true); //might not exist yet
00172 
00173     // fix no grade for scales
00174     if (!isset($data->finalgrade) or $data->finalgrade == $data->oldgrade) {
00175         $data->finalgrade = $old_grade_grade->finalgrade;
00176 
00177     } else if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
00178         if ($data->finalgrade < 1) {
00179             $data->finalgrade = NULL;
00180         }
00181 
00182     } else if ($grade_item->gradetype == GRADE_TYPE_VALUE) {
00183         $data->finalgrade = unformat_float($data->finalgrade);
00184 
00185     } else {
00186         //this should not happen
00187         $data->finalgrade = $old_grade_grade->finalgrade;
00188     }
00189 
00190     // the overriding of feedback is tricky - we have to care about external items only
00191     if (!property_exists($data, 'feedback') or $data->feedback == $data->oldfeedback) {
00192         $data->feedback       = $old_grade_grade->feedback;
00193         $data->feedbackformat = $old_grade_grade->feedbackformat;
00194     }
00195     // update final grade or feedback
00196     $grade_item->update_final_grade($data->userid, $data->finalgrade, 'editgrade', $data->feedback, $data->feedbackformat);
00197 
00198     $grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true);
00199     $grade_grade->grade_item =& $grade_item; // no db fetching
00200 
00201     if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:edit', $context)) {
00202         if (!grade_floats_different($data->finalgrade, $old_grade_grade->finalgrade)
00203           and $data->feedback === $old_grade_grade->feedback) {
00204             // change overridden flag only if grade or feedback not changed
00205             if (!isset($data->overridden)) {
00206                 $data->overridden = 0; // checkbox
00207             }
00208             $grade_grade->set_overridden($data->overridden);
00209         }
00210     }
00211 
00212     if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:hide', $context)) {
00213         $hidden      = empty($data->hidden) ? 0: $data->hidden;
00214         $hiddenuntil = empty($data->hiddenuntil) ? 0: $data->hiddenuntil;
00215 
00216         if ($grade_item->is_hidden()) {
00217             if ($old_grade_grade->hidden == 1 and $hiddenuntil == 0) {
00218                 //nothing to do - grade was originally hidden, we want to keep it that way
00219             } else {
00220                 $grade_grade->set_hidden($hiddenuntil);
00221             }
00222         } else {
00223             if ($hiddenuntil) {
00224                 $grade_grade->set_hidden($hiddenuntil);
00225             } else {
00226                 $grade_grade->set_hidden($hidden); // checkbox data might be undefined
00227             }
00228         }
00229     }
00230 
00231     if (isset($data->locked) and !$grade_item->is_locked()) {
00232         if (($old_grade_grade->locked or $old_grade_grade->locktime)
00233           and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:unlock', $context))) {
00234             //ignore data
00235 
00236         } else if ((!$old_grade_grade->locked and !$old_grade_grade->locktime)
00237           and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:lock', $context))) {
00238             //ignore data
00239 
00240         } else {
00241             $grade_grade->set_locktime($data->locktime); //set_lock may reset locktime
00242             $grade_grade->set_locked($data->locked, false, true);
00243             // reload grade in case it was regraded from activity
00244             $grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true);
00245             $grade_grade->grade_item =& $grade_item; // no db fetching
00246         }
00247     }
00248 
00249     if (isset($data->excluded) and has_capability('moodle/grade:manage', $context)) {
00250         $grade_grade->set_excluded($data->excluded);
00251     }
00252 
00253     // detect cases when we need to do full regrading
00254     if ($old_grade_grade->excluded != $grade_grade->excluded) {
00255         $parent = $grade_item->get_parent_category();
00256         $parent->force_regrading();
00257 
00258     } else if ($old_grade_grade->overridden != $grade_grade->overridden and empty($grade_grade->overridden)) { // only when unoverridding
00259         $grade_item->force_regrading();
00260 
00261     } else if ($old_grade_grade->locktime != $grade_grade->locktime) {
00262         $grade_item->force_regrading();
00263     }
00264 
00265     redirect($returnurl);
00266 }
00267 
00268 $strgrades       = get_string('grades');
00269 $strgraderreport = get_string('graderreport', 'grades');
00270 $strgradeedit    = get_string('editgrade', 'grades');
00271 $struser         = get_string('user');
00272 
00273 grade_build_nav(__FILE__, $strgradeedit, array('courseid' => $courseid));
00274 
00275 /*********** BEGIN OUTPUT *************/
00276 $PAGE->set_title($strgrades . ': ' . $strgraderreport . ': ' . $strgradeedit);
00277 $PAGE->set_heading($course->fullname);
00278 
00279 echo $OUTPUT->header();
00280 echo $OUTPUT->heading($strgradeedit);
00281 
00282 echo $OUTPUT->box_start();
00283 
00284 // Form if in edit or add modes
00285 $mform->display();
00286 
00287 echo $OUTPUT->box_end();
00288 
00289 echo $OUTPUT->footer();
00290 die;
 All Data Structures Namespaces Files Functions Variables Enumerations