📄 lib.php
字号:
$hidden = ' hidden '; } $headerlink = $this->gtree->get_element_header($element, true, $this->get_pref('showactivityicons'), false); $headerhtml .= '<th class="header '.$columnclass.' '.$type.$catlevel.$hidden.'" scope="col" onclick="set_col(this.cellIndex)">' . shorten_text($headerlink) . $arrow; $headerhtml .= '</th>'; } } $headerhtml .= '</tr>'; } return $headerhtml; } /** * Builds and return the HTML rows of the table (grades headed by student). * @return string HTML */ function get_studentshtml() { global $CFG, $USER; $studentshtml = ''; $strfeedback = $this->get_lang_string("feedback"); $strgrade = $this->get_lang_string('grade'); $gradetabindex = 1; $showuserimage = $this->get_pref('showuserimage'); $showuseridnumber = $this->get_pref('showuseridnumber'); $numusers = count($this->users); // Preload scale objects for items with a scaleid $scales_list = ''; $tabindices = array(); foreach ($this->gtree->items as $item) { if (!empty($item->scaleid)) { $scales_list .= "$item->scaleid,"; } $tabindices[$item->id]['grade'] = $gradetabindex; $tabindices[$item->id]['feedback'] = $gradetabindex + $numusers; $gradetabindex += $numusers * 2; } $scales_array = array(); if (!empty($scales_list)) { $scales_list = substr($scales_list, 0, -1); $scales_array = get_records_list('scale', 'id', $scales_list); } $row_classes = array(' even ', ' odd '); $row_classes = array(' even ', ' odd '); foreach ($this->users as $userid => $user) { if ($this->canviewhidden) { $altered = array(); $unknown = array(); } else { $hiding_affected = grade_grade::get_hiding_affected($this->grades[$userid], $this->gtree->items); $altered = $hiding_affected['altered']; $unknown = $hiding_affected['unknown']; unset($hiding_affected); } $columncount = 0; // Student name and link $user_pic = null; if ($showuserimage) { $user_pic = '<div class="userpic">' . print_user_picture($user, $this->courseid, NULL, 0, true) . '</div>'; } $studentshtml .= '<tr class="r'.$this->rowcount++ . $row_classes[$this->rowcount % 2] . '">' .'<th class="header c'.$columncount++.' user" scope="row" onclick="set_row(this.parentNode.rowIndex);">'.$user_pic .'<a href="'.$CFG->wwwroot.'/user/view.php?id='.$user->id.'&course='.$this->course->id.'">' .fullname($user).'</a></th>'; if ($showuseridnumber) { $studentshtml .= '<th class="header c'.$columncount++.' useridnumber" onclick="set_row(this.parentNode.rowIndex);">'. $user->idnumber.'</th>'; } foreach ($this->gtree->items as $itemid=>$unused) { $item =& $this->gtree->items[$itemid]; $grade = $this->grades[$userid][$item->id]; // Get the decimal points preference for this item $decimalpoints = $item->get_decimals(); if (in_array($itemid, $unknown)) { $gradeval = null; } else if (array_key_exists($itemid, $altered)) { $gradeval = $altered[$itemid]; } else { $gradeval = $grade->finalgrade; } // MDL-11274 // Hide grades in the grader report if the current grader doesn't have 'moodle/grade:viewhidden' if (!$this->canviewhidden and $grade->is_hidden()) { if (!empty($CFG->grade_hiddenasdate) and $grade->get_datesubmitted() and !$item->is_category_item() and !$item->is_course_item()) { // the problem here is that we do not have the time when grade value was modified, 'timemodified' is general modification date for grade_grades records $studentshtml .= '<td class="cell c'.$columncount++.'"><span class="datesubmitted">'.userdate($grade->get_datesubmitted(),get_string('strftimedatetimeshort')).'</span></td>'; } else { $studentshtml .= '<td class="cell c'.$columncount++.'">-</td>'; } continue; } // emulate grade element $eid = $this->gtree->get_grade_eid($grade); $element = array('eid'=>$eid, 'object'=>$grade, 'type'=>'grade'); $cellclasses = 'cell c'.$columncount++; if ($item->is_category_item()) { $cellclasses .= ' cat'; } if ($item->is_course_item()) { $cellclasses .= ' course'; } if ($grade->is_overridden()) { $cellclasses .= ' overridden'; } if ($grade->is_excluded()) { $cellclasses .= ' excluded'; } $studentshtml .= '<td class="'.$cellclasses.'">'; if ($grade->is_excluded()) { $studentshtml .= get_string('excluded', 'grades') . ' '; } // Do not show any icons if no grade (no record in DB to match) if (!$item->needsupdate and $USER->gradeediting[$this->courseid]) { $studentshtml .= $this->get_icons($element); } $hidden = ''; if ($grade->is_hidden()) { $hidden = ' hidden '; } $gradepass = ' gradefail '; if ($grade->is_passed($item)) { $gradepass = ' gradepass '; } elseif (is_null($grade->is_passed($item))) { $gradepass = ''; } // if in editting mode, we need to print either a text box // or a drop down (for scales) // grades in item of type grade category or course are not directly editable if ($item->needsupdate) { $studentshtml .= '<span class="gradingerror'.$hidden.'">'.get_string('error').'</span>'; } else if ($USER->gradeediting[$this->courseid]) { if ($item->scaleid && !empty($scales_array[$item->scaleid])) { $scale = $scales_array[$item->scaleid]; $gradeval = (int)$gradeval; // scales use only integers $scales = explode(",", $scale->scale); // reindex because scale is off 1 // MDL-12104 some previous scales might have taken up part of the array // so this needs to be reset $scaleopt = array(); $i = 0; foreach ($scales as $scaleoption) { $i++; $scaleopt[$i] = $scaleoption; } if ($this->get_pref('quickgrading') and $grade->is_editable()) { $oldval = empty($gradeval) ? -1 : $gradeval; if (empty($item->outcomeid)) { $nogradestr = $this->get_lang_string('nograde'); } else { $nogradestr = $this->get_lang_string('nooutcome', 'grades'); } $studentshtml .= '<input type="hidden" name="oldgrade_'.$userid.'_' .$item->id.'" value="'.$oldval.'"/>'; $studentshtml .= choose_from_menu($scaleopt, 'grade_'.$userid.'_'.$item->id, $gradeval, $nogradestr, '', '-1', true, false, $tabindices[$item->id]['grade']); } elseif(!empty($scale)) { $scales = explode(",", $scale->scale); // invalid grade if gradeval < 1 if ($gradeval < 1) { $studentshtml .= '<span class="gradevalue'.$hidden.$gradepass.'">-</span>'; } else { $gradeval = (int)bounded_number($grade->grade_item->grademin, $gradeval, $grade->grade_item->grademax); //just in case somebody changes scale $studentshtml .= '<span class="gradevalue'.$hidden.$gradepass.'">'.$scales[$gradeval-1].'</span>'; } } else { // no such scale, throw error? } } else if ($item->gradetype != GRADE_TYPE_TEXT) { // Value type if ($this->get_pref('quickgrading') and $grade->is_editable()) { $value = format_float($gradeval, $decimalpoints); $studentshtml .= '<input type="hidden" name="oldgrade_'.$userid.'_'.$item->id.'" value="'.$value.'" />'; $studentshtml .= '<input size="6" tabindex="' . $tabindices[$item->id]['grade'] . '" type="text" title="'. $strgrade .'" name="grade_' .$userid.'_' .$item->id.'" value="'.$value.'" />'; } else { $studentshtml .= '<span class="gradevalue'.$hidden.$gradepass.'">'.format_float($gradeval, $decimalpoints).'</span>'; } } // If quickfeedback is on, print an input element if ($this->get_pref('showquickfeedback') and $grade->is_editable()) { if ($this->get_pref('quickgrading')) { $studentshtml .= '<br />'; } $studentshtml .= '<input type="hidden" name="oldfeedback_' .$userid.'_'.$item->id.'" value="' . s($grade->feedback) . '" />'; $studentshtml .= '<input class="quickfeedback" tabindex="' . $tabindices[$item->id]['feedback'] . '" size="6" title="' . $strfeedback . '" type="text" name="feedback_' .$userid.'_'.$item->id.'" value="' . s($grade->feedback) . '" />'; } } else { // Not editing $gradedisplaytype = $item->get_displaytype(); // If feedback present, surround grade with feedback tooltip: Open span here if (!empty($grade->feedback)) { $overlib = ''; $feedback = addslashes_js(trim(format_string($grade->feedback, $grade->feedbackformat))); $overlib = "return overlib('$feedback', BORDER, 0, FGCLASS, 'feedback', " ."CAPTIONFONTCLASS, 'caption', CAPTION, '$strfeedback');"; $studentshtml .= '<span onmouseover="'.s($overlib).'" onmouseout="return nd();">'; } if ($item->needsupdate) { $studentshtml .= '<span class="gradingerror'.$hidden.$gradepass.'">'.get_string('error').'</span>'; } else { $studentshtml .= '<span class="gradevalue'.$hidden.$gradepass.'">'.grade_format_gradevalue($gradeval, $item, true, $gradedisplaytype, null).'</span>'; } // Close feedback span if (!empty($grade->feedback)) { $studentshtml .= '</span>'; } } if (!empty($this->gradeserror[$item->id][$userid])) { $studentshtml .= $this->gradeserror[$item->id][$userid]; } $studentshtml .= '</td>' . "\n"; } $studentshtml .= '</tr>'; } return $studentshtml; } /** * Builds and return the HTML row of column totals. * @param bool $grouponly Whether to return only group averages or all averages. * @return string HTML */ function get_avghtml($grouponly=false) { global $CFG, $USER; if (!$this->canviewhidden) { // totals might be affected by hiding, if user can not see hidden grades the aggregations might be altered // better not show them at all if user can not see all hideen grades return; } $averagesdisplaytype = $this->get_pref('averagesdisplaytype'); $averagesdecimalpoints = $this->get_pref('averagesdecimalpoints'); $meanselection = $this->get_pref('meanselection'); $shownumberofgrades = $this->get_pref('shownumberofgrades'); $showuseridnumber = $this->get_pref('showuseridnumber'); $avghtml = ''; $avgcssclass = 'avg'; if ($grouponly) { $straverage = get_string('groupavg', 'grades'); $showaverages = $this->currentgroup && $this->get_pref('showgroups'); $groupsql = $this->groupsql; $groupwheresql = $this->groupwheresql; $avgcssclass = 'groupavg'; } else { $straverage = get_string('overallaverage', 'grades'); $showaverages = $this->get_pref('showaverages'); $groupsql = ""; $groupwheresql = ""; } if ($shownumberofgrades) { $straverage .= ' (' . get_string('submissions', 'grades') . ') '; } $totalcount = $this->get_numusers($grouponly); if ($showaverages) { // find sums of all grade items in course $SQL = "SELECT g.itemid, SUM(g.finalgrade) AS sum FROM {$CFG->prefix}grade_items gi JOIN {$CFG->prefix}grade_grades g ON g.itemid = gi.id JOIN {$CFG->prefix}user u ON u.id = g.userid
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -