You are here

function qformat_coursetestmanager::importprocess in Quiz 6.5

Same name and namespace in other branches
  1. 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

qformat_coursetestmanager

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>&nbsp;</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>&nbsp;</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>&nbsp;</td></tr>";
    echo "<tr><td>&nbsp;</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>&nbsp;</td>";
    echo "</tr><tr><td>&nbsp;</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;
}