function geogebra_view_results($geogebra, $context, $cm, $course, $action) { global $CFG, $DB, $OUTPUT, $PAGE, $USER; if ($action == 'submitgrade') { // Upgrade submitted grade $grade = optional_param('grade', '', PARAM_INT); $gradecomment = optional_param_array('comment_editor', '', PARAM_RAW); $attemptid = optional_param('attemptid', '', PARAM_INT); $attempt = geogebra_get_attempt($attemptid); parse_str($attempt->vars, $parsedvars); $parsedvars['grade'] = $grade; $attempt->vars = http_build_query($parsedvars, '', '&'); geogebra_update_attempt($attemptid, $attempt->vars, GEOGEBRA_UPDATE_TEACHER, $gradecomment['text']); } // Show students list with their results require_once $CFG->libdir . '/gradelib.php'; $perpage = optional_param('perpage', 10, PARAM_INT); $perpage = $perpage <= 0 ? 10 : $perpage; $page = optional_param('page', 0, PARAM_INT); // Find out current groups mode $groupmode = groups_get_activity_groupmode($cm); $currentgroup = groups_get_activity_group($cm, true); // Get all ppl that are allowed to submit geogebra list($esql, $params) = get_enrolled_sql($context, 'mod/geogebra:submit', $currentgroup); $sql = "SELECT u.id FROM {user} u " . "LEFT JOIN ({$esql}) eu ON eu.id=u.id " . "WHERE u.deleted = 0 AND eu.id=u.id "; $users = $DB->get_records_sql($sql, $params); if (!empty($users)) { $users = array_keys($users); } // If groupmembersonly used, remove users who are not in any group if ($users and !empty($CFG->enablegroupmembersonly) and $cm->groupmembersonly) { if ($groupingusers = groups_get_grouping_members($cm->groupingid, 'u.id', 'u.id')) { $users = array_intersect($users, array_keys($groupingusers)); } } // TODO: Review to show all users information if (!empty($users)) { // Create results table $extrafields = get_extra_user_fields($context); $tablecolumns = array_merge(array('picture', 'fullname'), $extrafields, array('attempts', 'duration', 'grade', 'comment', 'datestudent', 'dateteacher', 'status')); $extrafieldnames = array(); foreach ($extrafields as $field) { $extrafieldnames[] = get_user_field_name($field); } $tableheaders = array_merge(array('', get_string('fullnameuser')), $extrafieldnames, array(get_string('attempts', 'geogebra'), get_string('duration', 'geogebra'), get_string('grade'), get_string('comment', 'geogebra'), get_string('lastmodifiedsubmission', 'geogebra'), get_string('lastmodifiedgrade', 'geogebra'), get_string('status', 'geogebra'))); require_once $CFG->libdir . '/tablelib.php'; $table = new flexible_table('mod-geogebra-results'); $table->define_columns($tablecolumns); $table->define_headers($tableheaders); $table->define_baseurl($CFG->wwwroot . '/mod/geogebra/report.php?id=' . $cm->id . '&currentgroup=' . $currentgroup); $table->sortable(true, 'lastname'); // Sorted by lastname by default $table->collapsible(true); $table->initialbars(true); $table->column_suppress('picture'); $table->column_suppress('fullname'); $table->column_class('picture', 'picture'); $table->column_class('fullname', 'fullname'); foreach ($extrafields as $field) { $table->column_class($field, $field); } $table->set_attribute('cellspacing', '0'); $table->set_attribute('id', 'attempts'); $table->set_attribute('class', 'results generaltable generalbox'); $table->set_attribute('width', '100%'); $table->no_sorting('attempts'); $table->no_sorting('duration'); $table->no_sorting('grade'); $table->no_sorting('comment'); $table->no_sorting('datestudent'); $table->no_sorting('dateteacher'); $table->no_sorting('status'); // Start working -- this is necessary as soon as the niceties are over $table->setup(); // Construct the SQL list($where, $params) = $table->get_sql_where(); if ($where) { $where .= ' AND '; } if ($sort = $table->get_sql_sort()) { $sort = ' ORDER BY ' . $sort; } $ufields = user_picture::fields('u', $extrafields); $select = "SELECT {$ufields} "; $sql = 'FROM {user} u WHERE ' . $where . 'u.id IN (' . implode(',', $users) . ') '; $ausers = $DB->get_records_sql($select . $sql . $sort, $params, $table->get_page_start(), $table->get_page_size()); $table->pagesize($perpage, count($users)); $offset = $page * $perpage; // Offset used to calculate index of student in that particular query, needed for the pop up to know who's next if ($ausers !== false) { // $grading_info = grade_get_grades($course->id, 'mod', 'geogebra', $geogebra->id, array_keys($ausers)); foreach ($ausers as $auser) { $picture = $OUTPUT->user_picture($auser); $userlink = '<a href="' . $CFG->wwwroot . '/user/view.php?id=' . $auser->id . '&course=' . $course->id . '">' . fullname($auser, has_capability('moodle/site:viewfullnames', $context)) . '</a>'; $row = array($picture, $userlink); $extradata = array(); foreach ($extrafields as $field) { $extradata[] = $auser->{$field}; } $row += $extradata; // Attempts summary $attempts = geogebra_get_user_attempts($geogebra->id, $auser->id); $attemptssummary = geogebra_get_user_grades($geogebra, $auser->id); if ($attemptssummary) { $row[] = $attemptssummary->attempts; $row[] = geogebra_time2str($attemptssummary->duration); $row[] = $attemptssummary->grade; $rowclass = $attemptssummary->attempts > 0 ? 'summary-row' : ""; } else { $row[] = ""; $row[] = ""; $row[] = ""; $rowclass = ""; } $row[] = ""; $row[] = ""; $row[] = ""; $row[] = ""; $table->add_data($row, $rowclass); // Show attempts information foreach ($attempts as $attempt) { $row = array(); // In the attempts row, show only the summary of the attempt (it's not necessary to repeat user information) for ($i = 0; $i < count($extradata) + 2; $i++) { array_push($row, ''); } // Attempt information $row = geogebra_get_attempt_row($geogebra, $attempt, $auser, $cm, $context, $row); /*array_push($row, $attempt->duration); array_push($row, $attempt->grade); array_push($row, $attempt->comment);*/ $table->add_data($row); } } } $table->print_html(); // Print the whole table } else { echo $OUTPUT->notification(get_string('msg_nosessions', 'geogebra'), 'notifymessage'); } }
/** * Update geogebra grades in the gradebook * * Needed by grade_update_mod_grades() in lib/gradelib.php * * @param stdClass $geogebra instance object with extra cmidnumber and modname property * @param int $userid update grade of specific user only, 0 means all participants * @param boolean $nullifnone return null if grade does not exist * @return void */ function geogebra_update_grades(stdClass $geogebra, $userid = 0, $nullifnone = true) { global $CFG, $DB; require_once $CFG->libdir . '/gradelib.php'; if ($geogebra->grade == 0) { geogebra_grade_item_update($geogebra); } else { if ($grades = geogebra_get_user_grades($geogebra, $userid)) { foreach ($grades as $k => $v) { if ($k == 'rawgrade' and $v == -1) { $grades[$k] = null; } } geogebra_grade_item_update($geogebra, $grades); } else { if ($userid and $nullifnone) { $grade = new stdClass(); $grade->userid = $userid; $grade->rawgrade = NULL; geogebra_grade_item_update($geogebra, $grade); } else { geogebra_grade_item_update($geogebra); } } } }