You are here

class qformat_blackboard in Quiz 6.5

Same name and namespace in other branches
  1. 6.6 includes/moodle/question/format/blackboard/format.php \qformat_blackboard

Hierarchy

Expanded class hierarchy of qformat_blackboard

File

includes/moodle/question/format/blackboard/format.php, line 19

View source
class qformat_blackboard extends qformat_default {
  function provide_import() {
    return true;
  }

  /********************************

      function readdata($filename) {
      /// Returns complete file with an array, one item per line

          if (is_readable($filename)) {

              $zip = zip_open($filename);
              $zip_entry = $zip_read($zip);
              if (strstr($zip_entry_name($zip_entry), "imsmanifest") == 0)
                $zip_entry = $zip_read($zip); // skip past manifest file

              if (zip_entry_open($zip, $zip_entry, "r")) {

                $strbuf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                $buf = explode("\n", $strbuf);
                zip_entry_close($zip_entry);
                zip_close($zip);
                return $buf;

              } else {

                zip_close($zip);
                return false;

              }

          }

          return false;
      }

  ********************************/
  function readquestions($lines) {

    /// Parses an array of lines into an array of questions,

    /// where each item is a question object as defined by

    /// readquestion().
    $text = implode($lines, " ");
    $xml = xmlize($text, 0);
    $questions = array();
    $this
      ->process_tf($xml, $questions);
    $this
      ->process_mc($xml, $questions);
    $this
      ->process_ma($xml, $questions);
    $this
      ->process_fib($xml, $questions);
    $this
      ->process_matching($xml, $questions);
    $this
      ->process_essay($xml, $questions);
    return $questions;
  }

  //----------------------------------------

  // Process Essay Questions

  //----------------------------------------
  function process_essay($xml, &$questions) {
    if (isset($xml["POOL"]["#"]["QUESTION_ESSAY"])) {
      $essayquestions = $xml["POOL"]["#"]["QUESTION_ESSAY"];
    }
    else {
      return;
    }
    foreach ($essayquestions as $essayquestion) {
      $question = $this
        ->defaultquestion();
      $question->qtype = ESSAY;

      // determine if the question is already escaped html
      $ishtml = $essayquestion["#"]["BODY"][0]["#"]["FLAGS"][0]["#"]["ISHTML"][0]["@"]["value"];

      // put questiontext in question object
      if ($ishtml) {
        $question->questiontext = html_entity_decode_php4(trim($essayquestion["#"]["BODY"][0]["#"]["TEXT"][0]["#"]));
      }
      $question->questiontext = addslashes($question->questiontext);

      // put name in question object
      $question->name = substr($question->questiontext, 0, 254);
      $question->answer = '';
      $question->feedback = '';
      $question->fraction = 0;
      $questions[] = $question;
    }
  }

  //----------------------------------------

  // Process True / False Questions

  //----------------------------------------
  function process_tf($xml, &$questions) {
    if (isset($xml["POOL"]["#"]["QUESTION_TRUEFALSE"])) {
      $tfquestions = $xml["POOL"]["#"]["QUESTION_TRUEFALSE"];
    }
    else {
      return;
    }
    for ($i = 0; $i < sizeof($tfquestions); $i++) {
      $question = $this
        ->defaultquestion();
      $question->qtype = TRUEFALSE;
      $question->single = 1;

      // Only one answer is allowed
      $thisquestion = $tfquestions[$i];

      // determine if the question is already escaped html
      $ishtml = $thisquestion["#"]["BODY"][0]["#"]["FLAGS"][0]["#"]["ISHTML"][0]["@"]["value"];

      // put questiontext in question object
      if ($ishtml) {
        $question->questiontext = html_entity_decode_php4(trim($thisquestion["#"]["BODY"][0]["#"]["TEXT"][0]["#"]));
      }
      $question->questiontext = addslashes($question->questiontext);

      // put name in question object
      $question->name = substr($question->questiontext, 0, 254);
      $choices = $thisquestion["#"]["ANSWER"];
      $correct_answer = $thisquestion["#"]["GRADABLE"][0]["#"]["CORRECTANSWER"][0]["@"]["answer_id"];

      // first choice is true, second is false.
      $id = $choices[0]["@"]["id"];
      if (strcmp($id, $correct_answer) == 0) {

        // true is correct
        $question->answer = 1;
        $question->feedbacktrue = addslashes(trim(@$thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_CORRECT"][0]["#"]));
        $question->feedbackfalse = addslashes(trim(@$thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_INCORRECT"][0]["#"]));
      }
      else {

        // false is correct
        $question->answer = 0;
        $question->feedbacktrue = addslashes(trim(@$thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_INCORRECT"][0]["#"]));
        $question->feedbackfalse = addslashes(trim(@$thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_CORRECT"][0]["#"]));
      }
      $question->correctanswer = $question->answer;
      $questions[] = $question;
    }
  }

  //----------------------------------------

  // Process Multiple Choice Questions

  //----------------------------------------
  function process_mc($xml, &$questions) {
    if (isset($xml["POOL"]["#"]["QUESTION_MULTIPLECHOICE"])) {
      $mcquestions = $xml["POOL"]["#"]["QUESTION_MULTIPLECHOICE"];
    }
    else {
      return;
    }
    for ($i = 0; $i < sizeof($mcquestions); $i++) {
      $question = $this
        ->defaultquestion();
      $question->qtype = MULTICHOICE;
      $question->single = 1;

      // Only one answer is allowed
      $thisquestion = $mcquestions[$i];

      // determine if the question is already escaped html
      $ishtml = $thisquestion["#"]["BODY"][0]["#"]["FLAGS"][0]["#"]["ISHTML"][0]["@"]["value"];

      // put questiontext in question object
      if ($ishtml) {
        $question->questiontext = html_entity_decode_php4(trim($thisquestion["#"]["BODY"][0]["#"]["TEXT"][0]["#"]));
      }
      $question->questiontext = addslashes($question->questiontext);

      // put name of question in question object, careful of length
      $question->name = substr($question->questiontext, 0, 254);
      $choices = $thisquestion["#"]["ANSWER"];
      for ($j = 0; $j < sizeof($choices); $j++) {
        $choice = trim($choices[$j]["#"]["TEXT"][0]["#"]);

        // put this choice in the question object.
        if ($ishtml) {
          $question->answer[$j] = html_entity_decode_php4($choice);
        }
        $question->answer[$j] = addslashes($question->answer[$j]);
        $id = $choices[$j]["@"]["id"];
        $correct_answer_id = $thisquestion["#"]["GRADABLE"][0]["#"]["CORRECTANSWER"][0]["@"]["answer_id"];

        // if choice is the answer, give 100%, otherwise give 0%
        if (strcmp($id, $correct_answer_id) == 0) {
          $question->fraction[$j] = 1;
          if ($ishtml) {
            $question->feedback[$j] = html_entity_decode_php4(trim(@$thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_CORRECT"][0]["#"]));
          }
          $question->feedback[$j] = addslashes($question->feedback[$j]);
        }
        else {
          $question->fraction[$j] = 0;
          if ($ishtml) {
            $question->feedback[$j] = html_entity_decode_php4(trim(@$thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_INCORRECT"][0]["#"]));
          }
          $question->feedback[$j] = addslashes($question->feedback[$j]);
        }
      }
      $questions[] = $question;
    }
  }

  //----------------------------------------

  // Process Multiple Choice Questions With Multiple Answers

  //----------------------------------------
  function process_ma($xml, &$questions) {
    if (isset($xml["POOL"]["#"]["QUESTION_MULTIPLEANSWER"])) {
      $maquestions = $xml["POOL"]["#"]["QUESTION_MULTIPLEANSWER"];
    }
    else {
      return;
    }
    for ($i = 0; $i < sizeof($maquestions); $i++) {
      $question = $this
        ->defaultquestion();
      $question->qtype = MULTICHOICE;
      $question->defaultgrade = 1;
      $question->single = 0;

      // More than one answers allowed
      $question->image = "";

      // No images with this format
      $thisquestion = $maquestions[$i];

      // determine if the question is already escaped html
      $ishtml = $thisquestion["#"]["BODY"][0]["#"]["FLAGS"][0]["#"]["ISHTML"][0]["@"]["value"];

      // put questiontext in question object
      if ($ishtml) {
        $question->questiontext = html_entity_decode_php4(trim($thisquestion["#"]["BODY"][0]["#"]["TEXT"][0]["#"]));
      }
      $question->questiontext = addslashes($question->questiontext);

      // put name of question in question object
      $question->name = substr($question->questiontext, 0, 254);
      $choices = $thisquestion["#"]["ANSWER"];
      $correctanswers = $thisquestion["#"]["GRADABLE"][0]["#"]["CORRECTANSWER"];
      for ($j = 0; $j < sizeof($choices); $j++) {
        $choice = trim($choices[$j]["#"]["TEXT"][0]["#"]);

        // put this choice in the question object.
        $question->answer[$j] = addslashes($choice);
        $correctanswercount = sizeof($correctanswers);
        $id = $choices[$j]["@"]["id"];
        $iscorrect = 0;
        for ($k = 0; $k < $correctanswercount; $k++) {
          $correct_answer_id = trim($correctanswers[$k]["@"]["answer_id"]);
          if (strcmp($id, $correct_answer_id) == 0) {
            $iscorrect = 1;
          }
        }
        if ($iscorrect) {
          $question->fraction[$j] = floor(100000 / $correctanswercount) / 100000;

          // strange behavior if we have more than 5 decimal places
          $question->feedback[$j] = addslashes(trim($thisquestion["#"]["GRADABLE"][$j]["#"]["FEEDBACK_WHEN_CORRECT"][0]["#"]));
        }
        else {
          $question->fraction[$j] = 0;
          $question->feedback[$j] = addslashes(trim($thisquestion["#"]["GRADABLE"][$j]["#"]["FEEDBACK_WHEN_INCORRECT"][0]["#"]));
        }
      }
      $questions[] = $question;
    }
  }

  //----------------------------------------

  // Process Fill in the Blank Questions

  //----------------------------------------
  function process_fib($xml, &$questions) {
    if (isset($xml["POOL"]["#"]["QUESTION_FILLINBLANK"])) {
      $fibquestions = $xml["POOL"]["#"]["QUESTION_FILLINBLANK"];
    }
    else {
      return;
    }
    for ($i = 0; $i < sizeof($fibquestions); $i++) {
      $question = $this
        ->defaultquestion();
      $question->qtype = SHORTANSWER;
      $question->usecase = 0;

      // Ignore case
      $thisquestion = $fibquestions[$i];

      // determine if the question is already escaped html
      $ishtml = $thisquestion["#"]["BODY"][0]["#"]["FLAGS"][0]["#"]["ISHTML"][0]["@"]["value"];

      // put questiontext in question object
      if ($ishtml) {
        $question->questiontext = html_entity_decode_php4(trim($thisquestion["#"]["BODY"][0]["#"]["TEXT"][0]["#"]));
      }
      $question->questiontext = addslashes($question->questiontext);

      // put name of question in question object
      $question->name = substr($question->questiontext, 0, 254);
      $answer = trim($thisquestion["#"]["ANSWER"][0]["#"]["TEXT"][0]["#"]);
      $question->answer[] = addslashes($answer);
      $question->fraction[] = 1;
      $question->feedback = array();
      if (is_array($thisquestion['#']['GRADABLE'][0]['#'])) {
        $question->feedback[0] = addslashes(trim($thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_CORRECT"][0]["#"]));
      }
      else {
        $question->feedback[0] = '';
      }
      if (is_array($thisquestion["#"]["GRADABLE"][0]["#"])) {
        $question->feedback[1] = addslashes(trim($thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_INCORRECT"][0]["#"]));
      }
      else {
        $question->feedback[1] = '';
      }
      $questions[] = $question;
    }
  }

  //----------------------------------------

  // Process Matching Questions

  //----------------------------------------
  function process_matching($xml, &$questions) {
    if (isset($xml["POOL"]["#"]["QUESTION_MATCH"])) {
      $matchquestions = $xml["POOL"]["#"]["QUESTION_MATCH"];
    }
    else {
      return;
    }
    for ($i = 0; $i < sizeof($matchquestions); $i++) {
      $question = $this
        ->defaultquestion();
      $question->qtype = MATCH;
      $thisquestion = $matchquestions[$i];

      // determine if the question is already escaped html
      $ishtml = $thisquestion["#"]["BODY"][0]["#"]["FLAGS"][0]["#"]["ISHTML"][0]["@"]["value"];

      // put questiontext in question object
      if ($ishtml) {
        $question->questiontext = html_entity_decode_php4(trim($thisquestion["#"]["BODY"][0]["#"]["TEXT"][0]["#"]));
      }
      $question->questiontext = addslashes($question->questiontext);

      // put name of question in question object
      $question->name = substr($question->questiontext, 0, 254);
      $choices = $thisquestion["#"]["CHOICE"];
      for ($j = 0; $j < sizeof($choices); $j++) {
        $subquestion = NULL;
        $choice = $choices[$j]["#"]["TEXT"][0]["#"];
        $choice_id = $choices[$j]["@"]["id"];
        $question->subanswers[] = addslashes(trim($choice));
        $correctanswers = $thisquestion["#"]["GRADABLE"][0]["#"]["CORRECTANSWER"];
        for ($k = 0; $k < sizeof($correctanswers); $k++) {
          if (strcmp($choice_id, $correctanswers[$k]["@"]["choice_id"]) == 0) {
            $answer_id = $correctanswers[$k]["@"]["answer_id"];
            $answers = $thisquestion["#"]["ANSWER"];
            for ($m = 0; $m < sizeof($answers); $m++) {
              $answer = $answers[$m];
              $current_ans_id = $answer["@"]["id"];
              if (strcmp($current_ans_id, $answer_id) == 0) {
                $answer = $answer["#"]["TEXT"][0]["#"];
                $question->subquestions[] = addslashes(trim($answer));
                break;
              }
            }
            break;
          }
        }
      }
      $questions[] = $question;
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
qformat_blackboard::process_essay function
qformat_blackboard::process_fib function
qformat_blackboard::process_ma function
qformat_blackboard::process_matching function
qformat_blackboard::process_mc function
qformat_blackboard::process_tf function
qformat_blackboard::provide_import function Overrides qformat_default::provide_import
qformat_blackboard::readquestions function Parses an array of lines into an array of questions, where each item is a question object as defined by readquestion(). Questions are defined as anything between blank lines. Overrides qformat_default::readquestions
qformat_default::$canaccessbackupdata property
qformat_default::$category property
qformat_default::$catfromfile property
qformat_default::$cattofile property
qformat_default::$contextfromfile property
qformat_default::$contexttofile property
qformat_default::$course property
qformat_default::$displayerrors property
qformat_default::$filename property
qformat_default::$importerrors property
qformat_default::$matchgrades property
qformat_default::$questionids property
qformat_default::$questions property
qformat_default::$realfilename property
qformat_default::$stoponerror property
qformat_default::$translator property
qformat_default::count_questions function Count all non-category questions in the questions array.
qformat_default::create_category_path function find and/or create the category described by a delimited list e.g. $course$/tom/dick/harry or tom/dick/harry
qformat_default::defaultquestion function return an "empty" question Somewhere to specify question parameters that are not handled by import but are required db fields. This should not be overridden.
qformat_default::error function Handle parsing error
qformat_default::exportpostprocess function Do an post-processing that may be required
qformat_default::exportpreprocess function Do any pre-processing that may be required 1
qformat_default::exportprocess function Do the export For most types this should not need to be overrided 1
qformat_default::export_file_extension function Return the files extension appropriate for this type override if you don't want .txt 3
qformat_default::format_question_text function where question specifies a moodle (text) format this performs the conversion.
qformat_default::get_category_path function get the category as a path (e.g., tom/dick/harry)
qformat_default::importimagefile function Import an image file encoded in base64 format
qformat_default::importpostprocess function Override if any post-processing is required 2
qformat_default::importpreprocess function Perform any required pre-processing 2
qformat_default::importprocess function Process the file This method should not normally be overidden 1
qformat_default::presave_process function Enable any processing to be done on the content just prior to the file being saved default is to do nothing 2
qformat_default::provide_export function 4
qformat_default::question_get_export_dir function get directory into which export is going
qformat_default::readdata function Return complete file within an array, one item per line 1
qformat_default::readquestion function Given the data known to define a question in this format, this function converts it into a question object suitable for processing and insertion into Moodle. 5
qformat_default::setCategory function set the category
qformat_default::setCatfromfile function set catfromfile
qformat_default::setCattofile function set cattofile
qformat_default::setContextfromfile function set contextfromfile
qformat_default::setContexts function set an array of contexts.
qformat_default::setContexttofile function set contexttofile
qformat_default::setCourse function set the course class variable
qformat_default::setFilename function set the filename
qformat_default::setMatchgrades function set matchgrades
qformat_default::setQuestions function Set the specific questions to export. Should not include questions with parents (sub questions of cloze question type). Only used for question export.
qformat_default::setRealfilename function set the "real" filename (this is what the user typed, regardless of wha happened next)
qformat_default::setStoponerror function set stoponerror
qformat_default::set_can_access_backupdata function
qformat_default::try_exporting_using_qtypes function Provide export functionality for plugin questiontypes Do not override
qformat_default::try_importing_using_qtypes function Import for questiontype plugins Do not override.
qformat_default::writequestion function convert a single question object into text output in the given format. This must be overriden 4