function qformat_coursetestmanager::importprocess in Quiz 6.5
Same name and namespace in other branches
- 6.6 includes/moodle/question/format/coursetestmanager/format.php \qformat_coursetestmanager::importprocess()
Process the file This method should not normally be overidden
Return value
boolean success
Overrides qformat_default::importprocess
File
- includes/
moodle/ question/ format/ coursetestmanager/ format.php, line 27
Class
Code
function importprocess($filename) {
global $CFG, $USER, $strimportquestions, $form, $question_category, $category, $COURSE, $hostname, $mdapath, $mdbpath;
if (PHP_OS == "Linux" and isset($hostname)) {
$hostname = trim($hostname);
// test the ODBC socket server connection
// if failure, unset hostname and set hostname_access_error
$question_categories = $this
->getquestioncategories($mdbpath, $mdapath, $hostname);
if (!$question_categories) {
$hostname_access_error = $hostname . " ";
unset($hostname);
}
else {
$hostname_access_error = 0;
}
}
if (PHP_OS == "Linux" and !isset($hostname)) {
// copy the file to a semi-permanent location
if (!($basedir = make_upload_directory("{$COURSE->id}"))) {
error("The site administrator needs to fix the file permissions for the data directory");
}
if (!isset($hostname_access_error)) {
$bname = basename($filename);
$cleanfilename = clean_filename($bname);
if ($cleanfilename) {
$newfile = "{$basedir}/{$cleanfilename}";
if (move_uploaded_file($filename, $newfile)) {
chmod($newfile, 0666);
clam_log_upload($newfile, $COURSE);
}
else {
notify(get_string("uploadproblem", "", $filename));
}
}
$filename = $newfile;
}
print_heading_with_help($strimportquestions, "import", "quiz");
print_simple_box_start("center");
if ($hostname_access_error) {
notify("couldn't connect to ODBC Socket Server on " . $hostname_access_error);
}
echo "<form method=\"post\" action=\"import.php\">";
echo '<fieldset class="invisiblefieldset">';
echo "<table cellpadding=\"5\">";
echo "<tr><td align=\"right\">";
echo "What is the hostname or IP address of the ODBC Socket Server:</td><td>";
echo " <input name=\"hostname\" type=\"text\" size=\"50\" value=\"" . stripslashes($hostname_access_error) . "\" />";
echo " <input name=\"filename\" type=\"hidden\" value=\"" . $filename . "\" />";
echo " <input name=\"category\" type=\"hidden\" value=\"" . $category->id . "\" />";
echo " <input name=\"format\" type=\"hidden\" value=\"" . $form->format . "\" />";
echo "</td><td> </td></tr>";
echo "<tr><td align=\"right\">";
echo "What is the location of the database (.mdb file) on the Socket Server:</td><td>";
echo " <input name=\"mdbpath\" type=\"text\" size=\"50\" value=\"" . stripslashes($mdbpath) . "\" />";
echo "</td><td> </td></tr>";
echo "<tr><td align=\"right\">";
echo "What is the location of the system database (System.mda file) on the Socket Server:</td><td>";
echo " <input name=\"mdapath\" type=\"text\" size=\"50\" value=\"" . stripslashes($mdapath) . "\" />";
echo "</td><td> </td></tr>";
echo "<tr><td> </td><td>";
echo " <input type=\"submit\" name=\"save\" value=\"Connect to Server\" />";
echo "</td></tr>";
echo "</table>";
echo '</fieldset>';
echo "</form>";
print_simple_box_end();
print_footer($COURSE);
exit;
}
// we get here if running windows or after connect to ODBC socket server on linux
//
// this generates the page to choose categories of questions to import
//
if (!isset($question_category)) {
if (PHP_OS == "WINNT") {
// copy the file to a semi-permanent location
if (!($basedir = make_upload_directory("{$COURSE->id}"))) {
error("The site administrator needs to fix the file permissions for the data directory");
}
$bname = basename($filename);
$cleanfilename = clean_filename($bname);
if ($cleanfilename) {
$newfile = "{$basedir}/{$cleanfilename}";
if (move_uploaded_file($filename, $newfile)) {
chmod($newfile, 0666);
clam_log_upload($newfile, $COURSE);
}
else {
notify(get_string("uploadproblem", "", $filename));
}
}
$filename = $newfile;
}
// end of file copy
// don't have to do this on linux, since it's alreay been done in the test above
if (PHP_OS == "WINNT") {
$question_categories = $this
->getquestioncategories($filename);
}
// print the intermediary form
if (!($categories = question_category_options($COURSE->id, true))) {
error("No categories!");
}
print_heading_with_help($strimportquestions, "import", "quiz");
print_simple_box_start("center");
echo "<form method=\"post\" action=\"import.php\">";
echo '<fieldset class="invisiblefieldset">';
echo "<table cellpadding=\"5\">";
echo "<tr><td align=\"right\">";
echo "Choose a category of questions to import:</td><td>";
asort($question_categories);
choose_from_menu($question_categories, "question_category", "All Categories", "All Categories", "", "allcategories");
echo " <input name=\"filename\" type=\"hidden\" value=\"" . $filename . "\" />";
echo " <input name=\"category\" type=\"hidden\" value=\"" . $category->id . "\" />";
echo " <input name=\"format\" type=\"hidden\" value=\"" . $form->format . "\" />";
if (PHP_OS == "Linux") {
echo " <input name=\"hostname\" type=\"hidden\" value=\"" . stripslashes(trim($hostname)) . "\" />";
echo " <input name=\"mdbpath\" type=\"hidden\" value=\"" . stripslashes($mdbpath) . "\" />";
echo " <input name=\"mdapath\" type=\"hidden\" value=\"" . stripslashes($mdapath) . "\" />";
}
echo "</td><td> </td>";
echo "</tr><tr><td> </td><td>";
echo " <input type=\"submit\" name=\"save\" value=\"Import Questions\" />";
echo "</td></tr>";
echo "</table>";
echo '</fieldset>';
echo "</form>";
print_simple_box_end();
print_footer($COURSE);
exit;
}
//
// this is the main import section
//
notify("Importing questions");
if (PHP_OS == "Linux") {
$hostname = trim($hostname);
$records = $this
->getquestions($mdbpath, $question_category, $mdapath, $hostname);
}
else {
$records = $this
->getquestions($filename, $question_category);
}
foreach ($records as $qrec) {
$question = $this
->defaultquestion();
if ($qrec[9] != "") {
$question->image = $qrec[9];
}
// 0 Selected
// 1 PracticeTestOK?
// 2 QuestionText
// 3 QuestionType
// 4 Option1Text
// 5 Option2Text
// 6 Option3Text
// 7 Option4Text
// 8 CorrectAnswer
// 9 Graphic
// 10 Module
// 11 ChapterNumber
// 12 PageNumber
$ref = "Answer can be found in chapter " . $qrec[11] . ", page " . $qrec[12] . ".";
switch ($qrec[3]) {
case 1:
$question->qtype = MULTICHOICE;
// MULTICHOICE, SHORTANSWER, TRUEFALSE
// echo "<pre>";echo htmlspecialchars($qrec[2]); echo "</pre>";
$question->questiontext = addslashes(trim($qrec[2]));
// echo "<pre>";echo $question->questiontext; echo "</pre>";
$question->name = preg_replace("/<br />/", "", $question->questiontext);
$question->single = 1;
// Only one answer is allowed -- used for multiple choicers
$fractionset = 0;
for ($i = 4; $i <= 7; $i++) {
if ($qrec[$i] != "") {
$question->answer[$i - 3] = addslashes($qrec[$i]);
if ($qrec[8] == $i - 3) {
// if this is the index of CorrectAnswer
$question->fraction[$i - 3] = 1;
$fractionset = 1;
}
else {
$question->fraction[$i - 3] = 0;
}
$question->feedback[$i - 3] = ($qrec[8] == $i - 3 ? "Correct. " : "Incorrect. ") . $ref;
}
}
if ($fractionset == 0) {
$question->fraction[1] = 1;
}
break;
case 2:
// TRUE FALSE
$question->qtype = TRUEFALSE;
$question->questiontext = addslashes(trim($qrec[2]));
$question->name = preg_replace("/<br />/", "", $question->questiontext);
// for TF, $question->answer should be 1 for true, 0 for false
if ($qrec[8] == "T") {
$question->answer = 1;
}
else {
$question->answer = 0;
}
// for TF, use $question->feedbacktrue and feedbackfalse
$question->feedbacktrue = ($qrec[8] == "T" ? "Correct. " : "Incorrect. ") . $ref;
$question->feedbackfalse = ($qrec[8] == "F" ? "Correct. " : "Incorrect. ") . $ref;
break;
case 3:
$question->qtype = SHORTANSWER;
$question->questiontext = addslashes(trim($qrec[2]));
// echo "<pre>";echo $question->questiontext; echo "</pre>";
$question->name = preg_replace("/<br />/", "", $question->questiontext);
$question->usecase = 0;
// Ignore case -- for SHORT ANSWER questions
$answers = explode("~", $qrec[8]);
$question->answer[0] = " ";
$question->fraction[0] = 1;
for ($i = 0; $i < count($answers); $i++) {
$question->answer[$i] = addslashes(trim($answers[$i]));
$question->feedback[$i] = $ref;
$question->fraction[$i] = 1;
// 1 for 100%, 0 for none or somewhere in between
}
break;
case 4:
$question = 0;
notify("Cannot use essay questions - skipping question " . $qrec[2] . " " . $ref);
break;
default:
$question = 0;
notify("Misformatted Record. Question Skipped.");
break;
}
if ($question) {
$questions[] = $question;
}
}
$count = 0;
// process all the questions
if (PHP_OS == "WINNT") {
$filename = str_replace("\\\\", "\\", $filename);
$filename = str_replace("/", "\\", $filename);
}
foreach ($questions as $question) {
// Process and store each question
$count++;
echo "<hr /><p><b>{$count}</b>. " . stripslashes($question->questiontext) . "</p>";
$question->category = $this->category->id;
$question->stamp = make_unique_id_code();
// Set the unique code (not to be changed)
$question->createdby = $USER->id;
$question->timecreated = time();
if (!($question->id = insert_record("question", $question))) {
error("Could not insert new question!");
}
$this->questionids[] = $question->id;
// Now to save all the answers and type-specific options
$result = save_question_options($question);
if (!empty($result->error)) {
notify($result->error);
$this
->deletedatabase($filename);
return false;
}
if (!empty($result->notice)) {
notify($result->notice);
$this
->deletedatabase($filename);
return true;
}
// Give the question a unique version stamp determined by question_hash()
set_field('question', 'version', question_hash($question), 'id', $question->id);
}
$this
->deletedatabase($filename);
return true;
}