.
/**
* This page shows the answers of the current game
*
* @package mod_game
* @copyright 2007 Vasilis Daloukas
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once("../../config.php");
require_once( "headergame.php");
require_once( "check.php");
require_login();
if (!has_capability('mod/game:viewreports', $context)) {
print_error( get_string( 'only_teachers', 'game'));
}
$PAGE->navbar->add(get_string('showanswers', 'game'));
$action = optional_param('action', "", PARAM_ALPHANUM); // Action.
if ($action == 'delstats') {
$DB->delete_records('game_repetitions', array('gameid' => $game->id, 'userid' => $USER->id));
}
if ($action == 'computestats') {
game_compute_repetitions($game);
}
echo ''.get_string('repetitions', 'game').': ';
echo get_string('user').': ';
game_showusers($game);
echo " wwwroot}/mod/game/showanswers.php?q=$q&action=delstats\">".
get_string('clearrepetitions', 'game').' ';
echo " wwwroot}/mod/game/showanswers.php?q=$q&action=computestats\">".
get_string('computerepetitions', 'game').' ';
echo ' ';
$existsbook = ($DB->get_record( 'modules', array( 'name' => 'book'), 'id,id'));
game_showanswers( $game, $existsbook, $context);
$s = game_check_common_problems( $context, $game);
if ($s != '') {
echo '
'.$s;
}
echo $OUTPUT->footer();
/**
* Compute repetitions
*
* @param stdClass $game
*/
function game_compute_repetitions($game) {
global $DB, $USER;
$DB->delete_records('game_repetitions', array('gameid' => $game->id, 'userid' => $USER->id));
$sql = "INSERT INTO {game_repetitions}( gameid,userid,questionid,glossaryentryid,repetitions) ".
"SELECT $game->id,$USER->id,questionid,glossaryentryid,COUNT(*) ".
"FROM {game_queries} WHERE gameid=$game->id AND userid=$USER->id GROUP BY questionid,glossaryentryid";
if (!$DB->execute( $sql)) {
print_error('Problem on computing statistics for repetitions');
}
}
/**
* Show users
*
* @param stdClass $game
*/
function game_showusers($game) {
global $CFG, $USER;
$users = array();
$context = game_get_context_course_instance( $game->course);
if ($courseusers = get_enrolled_users($context)) {
foreach ($courseusers as $courseuser) {
$users[$courseuser->id] = fullname($courseuser, has_capability('moodle/site:viewfullnames', $context));
}
}
if ($guest = guest_user()) {
$users[$guest->id] = fullname($guest);
}
$href = $CFG->wwwroot.'/mod/game/showanswers.php?q='.$game->id.'&userid=';
?>
id, PARAM_INT);
$output = '' . "\n";
$output .= ' ' . "\n";
if (!empty($options)) {
foreach ($options as $value => $label) {
$output .= ' ' . "\n";
} else {
$output .= '>'. $label .' ' . "\n";
}
}
}
echo $output . ' ' . "\n";
}
/**
* Show answers
*
* @param stdClass $game
* @param boolean $existsbook
* @param stdClass $context
*/
function game_showanswers( $game, $existsbook, $context) {
if ($game->gamekind == 'bookquiz' and $existsbook) {
game_showanswers_bookquiz( $game, $context);
return;
}
switch ($game->sourcemodule) {
case 'question':
game_showanswers_question( $game, $context);
break;
case 'glossary':
game_showanswers_glossary( $game);
break;
case 'quiz':
game_showanswers_quiz( $game, $context);
break;
}
}
/**
* append select to SQL
*
* @param stdClass $game
*/
function game_showanswers_appendselect( $game) {
switch ($game->gamekind) {
case 'hangman':
case 'cross':
case 'crypto':
return " AND qtype='shortanswer'";
case 'millionaire':
return " AND qtype = 'multichoice'";
case 'sudoku':
case 'bookquiz':
case 'snakes':
return " AND qtype in ('shortanswer', 'truefalse', 'multichoice')";
}
return '';
}
/**
* Show answers question
*
* @param stdClass $game
* @param stdClass $context
*/
function game_showanswers_question( $game, $context) {
global $DB;
if ($game->gamekind != 'bookquiz') {
$select = ' category='.$game->questioncategoryid;
if ($game->subcategories) {
$cats = question_categorylist( $game->questioncategoryid);
if (strpos( $cats, ',') > 0) {
$select = ' category in ('.$cats.')';
}
}
} else {
$context2 = get_context_instance(50, $COURSE->id);
$select = " contextid in ($context2->id)";
$select2 = '';
if ($recs = $DB->get_records_select( 'question_categories', $select, null, 'id,id')) {
foreach ($recs as $rec) {
$select2 .= ','.$rec->id;
}
}
$select = ' AND category IN ('.substr( $select2, 1).')';
}
$select .= ' AND hidden = 0 ';
$select .= game_showanswers_appendselect( $game);
$gamekind = $game->gamekind;
$showcategories = ($gamekind == 'bookquiz');
$order = ($showcategories ? 'category,questiontext' : 'questiontext');
$table = '{question} q';
if ($gamekind == 'millionaire') {
if (game_get_moodle_version() < '02.06') {
$table .= ',{question_multichoice} qmo';
$select .= " AND q.qtype='multichoice' AND qmo.single=1 AND qmo.question=q.id";
} else {
$table .= ',{qtype_multichoice_options} qmo';
$select .= " AND q.qtype='multichoice' AND qmo.single=1 AND qmo.questionid=q.id";
}
} else if ( ($gamekind == 'hangman') or ($gamekind == 'cryptex') or ($gamekind == 'cross')) {
$select .= " AND q.qtype = 'shortanswer'";
}
game_showanswers_question_select( $game, $table, $select, 'q.*', $order, $showcategories, $game->course, $context);
}
/**
* Show answers quiz
*
* @param stdClass $game
* @param stdClass $context
*/
function game_showanswers_quiz( $game, $context) {
global $CFG;
if (game_get_moodle_version() < '02.07') {
$select = "quiz='$game->quizid' ".
' AND qqi.question=q.id'.
' AND q.hidden=0'.
game_showanswers_appendselect( $game);
$table = '{question} q,{quiz_question_instances} qqi';
} else {
$select = "qs.quizid='$game->quizid' ".
" AND qs.questionid=q.id ".game_showanswers_appendselect( $game);
$table = "{question} q,{quiz_slots} qs";
}
game_showanswers_question_select( $game, $table, $select, 'q.*', 'category,questiontext', false, $game->course, $context);
}
/**
* Create the select for SQL
*
* @param stdClass $game
* @param string $table
* @param string $select
* @param string $fields
* @param string $order
* @param boolean $showcategoryname
* @param int $courseid
* @param stdClass $context
*/
function game_showanswers_question_select( $game, $table, $select, $fields, $order, $showcategoryname, $courseid, $context) {
global $CFG, $DB, $OUTPUT;
$sql = "SELECT $fields FROM $table WHERE $select ORDER BY $order";
if (($questions = $DB->get_records_sql( $sql)) === false) {
return;
}
$table .= ",{game_repetitions} gr";
$select .= " AND gr.questionid=q.id AND gr.glossaryentryid=0 AND gr.gameid=".$game->id;
$userid = optional_param('userid', 0, PARAM_INT);
if ($userid) {
$select .= " AND gr.userid=$userid";
}
$sql = "SELECT q.id as id,SUM(repetitions) as c FROM {$table} WHERE $select GROUP BY q.id";
$reps = $DB->get_records_sql( $sql);
$categorynames = array();
if ($showcategoryname) {
$select = '';
$recs = $DB->get_records( 'question_categories', null, '', '*', 0, 1);
foreach ($recs as $rec) {
if (array_key_exists( 'course', $rec)) {
$select = "course=$courseid";
} else {
$context = get_context_instance(50, $courseid);
$select = " contextid in ($context->id)";
}
break;
}
if (($categories = $DB->get_records_select( 'question_categories', $select, null, '', 'id,name'))) {
foreach ($categories as $rec) {
$categorynames[ $rec->id] = $rec->name;
}
}
}
echo '';
echo ' ';
if ($showcategoryname) {
echo ''.get_string( 'categories', 'quiz').' ';
}
echo ''.get_string( 'questions', 'quiz').' ';
echo ''.get_string( 'answers', 'quiz').' ';
echo ''.get_string( 'feedbacks', 'game').' ';
if ($reps) {
echo ''.get_string( 'repetitions', 'game').' ';
}
echo " \r\n";
$line = 0;
foreach ($questions as $question) {
echo '';
echo ''.(++$line);
echo ' ';
if ($showcategoryname) {
echo '';
if (array_key_exists( $question->category, $categorynames)) {
echo $categorynames[ $question->category];
} else {
echo ' ';
}
echo ' ';
}
echo '';
echo "wwwroot}/question/question.php?inpopup=1&id=$question->id&courseid=$courseid\" target=\"_blank\">";
echo " ";
echo game_filterquestion(str_replace( array( "\'", '\"'), array( "'", '"'),
$question->questiontext), $question->id, $context->id, $game->course);
switch ($question->qtype) {
case 'shortanswer':
$recs = $DB->get_records( 'question_answers',
array( 'question' => $question->id), 'fraction DESC', 'id,answer,feedback');
if ($recs == false) {
$rec = false;
} else {
foreach ($recs as $rec) {
break;
}
}
echo " $rec->answer ";
if ($rec->feedback == '') {
$rec->feedback = ' ';
}
echo "$rec->feedback ";
break;
case 'multichoice':
case 'truefalse':
$recs = $DB->get_records( 'question_answers', array( 'question' => $question->id));
$feedback = '';
echo '';
$i = 0;
foreach ($recs as $rec) {
if ($i++ > 0) {
echo ' ';
}
if ($rec->fraction == 1) {
echo " $rec->answer ";
} else {
echo " $rec->answer";
}
if ($rec->feedback == '') {
$feedback .= ' ';
} else {
$feedback .= "{$rec->feedback} ";
}
}
echo ' ';
if ($feedback == '') {
$feedback = ' ';
}
echo "$feedback ";
break;
default:
echo "$question->qtype ";
break;
}
// Show repetitions.
if ($reps) {
if (array_key_exists( $question->id, $reps)) {
$rep = $reps[ $question->id];
echo ''.$rep->c.' ';
} else {
echo ' ';
}
}
echo " \r\n";
}
echo "
\r\n\r\n";
}
/**
* Show answers glossary
*
* @param stdClass $game
*/
function game_showanswers_glossary( $game) {
global $CFG, $DB;
$table = '{glossary_entries} ge';
$select = "glossaryid={$game->glossaryid}";
if ($game->glossarycategoryid) {
$select .= " AND gec.entryid = ge.id ".
" AND gec.categoryid = {$game->glossarycategoryid}";
$table .= ",{glossary_entries_categories} gec";
}
if ($game->glossaryonlyapproved) {
// Only approved glossary entries will be used.
$select .= ' AND (ge.approved=1 OR teacherentry=1)';
}
$sql = "SELECT ge.id,definition,concept FROM $table WHERE $select ORDER BY definition";
if (($questions = $DB->get_records_sql( $sql)) === false) {
return;
}
// Show repetitions of questions.
$table = "{glossary_entries} ge, {game_repetitions} gr";
$select = "glossaryid={$game->glossaryid} AND gr.glossaryentryid=ge.id AND gr.gameid=".$game->id;
$userid = optional_param('userid', 0, PARAM_INT);
if ($userid) {
$select .= " AND gr.userid=$userid";
}
if ($game->glossarycategoryid) {
$select .= " AND gec.entryid = ge.id ".
" AND gec.categoryid = {$game->glossarycategoryid}";
$table .= ",{glossary_entries_categories} gec";
}
$sql = "SELECT ge.id,SUM(repetitions) as c FROM {$table} WHERE $select GROUP BY ge.id";
$reps = $DB->get_records_sql( $sql);
echo '';
echo ' ';
echo ''.get_string( 'questions', 'quiz').' ';
echo ''.get_string( 'answers', 'quiz').' ';
if ($reps != false) {
echo ''.get_string( 'repetitions', 'game').' ';
}
echo " \r\n";
$line = 0;
foreach ($questions as $question) {
if ($game->param7 == 0) { // Not allowed spaces.
if (!( strpos( $question->concept, ' ') === false)) {
continue;
}
}
if ($game->param8 == 0) { // Not allowed -.
if (!( strpos( $question->concept, '-') === false)) {
continue;
}
}
echo '';
echo ''.(++$line);
echo ' ';
$query = new StdClass;
$query->glossaryid = $game->glossaryid;
$query->glossaryentryid = $question->id;
echo ''.game_show_query( $game, $query, $question->definition).' ';
echo ''.$question->concept.' ';
if ($reps != false) {
if (array_key_exists( $question->id, $reps)) {
$rep = $reps[ $question->id];
echo ''.$rep->c.' ';
} else {
echo ' ';
}
}
echo " \r\n";
}
echo "
\r\n\r\n";
}
/**
* Show answers bookquiz
*
* @param stdClass $game
* @param stdClass $context
*/
function game_showanswers_bookquiz( $game, $context) {
global $CFG;
$select = "gbq.questioncategoryid=q.category ".
" AND gbq.gameid = $game->id ".
" AND bc.id = gbq.chapterid";
$table = "{question} q,{game_bookquiz_questions} gbq,{book_chapters} bc";
$showcategories = ($game->gamekind == 'bookquiz');
game_showanswers_question_select( $game, $table, $select, "DISTINCT q.*",
"bc.pagenum,questiontext", $showcategories, $game->course, $context);
}
/**
* Show extra info for answers in millionaire
*
* @param stdClass $game
*/
function game_showanswers_extra_millionaire( $game) {
global $CFG, $DB;
if ($game->questioncategoryid == 0) {
print_error( get_string( 'must_select_questioncategory', 'game'));
}
// Include subcategories.
$select = 'category='.$game->questioncategoryid;
if ($game->subcategories) {
$cats = question_categorylist( $game->questioncategoryid);
if (count( $cats)) {
$select = 'q.category in ('.implode(',', $cats).')';
}
}
if (game_get_moodle_version() < '02.06') {
$table = "{$CFG->prefix}question q, {$CFG->prefix}question_multichoice qmo";
$select .= " AND qtype='multichoice' AND qmo.single <> 1 AND qmo.question=q.id";
} else {
$table = "{$CFG->prefix}question q, {$CFG->prefix}qtype_multichoice_options qmo";
$select .= " AND qtype='multichoice' AND qmo.single <> 1 AND qmo.questionid=q.id";
}
$sql = "SELECT COUNT(*) as c FROM $table WHERE $select";
$rec = $DB->get_record_sql( $sql);
if ($rec->c != 0) {
echo get_string( 'millionaire_also_multichoice', 'game').': '.$rec->c;
}
}