From: moodler Date: Tue, 2 May 2006 06:00:35 +0000 (+0000) Subject: COnverted from DOS format X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=acfc768e3e525d53d8bd910fcfcb7b98ce356c9b;p=moodle.git COnverted from DOS format --- diff --git a/mod/hotpot/attempt.php b/mod/hotpot/attempt.php index fd495c03d1..b7d5e55a34 100644 --- a/mod/hotpot/attempt.php +++ b/mod/hotpot/attempt.php @@ -1,583 +1,583 @@ -ErrorMsg()); - } - if ($attempt->userid != $USER->id) { - error("User ID is incorrect"); - } - if (! $hotpot = get_record("hotpot", "id", $attempt->hotpot)) { - error("Hot Potatoes ID is incorrect (attempt id = $attempt->id)"); - } - if (! $course = get_record("course", "id", $hotpot->course)) { - error("Course ID is incorrect (hotpot id = $hotpot->id)"); - } - if (! $cm = get_coursemodule_from_instance("hotpot", $hotpot->id, $course->id)) { - error("Course Module ID is incorrect"); - } - - // make sure this user is enrolled in this course - require_login($course->id); - - $next_url = "$CFG->wwwroot/course/view.php?id=$course->id"; - $time = time(); - - // update attempt record fields using incoming data - $attempt->score = optional_param('mark', NULL, PARAM_INT); - $attempt->status = optional_param('status', NULL, PARAM_INT); - $attempt->details = optional_param('detail', NULL, PARAM_RAW); - $attempt->endtime = optional_param('endtime', NULL, PARAM_ALPHA); - $attempt->starttime = optional_param('starttime', NULL, PARAM_ALPHA); - $attempt->timefinish = $time; - - // convert times, if necessary - if (empty($attempt->starttime)) { - $attempt->starttime = 0; - } else { - $attempt->starttime = strtotime($attempt->starttime); - } - if (empty($attempt->endtime)) { - $attempt->endtime = 0; - } else { - $attempt->endtime = strtotime($attempt->endtime); - } - - // set clickreportid, (for click reporting) - $attempt->clickreportid = $attempt->id; - - $quiztype = optional_param('quiztype', 0, PARAM_INT); - - if (empty($attempt->details)) { - hotpot_set_attempt_details($attempt); - $javascript_is_off = true; - } else { - $javascript_is_off = false; - } - - if (empty($attempt->status)) { - if (empty($attempt->endtime)) { - $attempt->status = HOTPOT_STATUS_INPROGRESS; - } else { - $attempt->status = HOTPOT_STATUS_COMPLETED; - } - } - - // check if this is the second (or subsequent) click - if (get_field("hotpot_attempts", "timefinish", "id", $attempt->id)) { - - if ($hotpot->clickreporting==HOTPOT_YES) { - // add attempt record for each form submission - // records are linked via the "clickreportid" field - - // update status in previous records in this group - set_field("hotpot_attempts", "status", $attempt->status, "clickreportid", $attempt->clickreportid); - - // add new attempt record - unset ($attempt->id); - $attempt->id = insert_record("hotpot_attempts", $attempt); - - if (empty($attempt->id)) { - error("Could not insert attempt record: ".$db->ErrorMsg(), $next_url); - } - - // add attempt details record, if necessary - if (!empty($attempt->details)) { - unset($details); - $details->attempt = $attempt->id; - $details->details = $attempt->details; - if (! insert_record("hotpot_details", $details, false)) { - error("Could not insert attempt details record: ".$db->ErrorMsg(), $next_url); - } - } - } else { - // remove previous responses for this attempt, if required - // (N.B. this does NOT remove the attempt record, just the responses) - delete_records("hotpot_responses", "attempt", $attempt->id); - } - } - - // remove slashes added by lib/setup.php - $attempt->details = stripslashes($attempt->details); - - // add details of this attempt - hotpot_add_attempt_details($attempt); - - // add slashes again, so the details can be added to the database - $attempt->details = addslashes($attempt->details); - - // update the attempt record - if (! update_record("hotpot_attempts", $attempt)) { - error("Could not update attempt record: ".$db->ErrorMsg(), $next_url); - } - - // get previous attempt details record, if any - $details_exist = record_exists("hotpot_details", "attempt", $attempt->id); - - // delete/update/add the attempt details record - if (empty($attempt->details)) { - if ($details_exist) { - delete_records("hotpot_details", "attempt", $attempt->id); - } - } else { - if ($details_exist) { - set_field("hotpot_details", "details", $attempt->details, "attempt", $attempt->id); - } else { - unset($details); - $details->attempt = $attempt->id; - $details->details = $attempt->details; - if (! insert_record("hotpot_details", $details)) { - error("Could not insert attempt details record: ".$db->ErrorMsg(), $next_url); - } - } - } - - if ($attempt->status==HOTPOT_STATUS_INPROGRESS) { - if ($javascript_is_off) { - // regenerate HTML page - define('HOTPOT_FIRST_ATTEMPT', false); - include ("$CFG->hotpotroot/view.php"); - } else { - // continue without reloading the page - header("Status: 204"); - header("HTTP/1.0 204 No Response"); - } - - } else { // quiz is finished - - add_to_log($course->id, "hotpot", "submit", "review.php?id=$cm->id&attempt=$attempt->id", "$hotpot->id", "$cm->id"); - - if ($hotpot->shownextquiz==HOTPOT_YES) { - if (is_numeric($next_cm = hotpot_get_next_cm($cm))) { - $next_url = "$CFG->wwwroot/mod/hotpot/view.php?id=$next_cm"; - } - } - - // redirect to the next quiz or the course page - redirect($next_url, get_string('resultssaved', 'hotpot')); - } - -// ================= -// functions -// ================= - -function hotpot_get_next_cm(&$cm) { - // gets the next module in this section of the course - // that is the same type of module as the current module - - $next_mod = false; - - // get a list of $ids of modules in this section - if ($ids = get_field('course_sections', 'sequence', 'id', $cm->section)) { - - $found = false; - $ids = explode(',', $ids); - foreach ($ids as $id) { - if ($found && ($cm->module==get_field('course_modules', 'module', 'id', $id))) { - $next_mod = $id; - break; - } else if ($cm->id==$id) { - $found = true; - } - } - } - return $next_mod; -} -function hotpot_set_attempt_details(&$attempt) { - global $CFG, $HOTPOT_QUIZTYPE; - - // optional_param('showallquestions', 0, PARAM_INT); - - $attempt->details = ''; - $attempt->score = 0; - $attempt->status = HOTPOT_STATUS_COMPLETED; - - $buttons = array('clues', 'hints', 'checks'); - $textfields = array('correct', 'wrong', 'ignored'); - - $ok = false; - $quiztype = optional_param('quiztype', 0, PARAM_ALPHANUM); - if ($quiztype) { - if (is_numeric($quiztype)) { - $ok = array_key_exists($quiztype, $HOTPOT_QUIZTYPE); - } else { - $quiztype = array_search($quiztype, $HOTPOT_QUIZTYPE); - $ok = is_numeric($quiztype); - } - } - if (!$ok) { - return; - // error('Quiz type is missing or invalid'); - // error(get_string('error_invalidquiztype', 'hotpot')); - // - // script finishes here if quiztype is invalid - // - } - - // special flag to detect jquiz multiselect - $is_jquiz_multiselect = false; - - // set maximum question number - $q_max = 0;; - do { - switch ($quiztype) { - case HOTPOT_JCLOZE: - case HOTPOT_JQUIZ: - $field="q{$q_max}_a0_text"; - break; - case HOTPOT_JCB: - case HOTPOT_JCROSS: - case HOTPOT_JMATCH: - case HOTPOT_JMIX: - default: - $field = ''; - } - } while ($field && isset($_POST[$field]) && ($q_max = $q_max+1)); - - // check JQuiz navigation buttons - switch (true) { - case isset($_POST['ShowAllQuestionsButton']): - $_POST['ShowAllQuestions'] = 1; - break; - case isset($_POST['ShowOneByOneButton']): - $_POST['ShowAllQuestions'] = 0; - break; - case isset($_POST['PrevQButton']): - $_POST['ThisQuestion']--; - break; - case isset($_POST['NextQButton']): - $_POST['ThisQuestion']++; - break; - } - - $q = 0; - while ($q<$q_max) { - $responsefield="q{$q}"; - - $questiontype = optional_param("{$responsefield}_questiontype", 0, PARAM_INT); - $is_jquiz_multiselect = ($quiztype==HOTPOT_JQUIZ && $questiontype==HOTPOT_JQUIZ_MULTISELECT); - - if (isset($_POST[$responsefield]) && is_array($_POST[$responsefield])) { - $responsevalue = array(); - foreach ($_POST[$responsefield] as $key=>$value) { - $responsevalue[$key] = clean_param($value, PARAM_CLEAN); - } - } else { - $responsevalue = optional_param($responsefield, ''); - } - if (is_array($responsevalue)) { - // incomplete jquiz multi-select - $responsevalues = $responsevalue; - $responsevalue = implode('+', $responsevalue); - } else { - $responsevalues = explode('+', $responsevalue); - } - - // initialize $response object - $response = new stdClass(); - $response->correct = array(); - $response->wrong = array(); - $response->ignored = array(); - $response->clues = 0; - $response->hints = 0; - $response->checks = 0; - $response->score = 0; - $response->weighting = 0; - - // create another empty object to hold all previous responses (from database) - $oldresponse = new stdClass(); - $vars = get_object_vars($response); - foreach($vars as $name=>$value) { - $oldresponse->$name = $value; - } - - foreach ($buttons as $button) { - if (($field = "q{$q}_{$button}_button") && isset($_POST[$field])) { - $value = optional_param($field, '', PARAM_RAW); - if (!empty($value)) { - $response->$button++; - } - } - } - - // loop through possible answers to this question - $firstcorrectvalue = ''; - $percents = array(); - $a = 0; - while (($valuefield="q{$q}_a{$a}_text") && isset($_POST[$valuefield])) { - $value = optional_param($valuefield, '', PARAM_RAW); - - if (($percentfield="q{$q}_a{$a}_percent") && isset($_POST[$percentfield])) { - $percent = optional_param($percentfield, 0, PARAM_INT); - if ($percent) { - $percents[$value] = $percent; - } - } - - if (($correctfield="q{$q}_a{$a}_correct") && isset($_POST[$correctfield])) { - $correct = optional_param($correctfield, 0, PARAM_INT); - } else { - $correct = false; - } - - if ($correct && empty($firstcorrectvalue)) { - $firstcorrectvalue = $value; - } - - if ($is_jquiz_multiselect) { - $selected = in_array($value, $responsevalues); - if ($correct) { - $response->correct[] = $value; - if (empty($selected)) { - $response->wrong[] = true; - } - } else { - if ($selected) { - $response->wrong[] = true; - } - } - } else { - // single answer only required - if ($responsevalue==$value) { - if ($correct) { - $response->correct[] = $value; - } else { - $response->wrong[] = $value; - } - } else { - $response->ignored[] = $value; - } - } - $a++; - } - - // number of answers for this question - $a_max = $a; - - if ($is_jquiz_multiselect) { - if (empty($response->wrong) && count($responsevalues)==count($response->correct)) { - $response->wrong = array(); - $response->correct = array($responsevalue); - } else { - $response->correct = array(); - $response->wrong = array($responsevalue); - } - } else { - // if response did not match any answer, then this response is wrong - if (empty($response->correct) && empty($response->wrong)) { - $response->wrong[] = $responsevalue; - } - } - - // if this question has not been answered correctly, quiz is still in progress - if (empty($response->correct)) { - - if (isset($_POST["q{$q}_ShowAnswers_button"])) { - $_POST[$responsefield] = $firstcorrectvalue; - } else { - $attempt->status = HOTPOT_STATUS_INPROGRESS; - - if (isset($_POST["q{$q}_Hint_button"])) { - // a particular hint button in JQuiz shortanswer - $_POST['HintButton'] = true; - } - - // give a hint, if necessary - if (isset($_POST['HintButton']) && $firstcorrectvalue) { - - // make sure we only come through here once - unset($_POST['HintButton']); - - $correctlen = strlen($firstcorrectvalue); - $responselen = strlen($responsevalue); - - // check how many letters are the same - $i = 0; - while ($i<$responselen && $i<$correctlen && $responsevalue{$i}==$firstcorrectvalue{$i}) { - $i++; - } - - if ($i<$responselen) { - // remove incorrect characters on the end of the response - $responsevalue = substr($responsevalue, 0, $i); - } - if ($i<$correctlen) { - // append next correct letter - $responsevalue .= $firstcorrectvalue{$i}; - } - $_POST[$responsefield] = $responsevalue; - $response->hints++; - } // end if hint - } - } // end if not correct - - // get clue text, if any - if (($field="q{$q}_clue") && isset($_POST[$field])) { - $response->clue_text = optional_param($field, '', PARAM_RAW); - } - - // get question name - $qq = sprintf('%02d', $q); // (a padded, two-digit version of $q) - if (($field="q{$q}_name") && isset($_POST[$field])) { - $questionname = optional_param($field, '', PARAM_RAW); - $questionname = strip_tags($questionname); - } else { - $questionname = $qq; - } - - // get previous responses to this question (if any) - $records = get_records_sql(" - SELECT - r.* - FROM - {$CFG->prefix}hotpot_attempts AS a, - {$CFG->prefix}hotpot_questions AS q, - {$CFG->prefix}hotpot_responses AS r - WHERE - a.clickreportid = $attempt->clickreportid AND - a.id = r.attempt AND - r.question = q.id AND - q.name = '$questionname' AND - q.hotpot = $attempt->hotpot - ORDER BY - a.timefinish - "); - - if ($records) { - foreach ($records as $record) { - foreach ($buttons as $button) { - $oldresponse->$button = max($oldresponse->$button, $record->$button); - } - foreach ($textfields as $field) { - if ($record->$field && ($field=='correct' || $field=='wrong')) { - $values = explode(',', hotpot_strings($record->$field)); - $oldresponse->$field = array_merge($oldresponse->$field, $values); - } - } - } - } - - // remove "correct" and "wrong" values from "ignored" values - $response->ignored = array_diff($response->ignored, - $response->correct, $response->wrong, $oldresponse->correct, $oldresponse->wrong - ); - - foreach ($buttons as $button) { - $response->$button += $oldresponse->$button; - } - - $value_has_changed = false; - foreach ($textfields as $field) { - $response->$field = array_merge($oldresponse->$field, $response->$field); - $response->$field = array_unique($response->$field); - $response->$field = implode(',', $response->$field); - - if ($field=='correct' || $field=='wrong') { - $array = $oldresponse->$field; - $array = array_unique($array); - $oldresponse->$field = implode(',', $array); - if ($response->$field<>$oldresponse->$field) { - $value_has_changed = true; - } - } - } - if ($value_has_changed) { - $response->checks++; - } - - // $response now holds amalgamation of all responses so far to this question - - // set question score and weighting - if ($response->correct) { - switch ($quiztype) { - case HOTPOT_JCB: - break; - case HOTPOT_JCLOZE: - $strlen = strlen($response->correct); - $response->score = 100*($strlen-($response->checks-1))/$strlen; - $attempt->score += $response->score; - break; - case HOTPOT_JCROSS: - break; - case HOTPOT_JMATCH: - break; - case HOTPOT_JMIX: - break; - case HOTPOT_JQUIZ: - switch ($questiontype) { - case HOTPOT_JQUIZ_MULTICHOICE: - $wrong = explode(',', $response->wrong); - foreach ($wrong as $value) { - if (isset($percents[$value])) { - $percent = $percents[$value]; - } else { - $percent = 0; - } - } - case HOTPOT_JQUIZ_SHORTANSWER: - $strlen = strlen($response->correct); - $response->score = 100*($strlen-($response->checks-1))/$strlen; - break; - case HOTPOT_JQUIZ_MULTISELECT: - if (isset($percents[$response->correct])) { - $percent = $percents[$response->correct]; - } else { - $percent = 0; - } - if ($a_max>0 && $response->checks>0 && $a_max>$response->checks) { - $response->score = $percent*($a_max-($response->checks-1))/$a_max; - } - break; - } - $attempt->score += $response->score; - break; - } - } - - $fieldname = $HOTPOT_QUIZTYPE[$quiztype]."_q{$qq}_name"; - $attempt->details .= "$fieldname$questionname"; - - // encode $response fields as XML - $vars = get_object_vars($response); - foreach($vars as $name=>$value) { - if (!empty($value)) { - $fieldname = $HOTPOT_QUIZTYPE[$quiztype]."_q{$qq}_{$name}"; - $attempt->details .= "$fieldname$value"; - } - } - - $q++; - } // end main loop through $q(uestions) - - // set attempt score - if ($q>0) { - switch ($quiztype) { - case HOTPOT_JCB: - break; - case HOTPOT_JCLOZE: - $attempt->score = floor($attempt->score / $q); - break; - case HOTPOT_JCROSS: - break; - case HOTPOT_JMATCH: - break; - case HOTPOT_JMIX: - break; - case HOTPOT_JQUIZ: - break; - } - } - - if ($attempt->details) { - $attempt->details = ''.$attempt->details.''; - } - -// print "forcing status to in progress ..
\n"; -// $attempt->status = HOTPOT_STATUS_INPROGRESS; -} - -?> \ No newline at end of file +ErrorMsg()); + } + if ($attempt->userid != $USER->id) { + error("User ID is incorrect"); + } + if (! $hotpot = get_record("hotpot", "id", $attempt->hotpot)) { + error("Hot Potatoes ID is incorrect (attempt id = $attempt->id)"); + } + if (! $course = get_record("course", "id", $hotpot->course)) { + error("Course ID is incorrect (hotpot id = $hotpot->id)"); + } + if (! $cm = get_coursemodule_from_instance("hotpot", $hotpot->id, $course->id)) { + error("Course Module ID is incorrect"); + } + + // make sure this user is enrolled in this course + require_login($course->id); + + $next_url = "$CFG->wwwroot/course/view.php?id=$course->id"; + $time = time(); + + // update attempt record fields using incoming data + $attempt->score = optional_param('mark', NULL, PARAM_INT); + $attempt->status = optional_param('status', NULL, PARAM_INT); + $attempt->details = optional_param('detail', NULL, PARAM_RAW); + $attempt->endtime = optional_param('endtime', NULL, PARAM_ALPHA); + $attempt->starttime = optional_param('starttime', NULL, PARAM_ALPHA); + $attempt->timefinish = $time; + + // convert times, if necessary + if (empty($attempt->starttime)) { + $attempt->starttime = 0; + } else { + $attempt->starttime = strtotime($attempt->starttime); + } + if (empty($attempt->endtime)) { + $attempt->endtime = 0; + } else { + $attempt->endtime = strtotime($attempt->endtime); + } + + // set clickreportid, (for click reporting) + $attempt->clickreportid = $attempt->id; + + $quiztype = optional_param('quiztype', 0, PARAM_INT); + + if (empty($attempt->details)) { + hotpot_set_attempt_details($attempt); + $javascript_is_off = true; + } else { + $javascript_is_off = false; + } + + if (empty($attempt->status)) { + if (empty($attempt->endtime)) { + $attempt->status = HOTPOT_STATUS_INPROGRESS; + } else { + $attempt->status = HOTPOT_STATUS_COMPLETED; + } + } + + // check if this is the second (or subsequent) click + if (get_field("hotpot_attempts", "timefinish", "id", $attempt->id)) { + + if ($hotpot->clickreporting==HOTPOT_YES) { + // add attempt record for each form submission + // records are linked via the "clickreportid" field + + // update status in previous records in this group + set_field("hotpot_attempts", "status", $attempt->status, "clickreportid", $attempt->clickreportid); + + // add new attempt record + unset ($attempt->id); + $attempt->id = insert_record("hotpot_attempts", $attempt); + + if (empty($attempt->id)) { + error("Could not insert attempt record: ".$db->ErrorMsg(), $next_url); + } + + // add attempt details record, if necessary + if (!empty($attempt->details)) { + unset($details); + $details->attempt = $attempt->id; + $details->details = $attempt->details; + if (! insert_record("hotpot_details", $details, false)) { + error("Could not insert attempt details record: ".$db->ErrorMsg(), $next_url); + } + } + } else { + // remove previous responses for this attempt, if required + // (N.B. this does NOT remove the attempt record, just the responses) + delete_records("hotpot_responses", "attempt", $attempt->id); + } + } + + // remove slashes added by lib/setup.php + $attempt->details = stripslashes($attempt->details); + + // add details of this attempt + hotpot_add_attempt_details($attempt); + + // add slashes again, so the details can be added to the database + $attempt->details = addslashes($attempt->details); + + // update the attempt record + if (! update_record("hotpot_attempts", $attempt)) { + error("Could not update attempt record: ".$db->ErrorMsg(), $next_url); + } + + // get previous attempt details record, if any + $details_exist = record_exists("hotpot_details", "attempt", $attempt->id); + + // delete/update/add the attempt details record + if (empty($attempt->details)) { + if ($details_exist) { + delete_records("hotpot_details", "attempt", $attempt->id); + } + } else { + if ($details_exist) { + set_field("hotpot_details", "details", $attempt->details, "attempt", $attempt->id); + } else { + unset($details); + $details->attempt = $attempt->id; + $details->details = $attempt->details; + if (! insert_record("hotpot_details", $details)) { + error("Could not insert attempt details record: ".$db->ErrorMsg(), $next_url); + } + } + } + + if ($attempt->status==HOTPOT_STATUS_INPROGRESS) { + if ($javascript_is_off) { + // regenerate HTML page + define('HOTPOT_FIRST_ATTEMPT', false); + include ("$CFG->hotpotroot/view.php"); + } else { + // continue without reloading the page + header("Status: 204"); + header("HTTP/1.0 204 No Response"); + } + + } else { // quiz is finished + + add_to_log($course->id, "hotpot", "submit", "review.php?id=$cm->id&attempt=$attempt->id", "$hotpot->id", "$cm->id"); + + if ($hotpot->shownextquiz==HOTPOT_YES) { + if (is_numeric($next_cm = hotpot_get_next_cm($cm))) { + $next_url = "$CFG->wwwroot/mod/hotpot/view.php?id=$next_cm"; + } + } + + // redirect to the next quiz or the course page + redirect($next_url, get_string('resultssaved', 'hotpot')); + } + +// ================= +// functions +// ================= + +function hotpot_get_next_cm(&$cm) { + // gets the next module in this section of the course + // that is the same type of module as the current module + + $next_mod = false; + + // get a list of $ids of modules in this section + if ($ids = get_field('course_sections', 'sequence', 'id', $cm->section)) { + + $found = false; + $ids = explode(',', $ids); + foreach ($ids as $id) { + if ($found && ($cm->module==get_field('course_modules', 'module', 'id', $id))) { + $next_mod = $id; + break; + } else if ($cm->id==$id) { + $found = true; + } + } + } + return $next_mod; +} +function hotpot_set_attempt_details(&$attempt) { + global $CFG, $HOTPOT_QUIZTYPE; + + // optional_param('showallquestions', 0, PARAM_INT); + + $attempt->details = ''; + $attempt->score = 0; + $attempt->status = HOTPOT_STATUS_COMPLETED; + + $buttons = array('clues', 'hints', 'checks'); + $textfields = array('correct', 'wrong', 'ignored'); + + $ok = false; + $quiztype = optional_param('quiztype', 0, PARAM_ALPHANUM); + if ($quiztype) { + if (is_numeric($quiztype)) { + $ok = array_key_exists($quiztype, $HOTPOT_QUIZTYPE); + } else { + $quiztype = array_search($quiztype, $HOTPOT_QUIZTYPE); + $ok = is_numeric($quiztype); + } + } + if (!$ok) { + return; + // error('Quiz type is missing or invalid'); + // error(get_string('error_invalidquiztype', 'hotpot')); + // + // script finishes here if quiztype is invalid + // + } + + // special flag to detect jquiz multiselect + $is_jquiz_multiselect = false; + + // set maximum question number + $q_max = 0;; + do { + switch ($quiztype) { + case HOTPOT_JCLOZE: + case HOTPOT_JQUIZ: + $field="q{$q_max}_a0_text"; + break; + case HOTPOT_JCB: + case HOTPOT_JCROSS: + case HOTPOT_JMATCH: + case HOTPOT_JMIX: + default: + $field = ''; + } + } while ($field && isset($_POST[$field]) && ($q_max = $q_max+1)); + + // check JQuiz navigation buttons + switch (true) { + case isset($_POST['ShowAllQuestionsButton']): + $_POST['ShowAllQuestions'] = 1; + break; + case isset($_POST['ShowOneByOneButton']): + $_POST['ShowAllQuestions'] = 0; + break; + case isset($_POST['PrevQButton']): + $_POST['ThisQuestion']--; + break; + case isset($_POST['NextQButton']): + $_POST['ThisQuestion']++; + break; + } + + $q = 0; + while ($q<$q_max) { + $responsefield="q{$q}"; + + $questiontype = optional_param("{$responsefield}_questiontype", 0, PARAM_INT); + $is_jquiz_multiselect = ($quiztype==HOTPOT_JQUIZ && $questiontype==HOTPOT_JQUIZ_MULTISELECT); + + if (isset($_POST[$responsefield]) && is_array($_POST[$responsefield])) { + $responsevalue = array(); + foreach ($_POST[$responsefield] as $key=>$value) { + $responsevalue[$key] = clean_param($value, PARAM_CLEAN); + } + } else { + $responsevalue = optional_param($responsefield, ''); + } + if (is_array($responsevalue)) { + // incomplete jquiz multi-select + $responsevalues = $responsevalue; + $responsevalue = implode('+', $responsevalue); + } else { + $responsevalues = explode('+', $responsevalue); + } + + // initialize $response object + $response = new stdClass(); + $response->correct = array(); + $response->wrong = array(); + $response->ignored = array(); + $response->clues = 0; + $response->hints = 0; + $response->checks = 0; + $response->score = 0; + $response->weighting = 0; + + // create another empty object to hold all previous responses (from database) + $oldresponse = new stdClass(); + $vars = get_object_vars($response); + foreach($vars as $name=>$value) { + $oldresponse->$name = $value; + } + + foreach ($buttons as $button) { + if (($field = "q{$q}_{$button}_button") && isset($_POST[$field])) { + $value = optional_param($field, '', PARAM_RAW); + if (!empty($value)) { + $response->$button++; + } + } + } + + // loop through possible answers to this question + $firstcorrectvalue = ''; + $percents = array(); + $a = 0; + while (($valuefield="q{$q}_a{$a}_text") && isset($_POST[$valuefield])) { + $value = optional_param($valuefield, '', PARAM_RAW); + + if (($percentfield="q{$q}_a{$a}_percent") && isset($_POST[$percentfield])) { + $percent = optional_param($percentfield, 0, PARAM_INT); + if ($percent) { + $percents[$value] = $percent; + } + } + + if (($correctfield="q{$q}_a{$a}_correct") && isset($_POST[$correctfield])) { + $correct = optional_param($correctfield, 0, PARAM_INT); + } else { + $correct = false; + } + + if ($correct && empty($firstcorrectvalue)) { + $firstcorrectvalue = $value; + } + + if ($is_jquiz_multiselect) { + $selected = in_array($value, $responsevalues); + if ($correct) { + $response->correct[] = $value; + if (empty($selected)) { + $response->wrong[] = true; + } + } else { + if ($selected) { + $response->wrong[] = true; + } + } + } else { + // single answer only required + if ($responsevalue==$value) { + if ($correct) { + $response->correct[] = $value; + } else { + $response->wrong[] = $value; + } + } else { + $response->ignored[] = $value; + } + } + $a++; + } + + // number of answers for this question + $a_max = $a; + + if ($is_jquiz_multiselect) { + if (empty($response->wrong) && count($responsevalues)==count($response->correct)) { + $response->wrong = array(); + $response->correct = array($responsevalue); + } else { + $response->correct = array(); + $response->wrong = array($responsevalue); + } + } else { + // if response did not match any answer, then this response is wrong + if (empty($response->correct) && empty($response->wrong)) { + $response->wrong[] = $responsevalue; + } + } + + // if this question has not been answered correctly, quiz is still in progress + if (empty($response->correct)) { + + if (isset($_POST["q{$q}_ShowAnswers_button"])) { + $_POST[$responsefield] = $firstcorrectvalue; + } else { + $attempt->status = HOTPOT_STATUS_INPROGRESS; + + if (isset($_POST["q{$q}_Hint_button"])) { + // a particular hint button in JQuiz shortanswer + $_POST['HintButton'] = true; + } + + // give a hint, if necessary + if (isset($_POST['HintButton']) && $firstcorrectvalue) { + + // make sure we only come through here once + unset($_POST['HintButton']); + + $correctlen = strlen($firstcorrectvalue); + $responselen = strlen($responsevalue); + + // check how many letters are the same + $i = 0; + while ($i<$responselen && $i<$correctlen && $responsevalue{$i}==$firstcorrectvalue{$i}) { + $i++; + } + + if ($i<$responselen) { + // remove incorrect characters on the end of the response + $responsevalue = substr($responsevalue, 0, $i); + } + if ($i<$correctlen) { + // append next correct letter + $responsevalue .= $firstcorrectvalue{$i}; + } + $_POST[$responsefield] = $responsevalue; + $response->hints++; + } // end if hint + } + } // end if not correct + + // get clue text, if any + if (($field="q{$q}_clue") && isset($_POST[$field])) { + $response->clue_text = optional_param($field, '', PARAM_RAW); + } + + // get question name + $qq = sprintf('%02d', $q); // (a padded, two-digit version of $q) + if (($field="q{$q}_name") && isset($_POST[$field])) { + $questionname = optional_param($field, '', PARAM_RAW); + $questionname = strip_tags($questionname); + } else { + $questionname = $qq; + } + + // get previous responses to this question (if any) + $records = get_records_sql(" + SELECT + r.* + FROM + {$CFG->prefix}hotpot_attempts AS a, + {$CFG->prefix}hotpot_questions AS q, + {$CFG->prefix}hotpot_responses AS r + WHERE + a.clickreportid = $attempt->clickreportid AND + a.id = r.attempt AND + r.question = q.id AND + q.name = '$questionname' AND + q.hotpot = $attempt->hotpot + ORDER BY + a.timefinish + "); + + if ($records) { + foreach ($records as $record) { + foreach ($buttons as $button) { + $oldresponse->$button = max($oldresponse->$button, $record->$button); + } + foreach ($textfields as $field) { + if ($record->$field && ($field=='correct' || $field=='wrong')) { + $values = explode(',', hotpot_strings($record->$field)); + $oldresponse->$field = array_merge($oldresponse->$field, $values); + } + } + } + } + + // remove "correct" and "wrong" values from "ignored" values + $response->ignored = array_diff($response->ignored, + $response->correct, $response->wrong, $oldresponse->correct, $oldresponse->wrong + ); + + foreach ($buttons as $button) { + $response->$button += $oldresponse->$button; + } + + $value_has_changed = false; + foreach ($textfields as $field) { + $response->$field = array_merge($oldresponse->$field, $response->$field); + $response->$field = array_unique($response->$field); + $response->$field = implode(',', $response->$field); + + if ($field=='correct' || $field=='wrong') { + $array = $oldresponse->$field; + $array = array_unique($array); + $oldresponse->$field = implode(',', $array); + if ($response->$field<>$oldresponse->$field) { + $value_has_changed = true; + } + } + } + if ($value_has_changed) { + $response->checks++; + } + + // $response now holds amalgamation of all responses so far to this question + + // set question score and weighting + if ($response->correct) { + switch ($quiztype) { + case HOTPOT_JCB: + break; + case HOTPOT_JCLOZE: + $strlen = strlen($response->correct); + $response->score = 100*($strlen-($response->checks-1))/$strlen; + $attempt->score += $response->score; + break; + case HOTPOT_JCROSS: + break; + case HOTPOT_JMATCH: + break; + case HOTPOT_JMIX: + break; + case HOTPOT_JQUIZ: + switch ($questiontype) { + case HOTPOT_JQUIZ_MULTICHOICE: + $wrong = explode(',', $response->wrong); + foreach ($wrong as $value) { + if (isset($percents[$value])) { + $percent = $percents[$value]; + } else { + $percent = 0; + } + } + case HOTPOT_JQUIZ_SHORTANSWER: + $strlen = strlen($response->correct); + $response->score = 100*($strlen-($response->checks-1))/$strlen; + break; + case HOTPOT_JQUIZ_MULTISELECT: + if (isset($percents[$response->correct])) { + $percent = $percents[$response->correct]; + } else { + $percent = 0; + } + if ($a_max>0 && $response->checks>0 && $a_max>$response->checks) { + $response->score = $percent*($a_max-($response->checks-1))/$a_max; + } + break; + } + $attempt->score += $response->score; + break; + } + } + + $fieldname = $HOTPOT_QUIZTYPE[$quiztype]."_q{$qq}_name"; + $attempt->details .= "$fieldname$questionname"; + + // encode $response fields as XML + $vars = get_object_vars($response); + foreach($vars as $name=>$value) { + if (!empty($value)) { + $fieldname = $HOTPOT_QUIZTYPE[$quiztype]."_q{$qq}_{$name}"; + $attempt->details .= "$fieldname$value"; + } + } + + $q++; + } // end main loop through $q(uestions) + + // set attempt score + if ($q>0) { + switch ($quiztype) { + case HOTPOT_JCB: + break; + case HOTPOT_JCLOZE: + $attempt->score = floor($attempt->score / $q); + break; + case HOTPOT_JCROSS: + break; + case HOTPOT_JMATCH: + break; + case HOTPOT_JMIX: + break; + case HOTPOT_JQUIZ: + break; + } + } + + if ($attempt->details) { + $attempt->details = ''.$attempt->details.''; + } + +// print "forcing status to in progress ..
\n"; +// $attempt->status = HOTPOT_STATUS_INPROGRESS; +} + +?> diff --git a/mod/hotpot/defaults.php b/mod/hotpot/defaults.php index cd3373848b..8e678f78c6 100644 --- a/mod/hotpot/defaults.php +++ b/mod/hotpot/defaults.php @@ -1,4 +1,4 @@ -hotpot_initialdisable)) { if (!count_records('hotpot')) { set_field('modules', 'visible', 0, 'name', 'hotpot'); // Disable it by default diff --git a/mod/hotpot/view.php b/mod/hotpot/view.php index 70b0dc8df1..9d959d11fd 100644 --- a/mod/hotpot/view.php +++ b/mod/hotpot/view.php @@ -1,455 +1,455 @@ -course)) { - error("Course is misconfigured"); - } - if (! $hotpot = get_record("hotpot", "id", $cm->instance)) { - error("Course module is incorrect"); - } - - } else { - if (! $hotpot = get_record("hotpot", "id", $hp)) { - error("Course module is incorrect"); - } - if (! $course = get_record("course", "id", $hotpot->course)) { - error("Course is misconfigured"); - } - if (! $cm = get_coursemodule_from_instance("hotpot", $hotpot->id, $course->id)) { - error("Course Module ID was incorrect"); - } - } - require_login($course->id); - } - // set nextpage (for error messages) - $nextpage = "$CFG->wwwroot/course/view.php?id=$course->id"; - // header strings - $title = strip_tags($course->shortname.': '.$hotpot->name); - $heading = "$course->fullname"; - $target = empty($CFG->framename) ? '' : ' target="'.$CFG->framename.'"'; - $navigation = ''.get_string("modulenameplural", "hotpot")." -> $hotpot->name"; - if ($course->category) { - $navigation = ''.$course->shortname.' -> '.$navigation; - } - $button = update_module_button($cm->id, $course->id, get_string("modulename", "hotpot").'" style="font-size:0.75em;'); - $loggedinas = ''.user_login_string($course, $USER).''; - $time = time(); - $hppassword = optional_param('hppassword'); - if (HOTPOT_FIRST_ATTEMPT && !isteacher($course->id)) { - // check this quiz is available to this student - // error message, if quiz is unavailable - $error = ''; - // check quiz is visible - if (!hotpot_is_visible($cm)) { - $error = get_string("activityiscurrentlyhidden"); - // check network address - } else if ($hotpot->subnet && !address_in_subnet($_SERVER['REMOTE_ADDR'], $hotpot->subnet)) { - $error = get_string("subneterror", "quiz"); - // check number of attempts - } else if ($hotpot->attempts && $hotpot->attempts <= count_records('hotpot_attempts', 'hotpot', $hotpot->id, 'userid', $USER->id)) { - $error = get_string("nomoreattempts", "quiz"); - // get password - } else if ($hotpot->password && empty($hppassword)) { - print_header($title, $heading, $navigation, "", "", true, $button, $loggedinas, false); - print_heading($hotpot->name); - $boxalign = 'center'; - $boxwidth = 500; - if (trim(strip_tags($hotpot->summary))) { - print_simple_box_start($boxalign, $boxwidth); - print '
'.format_text($hotpot->summary)."
\n"; - print_simple_box_end(); - print "
\n"; - } - print '
'."\n"; - print_simple_box_start($boxalign, $boxwidth); - print '
'; - print get_string('requirepasswordmessage', 'quiz').'

'; - print ''.get_string('password').': '; - print ' '; - print ' '; - print "
\n"; - print_simple_box_end(); - print "
\n"; - print_footer(); - exit; - // check password - } else if ($hotpot->password && strcmp($hotpot->password, $hppassword)) { - $error = get_string("passworderror", "quiz"); - $nextpage = "view.php?id=$cm->id"; - // check quiz is open - } else if ($hotpot->timeopen && $hotpot->timeopen > $time) { - $error = get_string("quiznotavailable", "quiz", userdate($hotpot->timeopen))."
\n"; - // check quiz is not closed - } else if ($hotpot->timeclose && $hotpot->timeclose < $time) { - $error = get_string("quizclosed", "quiz", userdate($hotpot->timeclose))."
\n"; - } - if ($error) { - print_header($title, $heading, $navigation, "", "", true, $button, $loggedinas, false); - notice($error, $nextpage); - // - // script stops here, if quiz is unavailable to student - // - } - } - $available_msg = ''; - if (!empty($hotpot->timeclose) && $hotpot->timeclose > $time) { - // quiz is available until 'timeclose' - $available_msg = get_string("quizavailable", "quiz", userdate($hotpot->timeclose))."
\n"; - } - // open and parse the source file - if(!$hp = new hotpot_xml_quiz($hotpot)) { - error("Quiz is unavailable at the moment"); - } - $get_js = optional_param('js'); - $get_css = optional_param('css'); - $framename = optional_param('framename'); - // look for (HP5 v5) - $frameset = ''; - $frameset_tags = ''; - if (preg_match_all('|]*)>(.*?)|is', $hp->html, $matches)) { - $last = count($matches[0])-1; - $frameset = $matches[2][$last]; - $frameset_tags = $matches[1][$last]; - } - // if HTML is being requested ... - if (empty($get_js) && empty($get_css)) { - if (empty($frameset)) { - // HP v6 - if ($hotpot->navigation==HOTPOT_NAVIGATION_FRAME || $hotpot->navigation==HOTPOT_NAVIGATION_IFRAME) { - $get_html = ($framename=='main') ? true : false; - } else { - $get_html = true; - } - } else { - // HP5 v5 - $get_html = empty($framename) ? true : false; - } - if ($get_html) { - - if (HOTPOT_FIRST_ATTEMPT) { - add_to_log($course->id, "hotpot", "view", "view.php?id=$cm->id", "$hotpot->id", "$cm->id"); - - $attemptid = hotpot_add_attempt($hotpot->id); - if (! is_numeric($attemptid)) { - error('Could not insert attempt record: '.$db->ErrorMsg); - } - } - $hp->adjust_media_urls(); - if (empty($frameset)) { - // HP6 v6 - switch ($hotpot->navigation) { - case HOTPOT_NAVIGATION_BUTTONS: - // do nothing (i.e. leave buttons as they are) - break; - case HOTPOT_NAVIGATION_GIVEUP: - $hp->insert_giveup_form($attemptid, '', ''); - break; - default: - $hp->remove_nav_buttons(); - } - if (isset($hp->real_outputformat) && $hp->real_outputformat==HOTPOT_OUTPUTFORMAT_MOBILE) { - $hp->insert_submission_form($attemptid, '', '', true); - } else { - $hp->insert_submission_form($attemptid, '', ''); - } - } else { - // HP5 v5 - switch ($hotpot->navigation) { - case HOTPOT_NAVIGATION_BUTTONS: - // convert URLs in nav buttons - break; - case HOTPOT_NAVIGATION_GIVEUP: - // $hp->insert_giveup_form($attemptid, '', ''); - break; - default: - // remove navigation buttons - $hp->html = preg_replace('#NavBar\+=(.*);#', '', $hp->html); - } - $hp->insert_submission_form($attemptid, "var NavBar='", "';"); - } - } - } - //FEEDBACK = new Array(); - //FEEDBACK[0] = ''; // url of feedback page/script - //FEEDBACK[1] = ''; // array of array('teachername', 'value'); - //FEEDBACK[2] = ''; // 'student name' [formmail only] - //FEEDBACK[3] = ''; // 'student email' [formmail only] - //FEEDBACK[4] = ''; // window width - //FEEDBACK[5] = ''; // window height - //FEEDBACK[6] = ''; // 'Send a message to teacher' [prompt/button text] - //FEEDBACK[7] = ''; // 'Title' - //FEEDBACK[8] = ''; // 'Teacher' - //FEEDBACK[9] = ''; // 'Message' - //FEEDBACK[10] = ''; // 'Close this window' - $feedback = array(); - switch ($hotpot->studentfeedback) { - case HOTPOT_FEEDBACK_NONE: - // do nothing - break; - case HOTPOT_FEEDBACK_WEBPAGE: - if (empty($hotpot->studentfeedbackurl)) { - $hotpot->studentfeedback = HOTPOT_FEEDBACK_NONE; - } else { - $feedback[0] = "'$hotpot->studentfeedbackurl'"; - } - break; - case HOTPOT_FEEDBACK_FORMMAIL: - $teachers = hotpot_feedback_teachers($course, $hotpot); - if (empty($teachers) || empty($hotpot->studentfeedbackurl)) { - $hotpot->studentfeedback = HOTPOT_FEEDBACK_NONE; - } else { - $feedback[0] = "'$hotpot->studentfeedbackurl'"; - $feedback[1] = $teachers; - $feedback[2] = "'".fullname($USER)."'"; - $feedback[3] = "'".$USER->email."'"; - $feedback[4] = 500; // width - $feedback[5] = 300; // height - } - break; - case HOTPOT_FEEDBACK_MOODLEFORUM: - $module = get_record('modules', 'name', 'forum'); - $forums = get_records('forum', 'course', "$course->id"); - if (empty($module) || empty($module->visible) || empty($forums)) { - $hotpot->studentfeedback = HOTPOT_FEEDBACK_NONE; - } else { - $feedback[0] = "'$CFG->wwwroot/mod/forum/index.php?id=$course->id'"; - } - break; - case HOTPOT_FEEDBACK_MOODLEMESSAGING: - $teachers = hotpot_feedback_teachers($course, $hotpot); - if (empty($CFG->messaging) || empty($teachers)) { - $hotpot->studentfeedback = HOTPOT_FEEDBACK_NONE; - } else { - $feedback[0] = "'$CFG->wwwroot/message/discussion.php?id='"; - $feedback[1] = $teachers; - $feedback[4] = 400; // width - $feedback[5] = 500; // height - } - break; - default: - // do nothing - } - if ($hotpot->studentfeedback != HOTPOT_FEEDBACK_NONE) { - $feedback[6] = "'Send a message to teacher'"; - $feedback[7] = "'Title'"; - $feedback[8] = "'Teacher'"; - $feedback[9] = "'Message'"; - $feedback[10] = "'Close this window'"; - $js = ''; - foreach ($feedback as $i=>$str) { - $js .= 'FEEDBACK['.$i."] = $str;\n"; - } - $js = '\n"; - $hp->html = preg_replace('||i', "$js", $hp->html, 1); - } - // insert hot-potatoes.js - $hp->insert_script(HOTPOT_JS); - // extract first tag - $head = ''; - $pattern = '|]*)>(.*?)|is'; - if (preg_match($pattern, $hp->html, $matches)) { - $head = $matches[2]; - // remove - $head = preg_replace('|<title[^>]*>(.*?)|is', '', $head); - } - // extract |is'; - if (preg_match_all($pattern, $head, $matches)) { - $count = count($matches[0]); - for ($i=0; $i<$count; $i++) { - $styles .= $matches[0][$i]."\n"; - $head = str_replace($matches[0][$i], '', $head); - } - } - // extract |is'; - if (preg_match_all($pattern, $head, $matches)) { - $count = count($matches[0]); - for ($i=0; $i<$count; $i++) { - $scripts .= $matches[0][$i]."\n"; - $head = str_replace($matches[0][$i], '', $head); - } - } - // extract tags - $body = ''; - $body_tags = ''; - $footer = ''; - // HP6 and some HP5 (v6 and v4) - if (preg_match('|]*'.'onLoad=(["\'])(.*?)(\\2)'.'[^>]*)'.'>(.*)|is', $hp->html, $matches)) { - $body = $matches[5]; // contents of first ... block - $body_tags = $matches[1]; - // workaround to ensure javascript onload routine for quiz is always executed - // $body_tags will only be inserted into the tag - // if it is included in the theme/$CFG->theme/header.html, - // so some old or modified themes may not insert $body_tags - $body .= "" - . '\n" - ; - $footer = ''.$footer; - } else if ($frameset) { // HP5 v5 - switch ($framename) { - case 'top': - print_header($title, $heading, $navigation, "", "", true, $button, $loggedinas); - print $footer; - break; - default: - // add a HotPot navigation frame at the top of the page - //$rows = empty($CFG->resource_framesize) ? 85 : $CFG->resource_framesize; - //$frameset = "\n\t".''.$frameset; - //$frameset_tags = preg_replace('|rows="(.*?)"|', 'rows="'.$rows.',\\1"', $frameset_tags); - // put navigation into var NavBar=''; - // add form to TopFrame in "WriteFeedback" function - // OR add form to BottomFrame in "DisplayExercise" function - // submission form: '', '' - // give up form: '', '' - print "\n"; - print "\n$title\n$styles\n$scripts\n"; - print "$frameset\n"; - print "\n"; - break; - } // end switch $framename - exit; - // other files (maybe not even a HotPots) - } else if (preg_match('|]*)'.'>(.*)|is', $hp->html, $matches)) { - $body = $matches[2]; - $body_tags = $matches[1]; - } - // print the quiz to the browser - if ($get_js) { - print($scripts); - exit; - } - if ($get_css) { - print($styles); - exit; - } - switch ($hotpot->navigation) { - case HOTPOT_NAVIGATION_BAR: - //update_module_button($cm->id, $course->id, $strmodulename.'" style="font-size:0.8em') - print_header( - $title, $heading, $navigation, - "", $head.$styles.$scripts, true, $button, - $loggedinas, false, $body_tags - ); - if (!empty($available_msg)) { - notify($available_msg); - } - print $body.$footer; - break; - case HOTPOT_NAVIGATION_FRAME: - switch ($framename) { - case 'top': - print_header($title, $heading, $navigation, "", "", true, $button, $loggedinas); - print $footer; - break; - case 'main': - if (!empty($available_msg)) { - $hp->insert_message('', $available_msg); - } - print $hp->html; - break; - default: - $rows = empty($CFG->resource_framesize) ? 85 : $CFG->resource_framesize; - print "\n"; - print "$title\n"; - print "\n"; - print "id&framename=top\">\n"; - print "id&framename=main\">\n"; - print "\n"; - print "\n"; - break; - } // end switch $framename - break; - case HOTPOT_NAVIGATION_IFRAME: - switch ($framename) { - case 'main': - print $hp->html; - break; - default: - $iframe_id = 'hotpot_iframe'; - $body_tags = " onload=\"set_iframe_height('$iframe_id')\""; - $iframe_js = ''."\n"; - print_header( - $title, $heading, $navigation, - "", $head.$styles.$scripts.$iframe_js, true, $button, - $loggedinas, false, $body_tags - ); - if (!empty($available_msg)) { - notify($available_msg); - } - print "\n"; - print $footer; - break; - } // end switch $framename - break; - default: - // HOTPOT_NAVIGATION_BUTTONS - // HOTPOT_NAVIGATION_GIVEUP - // HOTPOT_NAVIGATION_NONE - if (!empty($available_msg)) { - $hp->insert_message('', $available_msg); - } - print($hp->html); - } -/////////////////////////////////// -/// functions -/////////////////////////////////// -function hotpot_feedback_teachers(&$course, &$hotpot) { - global $CFG; - $teachers = get_records_sql(" - SELECT - u.* - FROM - {$CFG->prefix}user AS u, - {$CFG->prefix}user_teachers AS t - WHERE - t.userid = u.id - AND t.course = $course->id - "); - $teacherdetails = ''; - if (!empty($teachers)) { - $details = array(); - foreach ($teachers as $teacher) { - if ($hotpot->studentfeedback==HOTPOT_FEEDBACK_MOODLEMESSAGING) { - $detail = $teacher->id; - } else { - $detail =$teacher->email; - } - $details[] = "new Array('".fullname($teacher)."', '$detail')"; - } - $teacherdetails = 'new Array('.implode(',', $details).");\n"; - } - return $teacherdetails; -} -?> +course)) { + error("Course is misconfigured"); + } + if (! $hotpot = get_record("hotpot", "id", $cm->instance)) { + error("Course module is incorrect"); + } + + } else { + if (! $hotpot = get_record("hotpot", "id", $hp)) { + error("Course module is incorrect"); + } + if (! $course = get_record("course", "id", $hotpot->course)) { + error("Course is misconfigured"); + } + if (! $cm = get_coursemodule_from_instance("hotpot", $hotpot->id, $course->id)) { + error("Course Module ID was incorrect"); + } + } + require_login($course->id); + } + // set nextpage (for error messages) + $nextpage = "$CFG->wwwroot/course/view.php?id=$course->id"; + // header strings + $title = strip_tags($course->shortname.': '.$hotpot->name); + $heading = "$course->fullname"; + $target = empty($CFG->framename) ? '' : ' target="'.$CFG->framename.'"'; + $navigation = ''.get_string("modulenameplural", "hotpot")." -> $hotpot->name"; + if ($course->category) { + $navigation = ''.$course->shortname.' -> '.$navigation; + } + $button = update_module_button($cm->id, $course->id, get_string("modulename", "hotpot").'" style="font-size:0.75em;'); + $loggedinas = ''.user_login_string($course, $USER).''; + $time = time(); + $hppassword = optional_param('hppassword'); + if (HOTPOT_FIRST_ATTEMPT && !isteacher($course->id)) { + // check this quiz is available to this student + // error message, if quiz is unavailable + $error = ''; + // check quiz is visible + if (!hotpot_is_visible($cm)) { + $error = get_string("activityiscurrentlyhidden"); + // check network address + } else if ($hotpot->subnet && !address_in_subnet($_SERVER['REMOTE_ADDR'], $hotpot->subnet)) { + $error = get_string("subneterror", "quiz"); + // check number of attempts + } else if ($hotpot->attempts && $hotpot->attempts <= count_records('hotpot_attempts', 'hotpot', $hotpot->id, 'userid', $USER->id)) { + $error = get_string("nomoreattempts", "quiz"); + // get password + } else if ($hotpot->password && empty($hppassword)) { + print_header($title, $heading, $navigation, "", "", true, $button, $loggedinas, false); + print_heading($hotpot->name); + $boxalign = 'center'; + $boxwidth = 500; + if (trim(strip_tags($hotpot->summary))) { + print_simple_box_start($boxalign, $boxwidth); + print '
'.format_text($hotpot->summary)."
\n"; + print_simple_box_end(); + print "
\n"; + } + print '
'."\n"; + print_simple_box_start($boxalign, $boxwidth); + print '
'; + print get_string('requirepasswordmessage', 'quiz').'

'; + print ''.get_string('password').': '; + print ' '; + print ' '; + print "
\n"; + print_simple_box_end(); + print "
\n"; + print_footer(); + exit; + // check password + } else if ($hotpot->password && strcmp($hotpot->password, $hppassword)) { + $error = get_string("passworderror", "quiz"); + $nextpage = "view.php?id=$cm->id"; + // check quiz is open + } else if ($hotpot->timeopen && $hotpot->timeopen > $time) { + $error = get_string("quiznotavailable", "quiz", userdate($hotpot->timeopen))."
\n"; + // check quiz is not closed + } else if ($hotpot->timeclose && $hotpot->timeclose < $time) { + $error = get_string("quizclosed", "quiz", userdate($hotpot->timeclose))."
\n"; + } + if ($error) { + print_header($title, $heading, $navigation, "", "", true, $button, $loggedinas, false); + notice($error, $nextpage); + // + // script stops here, if quiz is unavailable to student + // + } + } + $available_msg = ''; + if (!empty($hotpot->timeclose) && $hotpot->timeclose > $time) { + // quiz is available until 'timeclose' + $available_msg = get_string("quizavailable", "quiz", userdate($hotpot->timeclose))."
\n"; + } + // open and parse the source file + if(!$hp = new hotpot_xml_quiz($hotpot)) { + error("Quiz is unavailable at the moment"); + } + $get_js = optional_param('js'); + $get_css = optional_param('css'); + $framename = optional_param('framename'); + // look for (HP5 v5) + $frameset = ''; + $frameset_tags = ''; + if (preg_match_all('|]*)>(.*?)|is', $hp->html, $matches)) { + $last = count($matches[0])-1; + $frameset = $matches[2][$last]; + $frameset_tags = $matches[1][$last]; + } + // if HTML is being requested ... + if (empty($get_js) && empty($get_css)) { + if (empty($frameset)) { + // HP v6 + if ($hotpot->navigation==HOTPOT_NAVIGATION_FRAME || $hotpot->navigation==HOTPOT_NAVIGATION_IFRAME) { + $get_html = ($framename=='main') ? true : false; + } else { + $get_html = true; + } + } else { + // HP5 v5 + $get_html = empty($framename) ? true : false; + } + if ($get_html) { + + if (HOTPOT_FIRST_ATTEMPT) { + add_to_log($course->id, "hotpot", "view", "view.php?id=$cm->id", "$hotpot->id", "$cm->id"); + + $attemptid = hotpot_add_attempt($hotpot->id); + if (! is_numeric($attemptid)) { + error('Could not insert attempt record: '.$db->ErrorMsg); + } + } + $hp->adjust_media_urls(); + if (empty($frameset)) { + // HP6 v6 + switch ($hotpot->navigation) { + case HOTPOT_NAVIGATION_BUTTONS: + // do nothing (i.e. leave buttons as they are) + break; + case HOTPOT_NAVIGATION_GIVEUP: + $hp->insert_giveup_form($attemptid, '', ''); + break; + default: + $hp->remove_nav_buttons(); + } + if (isset($hp->real_outputformat) && $hp->real_outputformat==HOTPOT_OUTPUTFORMAT_MOBILE) { + $hp->insert_submission_form($attemptid, '', '', true); + } else { + $hp->insert_submission_form($attemptid, '', ''); + } + } else { + // HP5 v5 + switch ($hotpot->navigation) { + case HOTPOT_NAVIGATION_BUTTONS: + // convert URLs in nav buttons + break; + case HOTPOT_NAVIGATION_GIVEUP: + // $hp->insert_giveup_form($attemptid, '', ''); + break; + default: + // remove navigation buttons + $hp->html = preg_replace('#NavBar\+=(.*);#', '', $hp->html); + } + $hp->insert_submission_form($attemptid, "var NavBar='", "';"); + } + } + } + //FEEDBACK = new Array(); + //FEEDBACK[0] = ''; // url of feedback page/script + //FEEDBACK[1] = ''; // array of array('teachername', 'value'); + //FEEDBACK[2] = ''; // 'student name' [formmail only] + //FEEDBACK[3] = ''; // 'student email' [formmail only] + //FEEDBACK[4] = ''; // window width + //FEEDBACK[5] = ''; // window height + //FEEDBACK[6] = ''; // 'Send a message to teacher' [prompt/button text] + //FEEDBACK[7] = ''; // 'Title' + //FEEDBACK[8] = ''; // 'Teacher' + //FEEDBACK[9] = ''; // 'Message' + //FEEDBACK[10] = ''; // 'Close this window' + $feedback = array(); + switch ($hotpot->studentfeedback) { + case HOTPOT_FEEDBACK_NONE: + // do nothing + break; + case HOTPOT_FEEDBACK_WEBPAGE: + if (empty($hotpot->studentfeedbackurl)) { + $hotpot->studentfeedback = HOTPOT_FEEDBACK_NONE; + } else { + $feedback[0] = "'$hotpot->studentfeedbackurl'"; + } + break; + case HOTPOT_FEEDBACK_FORMMAIL: + $teachers = hotpot_feedback_teachers($course, $hotpot); + if (empty($teachers) || empty($hotpot->studentfeedbackurl)) { + $hotpot->studentfeedback = HOTPOT_FEEDBACK_NONE; + } else { + $feedback[0] = "'$hotpot->studentfeedbackurl'"; + $feedback[1] = $teachers; + $feedback[2] = "'".fullname($USER)."'"; + $feedback[3] = "'".$USER->email."'"; + $feedback[4] = 500; // width + $feedback[5] = 300; // height + } + break; + case HOTPOT_FEEDBACK_MOODLEFORUM: + $module = get_record('modules', 'name', 'forum'); + $forums = get_records('forum', 'course', "$course->id"); + if (empty($module) || empty($module->visible) || empty($forums)) { + $hotpot->studentfeedback = HOTPOT_FEEDBACK_NONE; + } else { + $feedback[0] = "'$CFG->wwwroot/mod/forum/index.php?id=$course->id'"; + } + break; + case HOTPOT_FEEDBACK_MOODLEMESSAGING: + $teachers = hotpot_feedback_teachers($course, $hotpot); + if (empty($CFG->messaging) || empty($teachers)) { + $hotpot->studentfeedback = HOTPOT_FEEDBACK_NONE; + } else { + $feedback[0] = "'$CFG->wwwroot/message/discussion.php?id='"; + $feedback[1] = $teachers; + $feedback[4] = 400; // width + $feedback[5] = 500; // height + } + break; + default: + // do nothing + } + if ($hotpot->studentfeedback != HOTPOT_FEEDBACK_NONE) { + $feedback[6] = "'Send a message to teacher'"; + $feedback[7] = "'Title'"; + $feedback[8] = "'Teacher'"; + $feedback[9] = "'Message'"; + $feedback[10] = "'Close this window'"; + $js = ''; + foreach ($feedback as $i=>$str) { + $js .= 'FEEDBACK['.$i."] = $str;\n"; + } + $js = '\n"; + $hp->html = preg_replace('||i', "$js", $hp->html, 1); + } + // insert hot-potatoes.js + $hp->insert_script(HOTPOT_JS); + // extract first tag + $head = ''; + $pattern = '|]*)>(.*?)|is'; + if (preg_match($pattern, $hp->html, $matches)) { + $head = $matches[2]; + // remove + $head = preg_replace('|<title[^>]*>(.*?)|is', '', $head); + } + // extract |is'; + if (preg_match_all($pattern, $head, $matches)) { + $count = count($matches[0]); + for ($i=0; $i<$count; $i++) { + $styles .= $matches[0][$i]."\n"; + $head = str_replace($matches[0][$i], '', $head); + } + } + // extract |is'; + if (preg_match_all($pattern, $head, $matches)) { + $count = count($matches[0]); + for ($i=0; $i<$count; $i++) { + $scripts .= $matches[0][$i]."\n"; + $head = str_replace($matches[0][$i], '', $head); + } + } + // extract tags + $body = ''; + $body_tags = ''; + $footer = ''; + // HP6 and some HP5 (v6 and v4) + if (preg_match('|]*'.'onLoad=(["\'])(.*?)(\\2)'.'[^>]*)'.'>(.*)|is', $hp->html, $matches)) { + $body = $matches[5]; // contents of first ... block + $body_tags = $matches[1]; + // workaround to ensure javascript onload routine for quiz is always executed + // $body_tags will only be inserted into the tag + // if it is included in the theme/$CFG->theme/header.html, + // so some old or modified themes may not insert $body_tags + $body .= "" + . '\n" + ; + $footer = ''.$footer; + } else if ($frameset) { // HP5 v5 + switch ($framename) { + case 'top': + print_header($title, $heading, $navigation, "", "", true, $button, $loggedinas); + print $footer; + break; + default: + // add a HotPot navigation frame at the top of the page + //$rows = empty($CFG->resource_framesize) ? 85 : $CFG->resource_framesize; + //$frameset = "\n\t".''.$frameset; + //$frameset_tags = preg_replace('|rows="(.*?)"|', 'rows="'.$rows.',\\1"', $frameset_tags); + // put navigation into var NavBar=''; + // add form to TopFrame in "WriteFeedback" function + // OR add form to BottomFrame in "DisplayExercise" function + // submission form: '', '' + // give up form: '', '' + print "\n"; + print "\n$title\n$styles\n$scripts\n"; + print "$frameset\n"; + print "\n"; + break; + } // end switch $framename + exit; + // other files (maybe not even a HotPots) + } else if (preg_match('|]*)'.'>(.*)|is', $hp->html, $matches)) { + $body = $matches[2]; + $body_tags = $matches[1]; + } + // print the quiz to the browser + if ($get_js) { + print($scripts); + exit; + } + if ($get_css) { + print($styles); + exit; + } + switch ($hotpot->navigation) { + case HOTPOT_NAVIGATION_BAR: + //update_module_button($cm->id, $course->id, $strmodulename.'" style="font-size:0.8em') + print_header( + $title, $heading, $navigation, + "", $head.$styles.$scripts, true, $button, + $loggedinas, false, $body_tags + ); + if (!empty($available_msg)) { + notify($available_msg); + } + print $body.$footer; + break; + case HOTPOT_NAVIGATION_FRAME: + switch ($framename) { + case 'top': + print_header($title, $heading, $navigation, "", "", true, $button, $loggedinas); + print $footer; + break; + case 'main': + if (!empty($available_msg)) { + $hp->insert_message('', $available_msg); + } + print $hp->html; + break; + default: + $rows = empty($CFG->resource_framesize) ? 85 : $CFG->resource_framesize; + print "\n"; + print "$title\n"; + print "\n"; + print "id&framename=top\">\n"; + print "id&framename=main\">\n"; + print "\n"; + print "\n"; + break; + } // end switch $framename + break; + case HOTPOT_NAVIGATION_IFRAME: + switch ($framename) { + case 'main': + print $hp->html; + break; + default: + $iframe_id = 'hotpot_iframe'; + $body_tags = " onload=\"set_iframe_height('$iframe_id')\""; + $iframe_js = ''."\n"; + print_header( + $title, $heading, $navigation, + "", $head.$styles.$scripts.$iframe_js, true, $button, + $loggedinas, false, $body_tags + ); + if (!empty($available_msg)) { + notify($available_msg); + } + print "\n"; + print $footer; + break; + } // end switch $framename + break; + default: + // HOTPOT_NAVIGATION_BUTTONS + // HOTPOT_NAVIGATION_GIVEUP + // HOTPOT_NAVIGATION_NONE + if (!empty($available_msg)) { + $hp->insert_message('', $available_msg); + } + print($hp->html); + } +/////////////////////////////////// +/// functions +/////////////////////////////////// +function hotpot_feedback_teachers(&$course, &$hotpot) { + global $CFG; + $teachers = get_records_sql(" + SELECT + u.* + FROM + {$CFG->prefix}user AS u, + {$CFG->prefix}user_teachers AS t + WHERE + t.userid = u.id + AND t.course = $course->id + "); + $teacherdetails = ''; + if (!empty($teachers)) { + $details = array(); + foreach ($teachers as $teacher) { + if ($hotpot->studentfeedback==HOTPOT_FEEDBACK_MOODLEMESSAGING) { + $detail = $teacher->id; + } else { + $detail =$teacher->email; + } + $details[] = "new Array('".fullname($teacher)."', '$detail')"; + } + $teacherdetails = 'new Array('.implode(',', $details).");\n"; + } + return $teacherdetails; +} +?>