id, false, $cm); $context = get_context_instance(CONTEXT_MODULE, $cm->id); require_capability('mod/lesson:edit'); /// Handle any preprocessing before header is printed - based on $mode switch ($mode) { case 'display': // Default view - get the necessary data // Get lesson pages that are essay if ($pages = get_records_select('lesson_pages', "lessonid = $lesson->id AND qtype = ".LESSON_ESSAY)) { // Get only the attempts that are in response to essay questions if ($essayattempts = get_records_select('lesson_attempts', 'pageid IN('.implode(',', array_keys($pages)).')')) { // Get all the users who have taken this lesson, order by their last name if (!$users = get_records_sql("SELECT DISTINCT u.* FROM {$CFG->prefix}user u, {$CFG->prefix}lesson_attempts a WHERE a.lessonid = '$lesson->id' and u.id = a.userid ORDER BY u.lastname")) { error('Error: could not find users'); } } else { $mode = 'none'; // not displaying anything lesson_set_message(get_string('noonehasanswered', 'lesson')); } } else { $mode = 'none'; // not displaying anything lesson_set_message(get_string('noessayquestionsfound', 'lesson')); } break; case 'grade': // Grading form - get the necessary data confirm_sesskey(); $attemptid = required_param('attemptid', PARAM_INT); if (!$attempt = get_record('lesson_attempts', 'id', $attemptid)) { error('Error: could not find attempt'); } if (!$page = get_record('lesson_pages', 'id', $attempt->pageid)) { error('Error: could not find lesson page'); } if (!$user = get_record('user', 'id', $attempt->userid)) { error('Error: could not find users'); } if (!$answer = get_record('lesson_answers', 'lessonid', $lesson->id, 'pageid', $page->id)) { error('Error: could not find answer'); } break; case 'update': if (confirm_sesskey() and $form = data_submitted($CFG->wwwroot.'/mod/lesson/essay.php')) { if (optional_param('cancel', 0)) { redirect("$CFG->wwwroot/mod/lesson/essay.php?id=$cm->id"); } $attemptid = required_param('attemptid', PARAM_INT); if (!$attempt = get_record('lesson_attempts', 'id', $attemptid)) { error('Error: could not find essay'); } if (!$grades = get_records_select('lesson_grades', "lessonid = $lesson->id and userid = $attempt->userid", 'completed', '*', $attempt->retry, 1)) { error('Error: could not find grades'); } $essayinfo = new stdClass; $essayinfo = unserialize($attempt->useranswer); $essayinfo->graded = 1; $essayinfo->score = clean_param($form->score, PARAM_INT); $essayinfo->response = stripslashes_safe($form->response); $essayinfo->sent = 0; if (!$lesson->custom && $essayinfo->score == 1) { $attempt->correct = 1; } else { $attempt->correct = 0; } $attempt->useranswer = addslashes(serialize($essayinfo)); if (!update_record('lesson_attempts', $attempt)) { error('Could not update essay score'); } // Get grade information $grade = current($grades); $gradeinfo = lesson_grade($lesson, $attempt->retry, $attempt->userid); // Set and update $updategrade->id = $grade->id; $updategrade->grade = $gradeinfo->grade; if(update_record('lesson_grades', $updategrade)) { // Log it add_to_log($course->id, 'lesson', 'update grade', "essay.php?id=$cm->id", $lesson->name, $cm->id); redirect("$CFG->wwwroot/mod/lesson/essay.php?id=$cm->id", get_string('updatesuccess', 'lesson')); } else { redirect("$CFG->wwwroot/mod/lesson/essay.php?id=$cm->id", get_string('updatefailed', 'lesson')); } } else { error('Something is wrong with the form data'); } break; case 'email': // Sending an email(s) to a single user or all confirm_sesskey(); // Get our users (could be singular) if ($userid = optional_param('userid', 0, PARAM_INT)) { $queryadd = " AND userid = $userid"; if (! $users = get_records('user', 'id', $userid)) { error('Error: could not find users'); } } else { $queryadd = ''; if (!$users = get_records_sql("SELECT DISTINCT u.* FROM {$CFG->prefix}user u, {$CFG->prefix}lesson_attempts a WHERE a.lessonid = '$lesson->id' and u.id = a.userid ORDER BY u.lastname")) { error('Error: could not find users'); } } // Get lesson pages that are essay if (!$pages = get_records_select('lesson_pages', "lessonid = $lesson->id AND qtype = ".LESSON_ESSAY)) { error('Error: could not find lesson pages'); } // Get only the attempts that are in response to essay questions $pageids = implode(',', array_keys($pages)); // all the pageids in comma seperated list if (!$attempts = get_records_select('lesson_attempts', "pageid IN($pageids)".$queryadd)) { error ('No one has answered essay questions yet...'); } // Get the answers if (!$answers = get_records_select('lesson_answers', "lessonid = $lesson->id AND pageid IN($pageids)", '', 'pageid, score')) { error ('Could not find answer records.'); } $options = new stdClass; $options->noclean = true; foreach ($attempts as $attempt) { $essayinfo = unserialize($attempt->useranswer); if ($essayinfo->graded and !$essayinfo->sent) { $subject = get_string('essayemailsubject', 'lesson', format_string($pages[$attempt->pageid]->title,true)); $message = get_string('question', 'lesson').':
'; $message .= format_text($pages[$attempt->pageid]->contents, FORMAT_MOODLE, $options); $message .= '

'; $message .= get_string('yourresponse', 'lesson').':
'; $message .= format_text(stripslashes($essayinfo->answer)); $message .= '

'; $message .= get_string('commentswithname', 'lesson', $USER).':
'; $message .= format_text(stripslashes($essayinfo->response), FORMAT_MOODLE, $options); $message .= '

'; $grades = get_records_select('lesson_grades', "lessonid = $lesson->id and userid = $attempt->userid", 'completed', '*', $attempt->retry, 1); $grade = current($grades); if ($lesson->custom) { $points->score = $essayinfo->score; $points->outof = $answers[$attempt->pageid]->score; $message .= get_string('youhavereceived', 'lesson', $points); } else { $points->score = $essayinfo->score; $points->outof = 1; $message .= get_string('youhavereceived', 'lesson', $points); } $message .= '

'; $message .= get_string('yourgradeisnow', 'lesson', $grade->grade).'%.'; $plaintxt = format_text_email($message, FORMAT_HTML); if(email_to_user($users[$attempt->userid], $USER, $subject, $plaintxt, $message)) { $essayinfo->sent = 1; $attempt->useranswer = addslashes(serialize($essayinfo)); update_record('lesson_attempts', $attempt); // Log it add_to_log($course->id, 'lesson', 'update email essay grade', "essay.php?id=$cm->id", format_string($pages[$attempt->pageid]->title,true).': '.fullname($users[$attempt->userid]), $cm->id); } else { error('Emailing Failed'); } } } redirect("$CFG->wwwroot/mod/lesson/essay.php?id=$cm->id", get_string('emailsuccess', 'lesson')); break; } // Log it add_to_log($course->id, 'lesson', 'view grade', "essay.php?id=$cm->id", get_string('manualgrading', 'lesson'), $cm->id); lesson_print_header($cm, $course, $lesson, 'essay'); switch ($mode) { case 'display': // Expects $user, $essayattempts and $pages to be set already // Group all the essays by userid $studentessays = array(); foreach ($essayattempts as $essay) { // Not very nice :) but basically // this organizes the essays so we know how many // times a student answered an essay per try and per page $studentessays[$essay->userid][$essay->pageid][$essay->retry][] = $essay; } // Setup table $table = new stdClass; $table->head = array($course->students, get_string('essays', 'lesson'), get_string('email', 'lesson')); $table->align = array('left', 'left', 'left'); $table->wrap = array('nowrap', 'nowrap', 'nowrap'); // Get the student ids of the users who have answered the essay question $userids = array_keys($studentessays); // Cycle through all the students foreach ($userids as $userid) { $studentname = fullname($users[$userid], true); $essaylinks = array(); // Number of attempts on the lesson $attempts = count_records('lesson_grades', 'userid', $userid, 'lessonid', $lesson->id); // Go through each essay page foreach ($studentessays[$userid] as $page => $tries) { $count = 0; // Go through each attempt per page foreach($tries as $try) { if ($count == $attempts) { break; // Stop displaying essays (attempt not completed) } $count++; // Make sure they didn't answer it more than the max number of attmepts if (count($try) > $lesson->maxattempts) { $essay = $try[$lesson->maxattempts-1]; } else { $essay = end($try); } // Start processing the attempt $essayinfo = unserialize($essay->useranswer); // Different colors for all the states of an essay (graded, if sent, not graded) if (!$essayinfo->graded) { $class = ' class="graded"'; } elseif (!$essayinfo->sent) { $class = ' class="sent"'; } else { $class = ' class="ungraded"'; } // link for each essay $essaylinks[] = "wwwroot/mod/lesson/essay.php?id=$cm->id&mode=grade&attemptid=$essay->id&sesskey=".sesskey().'">'.userdate($essay->timeseen, get_string('strftimedatetime')).' '.format_string($pages[$essay->pageid]->title,true).''; } } // email link for this user $emaillink = "wwwroot/mod/lesson/essay.php?id=$cm->id&mode=email&userid=$userid&sesskey=".sesskey().'">'.get_string('emailgradedessays', 'lesson').''; $table->data[] = array(print_user_picture($userid, $course->id, $users[$userid]->picture, 0, true).$studentname, implode("
\n", $essaylinks), $emaillink); } // email link for all users $emailalllink = "wwwroot/mod/lesson/essay.php?id=$cm->id&mode=email&sesskey=".sesskey().'">'.get_string('emailallgradedessays', 'lesson').''; $table->data[] = array(' ', ' ', $emailalllink); print_table($table); break; case 'grade': // Grading form // Expects the following to be set: $attemptid, $answer, $user, $page, $attempt echo '
'; // All tables will have these settings $table = new stdClass; $table->align = array('left'); $table->wrap = array(); $table->width = '50%'; $table->size = array('100%'); $table->class = 'generaltable gradetable'; // Print the question $table->head = array(get_string('question', 'lesson')); $options = new stdClass; $options->noclean = true; $table->data[] = array(format_text($page->contents, FORMAT_MOODLE, $options)); print_table($table); unset($table->data); // Now the user's answer $essayinfo = unserialize($attempt->useranswer); $table->head = array(get_string('studentresponse', 'lesson', fullname($user, true))); $table->data[] = array(format_text(stripslashes($essayinfo->answer))); print_table($table); unset($table->data); // Now a response box and grade drop-down for grader $table->head = array(get_string('comments', 'lesson')); $table->data[] = array(print_textarea(false, 15, 60, 0, 0, 'response', format_text($essayinfo->response, FORMAT_PLAIN, $options), $course->id, true)); $options = array(); if ($lesson->custom) { for ($i=$answer->score; $i>=0; $i--) { $options[$i] = $i; } } else { $options[0] = get_string('nocredit', 'lesson'); $options[1] = get_string('credit', 'lesson'); } $table->data[] = array(get_string('essayscore', 'lesson').': '.choose_from_menu($options, 'score', $essayinfo->score, '', '', '', true)); print_table($table); echo '
'; break; } print_footer($course); ?>