|
|
|
<?php
|
|
|
|
// This file is part of Moodle - http://moodle.org/
|
|
|
|
//
|
|
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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_login();
|
|
|
|
|
|
|
|
require_once( "headergame.php");
|
|
|
|
|
|
|
|
if (!has_capability('mod/game:viewreports', $context)) {
|
|
|
|
print_error( get_string( 'only_teachers', 'game'));
|
|
|
|
}
|
|
|
|
|
|
|
|
$PAGE->navbar->add(get_string('showattempts', 'game'));
|
|
|
|
|
|
|
|
$action = optional_param('action', "", PARAM_ALPHANUM); // Action.
|
|
|
|
if ($action == 'delete') {
|
|
|
|
game_ondeleteattempt( $game);
|
|
|
|
}
|
|
|
|
|
|
|
|
echo get_string( 'group').': ';
|
|
|
|
game_showgroups( $game);
|
|
|
|
echo ' '.get_string('user').': ';
|
|
|
|
game_showusers( $game);echo '<br><br>';
|
|
|
|
|
|
|
|
game_showattempts( $game);
|
|
|
|
|
|
|
|
echo $OUTPUT->footer();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Show users
|
|
|
|
*
|
|
|
|
* @param stdClass $game
|
|
|
|
*/
|
|
|
|
function game_showusers($game) {
|
|
|
|
global $CFG, $USER, $DB;
|
|
|
|
|
|
|
|
$users = array();
|
|
|
|
|
|
|
|
$context = game_get_context_course_instance( $game->course);
|
|
|
|
|
|
|
|
$groupid = optional_param('groupid', 0, PARAM_INT);
|
|
|
|
$sql = "SELECT DISTINCT ra.userid,u.lastname,u.firstname FROM {role_assignments} ra, {user} u ".
|
|
|
|
" WHERE ra.contextid={$context->id} AND ra.userid=u.id";
|
|
|
|
if ($groupid != 0) {
|
|
|
|
$sql .= " AND ra.userid IN (SELECT gm.userid FROM {groups_members} gm WHERE gm.groupid=$groupid)";
|
|
|
|
}
|
|
|
|
if (($recs = $DB->get_records_sql( $sql))) {
|
|
|
|
foreach ($recs as $rec) {
|
|
|
|
$users[ $rec->userid] = $rec->lastname.' '.$rec->firstname;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($guest = guest_user()) {
|
|
|
|
$users[$guest->id] = fullname($guest);
|
|
|
|
}
|
|
|
|
$href = $CFG->wwwroot.'/mod/game/showattempts.php?q='.$game->id.'&userid=';
|
|
|
|
?>
|
|
|
|
<script type="text/javascript">
|
|
|
|
function onselectuser()
|
|
|
|
{
|
|
|
|
var groupid = document.getElementById('menugroup').value;
|
|
|
|
window.location.href = "<?php echo $href;?>" + document.getElementById('menuuser').value + '&groupid='+groupid;
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
<?php
|
|
|
|
|
|
|
|
$attributes = 'onchange="javascript:onselectuser();"';
|
|
|
|
$name = 'user';
|
|
|
|
$id = 'menu'.$name;
|
|
|
|
$class = 'menu'.$name;
|
|
|
|
$class = 'select ' . $class; // Add 'select' selector always.
|
|
|
|
$nothing = get_string("allparticipants");
|
|
|
|
$nothingvalue = '0';
|
|
|
|
$options = $users;
|
|
|
|
$selected = optional_param('userid', 0, PARAM_INT);
|
|
|
|
|
|
|
|
$output = '<select id="'. $id .'" class="'. $class .'" name="'. $name .'" '. $attributes .'>' . "\n";
|
|
|
|
$output .= ' <option value="'. s($nothingvalue) .'"'. "\n";
|
|
|
|
if ($nothingvalue === $selected) {
|
|
|
|
$output .= ' selected="selected"';
|
|
|
|
}
|
|
|
|
$output .= '>'. $nothing .'</option>' . "\n";
|
|
|
|
|
|
|
|
if (!empty($options)) {
|
|
|
|
foreach ($options as $value => $label) {
|
|
|
|
$output .= ' <option value="'. s($value) .'"';
|
|
|
|
if ((string)$value == (string)$selected ||
|
|
|
|
(is_array($selected) && in_array($value, $selected))) {
|
|
|
|
$output .= ' selected="selected"';
|
|
|
|
}
|
|
|
|
if ($label === '') {
|
|
|
|
$output .= '>'. $value .'</option>' . "\n";
|
|
|
|
} else {
|
|
|
|
$output .= '>'. $label .'</option>' . "\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
echo $output . '</select>' . "\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Show groups
|
|
|
|
*
|
|
|
|
* @param stdClass $game
|
|
|
|
*/
|
|
|
|
function game_showgroups($game) {
|
|
|
|
global $CFG, $USER, $DB;
|
|
|
|
|
|
|
|
$groups = array();
|
|
|
|
if (($recs = $DB->get_records_sql( "SELECT id,name FROM {groups} WHERE courseid=$game->course ORDER BY name"))) {
|
|
|
|
foreach ($recs as $rec) {
|
|
|
|
$groups[ $rec->id] = $rec->name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$href = $CFG->wwwroot.'/mod/game/showattempts.php?q='.$game->id.'&groupid=';
|
|
|
|
?>
|
|
|
|
<script type="text/javascript">
|
|
|
|
function onselectgroup()
|
|
|
|
{
|
|
|
|
window.location.href = "<?php echo $href;?>" + document.getElementById('menugroup').value;
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
<?php
|
|
|
|
|
|
|
|
$attributes = 'onchange="javascript:onselectgroup();"';
|
|
|
|
$name = 'group';
|
|
|
|
$id = 'menu'.$name;
|
|
|
|
$class = 'menu'.$name;
|
|
|
|
$class = 'select ' . $class; // Add 'select' selector always.
|
|
|
|
$nothing = get_string("allgroups");
|
|
|
|
$nothingvalue = '0';
|
|
|
|
$options = $groups;
|
|
|
|
$selected = optional_param('groupid', 0, PARAM_INT);
|
|
|
|
|
|
|
|
$output = '<select id="'. $id .'" class="'. $class .'" name="'. $name .'" '. $attributes .'>' . "\n";
|
|
|
|
$output .= ' <option value="'. $nothingvalue .'"'. "\n";
|
|
|
|
if ($nothingvalue === $selected) {
|
|
|
|
$output .= ' selected="selected"';
|
|
|
|
}
|
|
|
|
$output .= '>'. $nothing .'</option>' . "\n";
|
|
|
|
|
|
|
|
if (!empty($options)) {
|
|
|
|
foreach ($options as $value => $label) {
|
|
|
|
$output .= ' <option value="'. s($value) .'"';
|
|
|
|
if ((string)$value == (string)$selected ||
|
|
|
|
(is_array($selected) && in_array($value, $selected))) {
|
|
|
|
$output .= ' selected="selected"';
|
|
|
|
}
|
|
|
|
if ($label === '') {
|
|
|
|
$output .= '>'. $value .'</option>' . "\n";
|
|
|
|
} else {
|
|
|
|
$output .= '>'. $label .'</option>' . "\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
echo $output . '</select>' . "\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Show attempts
|
|
|
|
*
|
|
|
|
* @param stdClass $game
|
|
|
|
*/
|
|
|
|
function game_showattempts($game) {
|
|
|
|
global $CFG, $DB, $OUTPUT;
|
|
|
|
|
|
|
|
$allowdelete = optional_param('allowdelete', 0, PARAM_INT);
|
|
|
|
|
|
|
|
$userid = optional_param('userid', 0, PARAM_INT);
|
|
|
|
$limitfrom = optional_param('limitfrom', 0, PARAM_INT);
|
|
|
|
$gamekind = $game->gamekind;
|
|
|
|
$update = get_coursemodule_from_instance( 'game', $game->id, $game->course)->id;
|
|
|
|
|
|
|
|
// Here are user attempts.
|
|
|
|
$table = "{game_attempts} as ga, {user} u, {game} as g";
|
|
|
|
$select = "ga.userid=u.id AND ga.gameid={$game->id} AND g.id={$game->id}";
|
|
|
|
$fields = "ga.id, u.lastname, u.firstname, ga.attempts,".
|
|
|
|
"timestart, timefinish, timelastattempt, score, ga.lastip, ga.lastremotehost";
|
|
|
|
if ($userid != 0) {
|
|
|
|
$select .= ' AND u.id='.$userid;
|
|
|
|
}
|
|
|
|
$sql = "SELECT COUNT(*) AS c FROM $table WHERE $select";
|
|
|
|
$count = $DB->count_records_sql( $sql);
|
|
|
|
$maxlines = 20;
|
|
|
|
$recslimitfrom = $recslimitnum = '';
|
|
|
|
if ($count > $maxlines) {
|
|
|
|
$recslimitfrom = ( $limitfrom ? $limitfrom * $maxlines : '');
|
|
|
|
$recslimitnum = $maxlines;
|
|
|
|
|
|
|
|
for ($i = 0; $i * $maxlines < $count; $i++) {
|
|
|
|
if ($i == $limitfrom) {
|
|
|
|
echo ($i + 1).' ';
|
|
|
|
} else {
|
|
|
|
echo "<a href=\"{$CFG->wwwroot}/mod/game/showattempts.php?q={$game->id}&limitfrom=$i&\">".($i + 1)."</a>";
|
|
|
|
echo ' ';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
echo "<br>";
|
|
|
|
}
|
|
|
|
|
|
|
|
$sql = "SELECT $fields FROM $table WHERE $select ORDER BY timelastattempt DESC,timestart DESC";
|
|
|
|
if (($recs = $DB->get_records_sql( $sql, null, $recslimitfrom, $recslimitnum)) != false) {
|
|
|
|
echo '<table border="1">';
|
|
|
|
echo '<tr><td><b>'.get_string( 'delete').'</td><td><b>'.get_string('user').'</td>';
|
|
|
|
echo '<td><b>'.get_string('lastip', 'game').'</b></td>';
|
|
|
|
echo '<td><b>'.get_string('timestart', 'game').'</b></td>';
|
|
|
|
echo '<td><b>'.get_string('timelastattempt', 'game').'</b></td>';
|
|
|
|
echo '<td><b>'.get_string('timefinish', 'game').'</b></td>';
|
|
|
|
echo '<td><b>'.get_string('score', 'game').'</b></td>';
|
|
|
|
echo '<td><b>'.get_string('attempts', 'game').'</b></td>';
|
|
|
|
echo '<td><b>'.get_string('preview', 'game').'</b></td>';
|
|
|
|
echo '<td><b>'.get_string('showsolution', 'game').'</b></td>';
|
|
|
|
echo "</tr>\r\n";
|
|
|
|
|
|
|
|
foreach ($recs as $rec) {
|
|
|
|
echo '<tr>';
|
|
|
|
echo '<td><center>';
|
|
|
|
if (($rec->timefinish == 0) or $allowdelete) {
|
|
|
|
echo "\r\n<a href=\"{$CFG->wwwroot}/mod/game/showattempts.php?attemptid={$rec->id}";
|
|
|
|
echo "&q={$game->id}&action=delete";
|
|
|
|
if ($allowdelete) {
|
|
|
|
echo '&allowdelete=1';
|
|
|
|
}
|
|
|
|
echo '">';
|
|
|
|
echo '<img src="'.game_pix_url('t/delete').'" alt="'.get_string( 'delete').'" /></a>';
|
|
|
|
}
|
|
|
|
echo '</center></td>';
|
|
|
|
echo '<td><center>'.$rec->firstname. ' '.$rec->lastname.'</center></td>';
|
|
|
|
echo '<td><center>'.(strlen( $rec->lastremotehost) > 0 ? $rec->lastremotehost : $rec->lastip).'</center></td>';
|
|
|
|
echo '<td><center>'.( $rec->timestart != 0 ? userdate($rec->timestart) : '')."</center></td>\r\n";
|
|
|
|
echo '<td><center>'.( $rec->timelastattempt != 0 ? userdate($rec->timelastattempt) : '').'</center></td>';
|
|
|
|
echo '<td><center>'.( $rec->timefinish != 0 ? userdate($rec->timefinish) : '').'</center></td>';
|
|
|
|
echo '<td><center>'.round($rec->score * 100).'</center></td>';
|
|
|
|
echo '<td><center>'.$rec->attempts.'</center></td>';
|
|
|
|
echo '<td><center>';
|
|
|
|
|
|
|
|
// Preview.
|
|
|
|
if (($gamekind == 'cross') or ($gamekind == 'sudoku') or ($gamekind == 'hangman') or ($gamekind == 'cryptex')) {
|
|
|
|
echo "\r\n<a href=\"{$CFG->wwwroot}/mod/game/preview.php?action=preview&";
|
|
|
|
echo "attemptid={$rec->id}&gamekind=$gamekind";
|
|
|
|
echo '&update='.$update."&q={$game->id}\">";
|
|
|
|
echo '<img src="'.game_pix_url('t/preview').'" alt="'.get_string( 'preview', 'game').'" /></a>';
|
|
|
|
}
|
|
|
|
echo '</center></td>';
|
|
|
|
|
|
|
|
// Show the solution.
|
|
|
|
echo '<td><center>';
|
|
|
|
if (($gamekind == 'cross') or ($gamekind == 'sudoku') or ($gamekind == 'hangman') or ($gamekind == 'cryptex') ) {
|
|
|
|
echo "\r\n<a href=\"{$CFG->wwwroot}/mod/game/preview.php?action=solution&".
|
|
|
|
"attemptid={$rec->id}&gamekind={$gamekind}&update=$update&&".
|
|
|
|
"q={$game->id}\">";
|
|
|
|
echo '<img src="'.game_pix_url('t/preview').'" alt="'.get_string( 'showsolution', 'game').'" /></a>';
|
|
|
|
}
|
|
|
|
echo '</center></td>';
|
|
|
|
echo "</tr>\r\n";
|
|
|
|
}
|
|
|
|
echo "</table>\r\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* One delete attempt
|
|
|
|
*
|
|
|
|
* @param stdClass $game
|
|
|
|
*/
|
|
|
|
function game_ondeleteattempt( $game) {
|
|
|
|
global $CFG, $DB;
|
|
|
|
|
|
|
|
$attemptid = required_param('attemptid', PARAM_INT);
|
|
|
|
|
|
|
|
$attempt = $DB->get_record( 'game_attempts', array( 'id' => $attemptid));
|
|
|
|
|
|
|
|
switch( $game->gamekind) {
|
|
|
|
case 'bookquiz':
|
|
|
|
$DB->delete_records( 'game_bookquiz_chapters', array( 'attemptid' => $attemptid));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
$DB->delete_records( 'game_queries', array( 'attemptid' => $attemptid));
|
|
|
|
$DB->delete_records( 'game_attempts', array( 'id' => $attemptid));
|
|
|
|
}
|