/// find out current groups mode
$currentgroup = groups_get_activity_group($cm, true);
+ $nostudentsingroup = false;//true if a group is selected and their is noeone in it.
if (!empty($currentgroup)) {
// all users who can attempt quizzes and who are in the currently selected group
- if (!$groupstudents = get_users_by_capability($context, 'mod/quiz:attempt','','','','',$currentgroup,'',false)){
- $groupstudents = array();
+ $groupstudents = get_users_by_capability($context, 'mod/quiz:attempt','','','','',$currentgroup,'',false);
+ if (!$groupstudents){
+ $nostudentsingroup = true;
}
- $groupstudentslist = join(',', array_keys($groupstudents));
- $allowedlist = $groupstudentslist;
}
$questions = quiz_report_load_questions($quiz);
if ($groupmode = groups_get_activity_groupmode($cm)) { // Groups are being used
if (!$table->is_downloading()) {
groups_print_activity_menu($cm, $reporturl->out());
+ if ($currentgroup && !$groupstudents){
+ notify(get_string('nostudentsingroup', 'quiz_statistics'));
+ }
}
}
$mform->display();
}
$fromqa = '{quiz_attempts} qa ';
- $whereqa = 'quiz = ? AND preview=0 AND timefinish !=0 ';
+ $whereqa = 'quiz = :quizid AND preview=0 AND timefinish !=0 ';
+ $qaparams = array('quizid'=>$quiz->id);
+ if (!empty($currentgroup) && $groupstudents) {
+ list($grpsql, $grpparams) = $DB->get_in_or_equal(array_keys($groupstudents), SQL_PARAMS_NAMED, 'u0000');
+ $whereqa .= ' AND qa.userid '.$grpsql.' ';
+ $qaparams += $grpparams;
+ }
$sql = 'SELECT (attempt=1) AS isfirst, COUNT(1) AS countrecs, SUM(sumgrades) AS total ' .
'FROM '.$fromqa.
'WHERE ' .$whereqa.
'GROUP BY (attempt=1)';
- //Calculating_MEAN_of_grades_for_all_attempts_by_students
- //http://docs.moodle.org/en/Development:Quiz_item_analysis_calculations_in_practise#Calculating_MEAN_of_grades_for_all_attempts_by_students
- if (!$attempttotals = $DB->get_records_sql($sql, array($quiz->id))){
- print_heading(get_string('noattempts','quiz'));
- return true;
+ if (!$nostudentsingroup){
+ //Calculating_MEAN_of_grades_for_all_attempts_by_students
+ //http://docs.moodle.org/en/Development:Quiz_item_analysis_calculations_in_practise#Calculating_MEAN_of_grades_for_all_attempts_by_students
+ if (!$attempttotals = $DB->get_records_sql($sql, $qaparams)){
+ print_heading(get_string('noattempts','quiz'));
+ $s = 0;
+ } else {
+ $firstattempt = $attempttotals[1];
+ $allattempts = new object();
+ $allattempts->countrecs = $firstattempt->countrecs +
+ (isset($attempttotals[0])?$attempttotals[0]->countrecs:0);
+ $allattempts->total = $firstattempt->total +
+ (isset($attempttotals[0])?$attempttotals[0]->total:0);
+ if ($useallattempts){
+ $usingattempts = $allattempts;
+ $usingattempts->attempts = get_string('allattempts', 'quiz_statistics');
+ $usingattempts->sql = '';
+ } else {
+ $usingattempts = $firstattempt;
+ $usingattempts->attempts = get_string('firstattempts', 'quiz_statistics');
+ $usingattempts->sql = 'AND qa.attempt=1 ';
+ }
+ $usingattempts->heading = get_string('statsfor', 'quiz_statistics', $usingattempts->attempts);
+ $s = $usingattempts->countrecs;
+ }
} else {
- $firstattempt = $attempttotals[1];
- $allattempts = new object();
- $allattempts->countrecs = $firstattempt->countrecs +
- (isset($attempttotals[0])?$attempttotals[0]->countrecs:0);
- $allattempts->total = $firstattempt->total +
- (isset($attempttotals[0])?$attempttotals[0]->total:0);
+ $s = 0;
}
-
- if (!$table->is_downloading()) {
+
+ if ($s && !$table->is_downloading()) {
print_heading(get_string('quizoverallstatistics', 'quiz_statistics'));
$quizoverallstatistics = new object();
$quizoverallstatistics->align = array('center', 'center');
$quizoverallstatistics->data[] = array(get_string('allattemptsavg', 'quiz_statistics'), quiz_report_scale_sumgrades_as_percentage($allattempts->total / $allattempts->countrecs, $quiz));
print_table($quizoverallstatistics);
}
+ $quizattsstatistics = new object();
+ $quizattsstatistics->align = array('center', 'center');
+ $quizattsstatistics->width = '60%';
+ $quizattsstatistics->class = 'generaltable titlesleft';
+ $quizattsstatistics->data = array();
//get the median
- if (!$table->is_downloading()) {
- if ($useallattempts){
- $usingattempts = $allattempts;
- $usingattempts->attempts = get_string('allattempts', 'quiz_statistics');
- $usingattempts->sql = '';
- } else {
- $usingattempts = $firstattempt;
- $usingattempts->attempts = get_string('firstattempts', 'quiz_statistics');
- $usingattempts->sql = 'AND qa.attempt=1 ';
- }
- $usingattempts->heading = get_string('statsfor', 'quiz_statistics', $usingattempts->attempts);
+ if ($s && !$table->is_downloading()) {
+
print_heading($usingattempts->heading);
- if (($usingattempts->countrecs/2)==floor($usingattempts->countrecs/2)){
+ if (($s%2)==0){
//even number of attempts
- $limitoffset = (floor($usingattempts->countrecs/2)) - 1;
+ $limitoffset = ($s/2) - 1;
$limit = 2;
} else {
- $limitoffset = ($usingattempts->countrecs/2) - 1;
+ $limitoffset = (floor($s/2)) - 1;
$limit = 1;
}
$sql = 'SELECT id, sumgrades ' .
'WHERE ' .$whereqa.
$usingattempts->sql.
'ORDER BY sumgrades';
- if (!$mediangrades = $DB->get_records_sql_menu($sql, array($quiz->id), $limitoffset, $limit)){
+ if (!$mediangrades = $DB->get_records_sql_menu($sql, $qaparams, $limitoffset, $limit)){
print_error('errormedian', 'quiz_statistics');
}
if (count($mediangrades)==1){
$median += array_shift($mediangrades);
$median = $median /2;
}
-
- $s = $usingattempts->countrecs;
if ($s>1){
- $quizattsstatistics = new object();
- $quizattsstatistics->align = array('center', 'center');
- $quizattsstatistics->width = '60%';
- $quizattsstatistics->class = 'generaltable titlesleft';
- $quizattsstatistics->data = array();
$quizattsstatistics->data[] = array(get_string('median', 'quiz_statistics'), quiz_report_scale_sumgrades_as_percentage($median, $quiz));
//fetch sum of squared, cubed and power 4d
//differences between grades and mean grade
- $mean = $usingattempts->total / $usingattempts->countrecs;
+ $mean = $usingattempts->total / $s;
$sql = "SELECT " .
- "SUM(POWER((qa.sumgrades - ?),2)) AS power2, " .
- "SUM(POWER((qa.sumgrades - ?),3)) AS power3, ".
- "SUM(POWER((qa.sumgrades - ?),4)) AS power4 ".
+ "SUM(POWER((qa.sumgrades - :mean1),2)) AS power2, " .
+ "SUM(POWER((qa.sumgrades - :mean2),3)) AS power3, ".
+ "SUM(POWER((qa.sumgrades - :mean3),4)) AS power4 ".
'FROM ' .$fromqa.
'WHERE ' .$whereqa.
$usingattempts->sql;
- $params = array($mean, $mean, $mean, $quiz->id);
+ $params = array('mean1' => $mean, 'mean2' => $mean, 'mean3' => $mean)+$qaparams;
if (!$powers = $DB->get_record_sql($sql, $params)){
print_error('errorpowers', 'quiz_statistics');
}
$quizattsstatistics->data[] = array(get_string('kurtosis', 'quiz_statistics'), $kurtosis);
}
- //CIC, ER and SE.
- //http://docs.moodle.org/en/Development:Quiz_item_analysis_calculations_in_practise#CIC.2C_ER_and_SE
- list($qsql, $sqlparams) = $DB->get_in_or_equal(array_keys($questions), SQL_PARAMS_QM);
- array_unshift($sqlparams, $quiz->id);//put quiz id in at beginning of array
- $qgradeavgsql = "SELECT qs.question, AVG(qs.grade) FROM " .
- "{question_sessions} qns, " .
- "{question_states} qs, " .
- $fromqa.' '.
- 'WHERE ' .$whereqa.
- 'AND qns.attemptid = qa.uniqueid '.
- 'AND qs.question '.$qsql.' ' .
- $usingattempts->sql.
- 'AND qns.newgraded = qs.id GROUP BY qs.question';
- $qgradeavgs = $DB->get_records_sql_menu($qgradeavgsql, $sqlparams);
-
- $sum = 0;
- $sql = 'SELECT COUNT(1) as s,' .
- 'SUM(POWER((qs.grade - ?),2)) AS power2 ' .
- 'FROM ' .
- '{question_sessions} qns, ' .
- '{question_states} qs, '.
- $fromqa.' '.
- 'WHERE ' .$whereqa.
- 'AND qns.attemptid = qa.uniqueid '.
- 'AND qs.question = ? ' .
- $usingattempts->sql.
- 'AND qns.newgraded = qs.id';
- foreach ($qgradeavgs as $qid => $qgradeavg){
- $params = array($qgradeavg, $quiz->id, $qid);
- $fromdb = $DB->get_record_sql($sql, $params);
- if ($fromdb === false){
- print_error('errorpowerquestions', 'quiz_statistics');
- }
- $questions[$qid]->facility = $qgradeavg / $questions[$qid]->grade;
- $questions[$qid]->power = $fromdb->power2;
- $questions[$qid]->s = $fromdb->s;
- $questions[$qid]->sd = sqrt($questions[$qid]->power / ($questions[$qid]->s -1));
- $sum += $questions[$qid]->power;
+ }
+ }
+ if ($s){
+ //CIC, ER and SE.
+ //http://docs.moodle.org/en/Development:Quiz_item_analysis_calculations_in_practise#CIC.2C_ER_and_SE
+ list($qsql, $sqlparams) = $DB->get_in_or_equal(array_keys($questions), SQL_PARAMS_NAMED);
+ $sqlparams += $qaparams;//put quiz id in at beginning of array
+ $qgradeavgsql = "SELECT qs.question, AVG(qs.grade) FROM " .
+ "{question_sessions} qns, " .
+ "{question_states} qs, " .
+ $fromqa.' '.
+ 'WHERE ' .$whereqa.
+ 'AND qns.attemptid = qa.uniqueid '.
+ 'AND qs.question '.$qsql.' ' .
+ $usingattempts->sql.
+ 'AND qns.newgraded = qs.id GROUP BY qs.question';
+ $qgradeavgs = $DB->get_records_sql_menu($qgradeavgsql, $sqlparams);
+
+ $sum = 0;
+ $sql = 'SELECT COUNT(1) as s,' .
+ 'SUM(POWER((qs.grade - :mean),2)) AS power2 ' .
+ 'FROM ' .
+ '{question_sessions} qns, ' .
+ '{question_states} qs, '.
+ $fromqa.' '.
+ 'WHERE ' .$whereqa.
+ 'AND qns.attemptid = qa.uniqueid '.
+ 'AND qs.question = :qid ' .
+ $usingattempts->sql.
+ 'AND qns.newgraded = qs.id';
+ foreach (array_keys($questions) as $qid){
+ $params = array('mean' => $qgradeavgs[$qid], 'qid' => $qid)+ $qaparams;
+ $fromdb = $DB->get_record_sql($sql, $params);
+ if ($fromdb === false){
+ print_error('errorpowerquestions', 'quiz_statistics');
+ }
+ $questions[$qid]->s = $fromdb->s;
+ if ($s>1){
+ $questions[$qid]->facility = $qgradeavgs[$qid] / $questions[$qid]->grade;
+ $questions[$qid]->sd = sqrt($fromdb->power2 / ($questions[$qid]->s -1));
}
- $sumofvarianceforallpositions = $sum / ($usingattempts->countrecs -1);
+ $sum += $fromdb->power2;
+ }
+ }
+ if (!$table->is_downloading()){
+ if ($s>1){
+ $sumofvarianceforallpositions = $sum / ($s -1);
$p = count($qgradeavgs);//no of positions
if ($p > 1){
$cic = (100 * $p / ($p -1)) * (1 - ($sumofvarianceforallpositions/$k2));
$quizattsstatistics->data[] = array(get_string('standarderror', 'quiz_statistics'),
quiz_report_scale_sumgrades_as_percentage($standarderror, $quiz));
}
+ }
+ if ($quizattsstatistics->data){
print_table($quizattsstatistics);
}
-
}
if (!$table->is_downloading()){
print_heading(get_string('quizstructureanalysis', 'quiz_statistics'));