Example #1
0
    /**
     * Generates data pertaining to quiz results
     *
     * @param array $quiz Array containing quiz data
     * @param int $context The page context ID
     * @param int $cm The Course Module Id
     * @param mod_quiz_view_object $viewobj
     */
    public function view_result_info($quiz, $context, $cm, $viewobj) {
        $output = '';
        if (!$viewobj->numattempts && !$viewobj->gradecolumn && is_null($viewobj->mygrade)) {
            return $output;
        }
        $resultinfo = '';

        if ($viewobj->overallstats) {
            if ($viewobj->moreattempts) {
                $a = new stdClass();
                $a->method = quiz_get_grading_option_name($quiz->grademethod);
                $a->mygrade = quiz_format_grade($quiz, $viewobj->mygrade);
                $a->quizgrade = quiz_format_grade($quiz, $quiz->grade);
                $resultinfo .= $this->heading(get_string('gradesofar', 'quiz', $a), 2, 'main');
            } else {
                $a = new stdClass();
                $a->grade = quiz_format_grade($quiz, $viewobj->mygrade);
                $a->maxgrade = quiz_format_grade($quiz, $quiz->grade);
                $a = get_string('outofshort', 'quiz', $a);
                $resultinfo .= $this->heading(get_string('yourfinalgradeis', 'quiz', $a), 2,
                        'main');
            }
        }

        if ($viewobj->mygradeoverridden) {

            $resultinfo .= html_writer::tag('p', get_string('overriddennotice', 'grades'),
                    array('class' => 'overriddennotice'))."\n";
        }
        if ($viewobj->gradebookfeedback) {
            $resultinfo .= $this->heading(get_string('comment', 'quiz'), 3, 'main');
            $resultinfo .= '<p class="quizteacherfeedback">'.$viewobj->gradebookfeedback.
                    "</p>\n";
        }
        if ($viewobj->feedbackcolumn) {
            $resultinfo .= $this->heading(get_string('overallfeedback', 'quiz'), 3, 'main');
            $resultinfo .= html_writer::tag('p',
                    quiz_feedback_for_grade($viewobj->mygrade, $quiz, $context),
                    array('class' => 'quizgradefeedback'))."\n";
        }

        if ($resultinfo) {
            $output .= $this->box($resultinfo, 'generalbox', 'feedback');
        }
        return $output;
    }
Example #2
0
        } else {
            $data[] = '';
        }
    } else {
        if ($showing == 'scores') {
            // Grade and feedback.
            $bestgrade = quiz_get_best_grade($quiz, $USER->id);
            $attempts = quiz_get_user_attempts($quiz->id, $USER->id, 'all');
            list($someoptions, $alloptions) = quiz_get_combined_reviewoptions($quiz, $attempts, $context);
            $grade = '';
            $feedback = '';
            if ($quiz->grade && !is_null($bestgrade)) {
                if ($alloptions->scores) {
                    $grade = "{$bestgrade} / {$quiz->grade}";
                }
                if ($alloptions->overallfeedback) {
                    $feedback = quiz_feedback_for_grade($bestgrade, $quiz->id);
                }
            }
            $data[] = $grade;
            $data[] = $feedback;
        }
    }
    $table->data[] = $data;
}
// End of loop over quiz instances.
// Display the table.
echo '<br />';
print_table($table);
// Finish the page
print_footer($course);
Example #3
0
 /**
  * Get the overall feedback corresponding to a particular mark.
  * @param $grade a particular grade.
  */
 public function get_overall_feedback($grade)
 {
     return quiz_feedback_for_grade($grade, $this->get_quiz(), $this->quizobj->get_context());
 }
Example #4
0
// The required page
$showall = optional_param('showall', 0, PARAM_BOOL);
if (!($attempt = get_record("quiz_attempts", "id", $attempt))) {
    error("No such attempt ID exists");
}
if (!($quiz = get_record("quiz", "id", $attempt->quiz))) {
    error("The quiz with id {$attempt->quiz} belonging to attempt {$attempt} is missing");
}
if (!($course = get_record("course", "id", $quiz->course))) {
    error("The course with id {$quiz->course} that the quiz with id {$quiz->id} belongs to is missing");
}
if (!($cm = get_coursemodule_from_instance("quiz", $quiz->id, $course->id))) {
    error("The course module for the quiz with id {$quiz->id} is missing");
}
$grade = quiz_rescale_grade($attempt->sumgrades, $quiz);
$feedback = quiz_feedback_for_grade($grade, $attempt->quiz);
if (!count_records('question_sessions', 'attemptid', $attempt->uniqueid)) {
    // this question has not yet been upgraded to the new model
    quiz_upgrade_states($attempt);
}
require_login($course->id, false, $cm);
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
$coursecontext = get_context_instance(CONTEXT_COURSE, $cm->course);
$isteacher = has_capability('mod/quiz:preview', get_context_instance(CONTEXT_MODULE, $cm->id));
$options = quiz_get_reviewoptions($quiz, $attempt, $context);
$popup = $isteacher ? 0 : $quiz->popup;
// Controls whether this is shown in a javascript-protected window.
if (!has_capability('mod/quiz:viewreports', $context)) {
    if (!$attempt->timefinish) {
        redirect('attempt.php?q=' . $quiz->id);
    }
Example #5
0
            $resultinfo .= $OUTPUT->heading(get_string('gradesofar', 'quiz', $a), 2, 'main');
        } else {
            $a = quiz_format_grade($quiz, $mygrade) . '/' . quiz_format_grade($quiz, $quiz->grade);
            $resultinfo .= $OUTPUT->heading(get_string('yourfinalgradeis', 'quiz', $a), 2, 'main');
        }
    }
    if ($mygradeoverridden) {
        $resultinfo .= '<p class="overriddennotice">' . get_string('overriddennotice', 'grades') . "</p>\n";
    }
    if ($gradebookfeedback) {
        $resultinfo .= $OUTPUT->heading(get_string('comment', 'quiz'), 3, 'main');
        $resultinfo .= '<p class="quizteacherfeedback">' . $gradebookfeedback . "</p>\n";
    }
    if ($feedbackcolumn) {
        $resultinfo .= $OUTPUT->heading(get_string('overallfeedback', 'quiz'), 3, 'main');
        $resultinfo .= '<p class="quizgradefeedback">' . quiz_feedback_for_grade($mygrade, $quiz->id) . "</p>\n";
    }
    if ($resultinfo) {
        echo $OUTPUT->box($resultinfo, 'generalbox', 'feedback');
    }
}
/// Determine if we should be showing a start/continue attempt button,
/// or a button to go back to the course page.
echo $OUTPUT->box_start('quizattempt');
$buttontext = '';
// This will be set something if as start/continue attempt button should appear.
if (!$quiz->questions) {
    echo $OUTPUT->heading(get_string("noquestions", "quiz"));
} else {
    if ($unfinished) {
        if ($canattempt) {
 /**
  * Generates the table of data
  *
  * @param array $quiz Array contining quiz data
  * @param int $context The page context ID
  * @param mod_quiz_view_object $viewobj
  */
 public function view_table($quiz, $context, $viewobj)
 {
     // Most of the following code is unfortunately a duplicate of the existing renderer. There was no way to reuse the existing
     // code and add the extra columns we wanted so I had to duplicate it.
     // New parts of the code are marked with a comment // Grade by category code start. and // Grade by category code end.
     global $DB;
     // Grade by category code start.
     // If gradebycategory setting is not on then just use the existing renderer.
     if (!$quiz->gradebycategory) {
         return parent::view_table($quiz, $context, $viewobj);
     }
     // Grade by category code end.
     if (!$viewobj->attempts) {
         return '';
     }
     // Prepare table header.
     $table = new html_table();
     $table->attributes['class'] = 'generaltable quizattemptsummary';
     $table->head = array();
     $table->align = array();
     $table->size = array();
     if ($viewobj->attemptcolumn) {
         $table->head[] = get_string('attemptnumber', 'quiz');
         $table->align[] = 'center';
         $table->size[] = '';
     }
     $table->head[] = get_string('attemptstate', 'quiz');
     $table->align[] = 'left';
     $table->size[] = '';
     if ($viewobj->markcolumn) {
         $table->head[] = get_string('marks', 'quiz') . ' / ' . quiz_format_grade($quiz, $quiz->sumgrades);
         $table->align[] = 'center';
         $table->size[] = '';
     }
     if ($viewobj->gradecolumn) {
         $table->head[] = get_string('grade') . ' / ' . quiz_format_grade($quiz, $quiz->grade);
         $table->align[] = 'center';
         $table->size[] = '';
     }
     // Grade by category code start.
     $catgrades = new quizaccess_gradebycategory_calculator($quiz);
     // $this->lateststeps may or may not already have been loaded depending if the reoprt
     // is set to show question grades.
     $catgrades->load_latest_steps($viewobj->attempts);
     $categorynames = $catgrades->load_cat_data();
     // Output column headings for category averages
     foreach ($categorynames as $catname) {
         $table->head[] = $catname . ' / ' . quiz_format_grade($quiz, 100);
         $table->align[] = 'center';
         $table->size[] = '';
     }
     // Grade by category code end.
     if ($viewobj->canreviewmine) {
         $table->head[] = get_string('review', 'quiz');
         $table->align[] = 'center';
         $table->size[] = '';
     }
     if ($viewobj->feedbackcolumn) {
         $table->head[] = get_string('feedback', 'quiz');
         $table->align[] = 'left';
         $table->size[] = '';
     }
     // One row for each attempt.
     foreach ($viewobj->attemptobjs as $attemptobj) {
         $attemptoptions = $attemptobj->get_display_options(true);
         $row = array();
         // Add the attempt number.
         if ($viewobj->attemptcolumn) {
             if ($attemptobj->is_preview()) {
                 $row[] = get_string('preview', 'quiz');
             } else {
                 $row[] = $attemptobj->get_attempt_number();
             }
         }
         $row[] = $this->attempt_state($attemptobj);
         if ($viewobj->markcolumn) {
             if ($attemptoptions->marks >= question_display_options::MARK_AND_MAX && $attemptobj->is_finished()) {
                 $row[] = quiz_format_grade($quiz, $attemptobj->get_sum_marks());
             } else {
                 $row[] = '';
             }
         }
         // Outside the if because we may be showing feedback but not grades.
         $attemptgrade = quiz_rescale_grade($attemptobj->get_sum_marks(), $quiz, false);
         if ($viewobj->gradecolumn) {
             if ($attemptoptions->marks >= question_display_options::MARK_AND_MAX && $attemptobj->is_finished()) {
                 // Highlight the highest grade if appropriate.
                 if ($viewobj->overallstats && !$attemptobj->is_preview() && $viewobj->numattempts > 1 && !is_null($viewobj->mygrade) && $attemptgrade == $viewobj->mygrade && $quiz->grademethod == QUIZ_GRADEHIGHEST) {
                     $table->rowclasses[$attemptobj->get_attempt_number()] = 'bestrow';
                 }
                 $row[] = quiz_format_grade($quiz, $attemptgrade);
             } else {
                 $row[] = '';
             }
         }
         // Grade by category code start.
         // Output cell contents for category average.
         foreach (array_keys($categorynames) as $catid) {
             $row[] = $catgrades->grade_by_category($attemptobj->get_uniqueid(), $catid);
         }
         // Grade by category code end.
         if ($viewobj->canreviewmine) {
             $row[] = $viewobj->accessmanager->make_review_link($attemptobj->get_attempt(), $attemptoptions, $this);
         }
         if ($viewobj->feedbackcolumn && $attemptobj->is_finished()) {
             if ($attemptoptions->overallfeedback) {
                 $row[] = quiz_feedback_for_grade($attemptgrade, $quiz, $context);
             } else {
                 $row[] = '';
             }
         }
         if ($attemptobj->is_preview()) {
             $table->data['preview'] = $row;
         } else {
             $table->data[$attemptobj->get_attempt_number()] = $row;
         }
     }
     // End of loop over attempts.
     $output = '';
     $output .= $this->view_table_heading();
     $output .= html_writer::table($table);
     return $output;
 }
Example #7
0
            $a->grade = quiz_format_grade($quiz, $mygrade);
            $a->maxgrade = quiz_format_grade($quiz, $quiz->grade);
            $a = get_string('outofshort', 'quiz', $a);
            $resultinfo .= $OUTPUT->heading(get_string('yourfinalgradeis', 'quiz', $a), 2, 'main');
        }
    }
    if ($mygradeoverridden) {
        $resultinfo .= '<p class="overriddennotice">' . get_string('overriddennotice', 'grades') . "</p>\n";
    }
    if ($gradebookfeedback) {
        $resultinfo .= $OUTPUT->heading(get_string('comment', 'quiz'), 3, 'main');
        $resultinfo .= '<p class="quizteacherfeedback">' . $gradebookfeedback . "</p>\n";
    }
    if ($feedbackcolumn) {
        $resultinfo .= $OUTPUT->heading(get_string('overallfeedback', 'quiz'), 3, 'main');
        $resultinfo .= '<p class="quizgradefeedback">' . quiz_feedback_for_grade($mygrade, $quiz, $context, $cm) . "</p>\n";
    }
    if ($resultinfo) {
        echo $OUTPUT->box($resultinfo, 'generalbox', 'feedback');
    }
}
/// Determine if we should be showing a start/continue attempt button,
/// or a button to go back to the course page.
echo $OUTPUT->box_start('quizattempt');
$buttontext = '';
// This will be set something if as start/continue attempt button should appear.
if (!quiz_clean_layout($quiz->questions, true)) {
    echo $OUTPUT->heading(get_string("noquestions", "quiz"));
} else {
    if ($unfinished) {
        if ($canpreview) {
Example #8
0
     print_heading(get_string("nomoreattempts", "quiz"));
 }
 if ($numattempts && $quiz->sumgrades && !is_null($mygrade)) {
     if ($overallstats) {
         if ($available && $moreattempts) {
             $a = new stdClass();
             $a->method = quiz_get_grading_option_name($quiz->grademethod);
             $a->mygrade = $mygrade;
             $a->quizgrade = $quiz->grade;
             print_heading(get_string('gradesofar', 'quiz', $a));
         } else {
             print_heading(get_string('yourfinalgradeis', 'quiz', "{$mygrade} / {$quiz->grade}"));
         }
     }
     if ($overallfeedback) {
         echo '<p class="quizgradefeedback">' . quiz_feedback_for_grade($mygrade, $quiz->id) . '</p>';
     }
 }
 // Print a button to start/continue an attempt, if appropriate.
 if (!$quiz->questions) {
     print_heading(get_string("noquestions", "quiz"));
 } else {
     if ($available && $moreattempts) {
         echo "<br />";
         echo "<div class=\"quizattempt\">";
         if ($unfinished) {
             if (has_capability('mod/quiz:preview', $context)) {
                 $buttontext = get_string('continuepreview', 'quiz');
             } else {
                 $buttontext = get_string('continueattemptquiz', 'quiz');
             }
Example #9
0
 public function get_overall_feedback($grade)
 {
     return quiz_feedback_for_grade($grade, $this->quiz, $this->context, $this->cm);
 }
Example #10
0
        // Grade and feedback.
        $attempts = quiz_get_user_attempts($quiz->id, $USER->id, 'all');
        list($someoptions, $alloptions) = quiz_get_combined_reviewoptions(
                $quiz, $attempts, $context);

        $grade = '';
        $feedback = '';
        if ($quiz->grade && array_key_exists($quiz->id, $grades)) {
            if ($alloptions->marks >= question_display_options::MARK_AND_MAX) {
                $a = new stdClass();
                $a->grade = quiz_format_grade($quiz, $grades[$quiz->id]);
                $a->maxgrade = quiz_format_grade($quiz, $quiz->grade);
                $grade = get_string('outofshort', 'quiz', $a);
            }
            if ($alloptions->overallfeedback) {
                $feedback = quiz_feedback_for_grade($grades[$quiz->id], $quiz, $context);
            }
        }
        $data[] = $grade;
        if ($showfeedback) {
            $data[] = $feedback;
        }
    }

    $table->data[] = $data;
} // End of loop over quiz instances.

// Display the table.
echo html_writer::table($table);

// Finish the page
Example #11
0
        if ($quiz->grade != $quiz->sumgrades) {
            $a = new stdClass();
            $a->grade = round($attempt->sumgrades, $CFG->quiz_decimalpoints);
            $a->maxgrade = $quiz->sumgrades;
            $rows[] = '<tr><th scope="row" class="cell">' . get_string('marks', 'quiz') . '</th><td class="cell">' . get_string('outofshort', 'quiz', $a) . '</td></tr>';
        }
        /// Now the scaled grade.
        $a = new stdClass();
        $a->grade = '<b>' . $grade . '</b>';
        $a->maxgrade = $quiz->grade;
        $a->percent = '<b>' . round($attempt->sumgrades / $quiz->sumgrades * 100, 0) . '</b>';
        $rows[] = '<tr><th scope="row" class="cell">' . get_string('grade') . '</th><td class="cell">' . get_string('outofpercent', 'quiz', $a) . '</td></tr>';
    }
}
/// Feedback if there is any, and the user is allowed to see it now.
$feedback = quiz_feedback_for_grade(quiz_rescale_grade($attempt->sumgrades, $quiz, false), $attempt->quiz);
if ($options->overallfeedback && $feedback) {
    $rows[] = '<tr><th scope="row" class="cell">' . get_string('feedback', 'quiz') . '</th><td class="cell">' . $feedback . '</td></tr>';
}
/// Now output the summary table, if there are any rows to be shown.
if (!empty($rows)) {
    echo '<table class="generaltable generalbox quizreviewsummary"><tbody>', "\n";
    echo implode("\n", $rows);
    echo "\n</tbody></table>\n";
}
/// Print the navigation panel if required
$numpages = quiz_number_of_pages($attempt->layout);
if ($numpages > 1 and !$showall) {
    print_paging_bar($numpages, $page, 1, 'review.php?attempt=' . $attempt->id . '&amp;');
    echo '<div class="controls"><a href="review.php?attempt=' . $attempt->id . '&amp;showall=true">';
    print_string('showall', 'quiz');
Example #12
0
    } else {
        if ($showing == 'scores') {
            // Grade and feedback.
            $attempts = quiz_get_user_attempts($quiz->id, $USER->id, 'all');
            list($someoptions, $alloptions) = quiz_get_combined_reviewoptions($quiz, $attempts, $context);
            $grade = '';
            $feedback = '';
            if ($quiz->grade && array_key_exists($quiz->id, $scores)) {
                if ($alloptions->scores) {
                    $a = new stdClass();
                    $a->grade = quiz_format_grade($quiz, $scores[$quiz->id]);
                    $a->maxgrade = quiz_format_grade($quiz, $quiz->grade);
                    $grade = get_string('outofshort', 'quiz', $a);
                }
                if ($alloptions->overallfeedback) {
                    $feedback = quiz_feedback_for_grade($scores[$quiz->id], $quiz, $context, $cm);
                }
            }
            $data[] = $grade;
            if ($showfeedback) {
                $data[] = $feedback;
            }
        }
    }
    $table->data[] = $data;
}
// End of loop over quiz instances.
// Display the table.
echo '<br />';
echo html_writer::table($table);
// Finish the page