Class for text questions. More...
Public Member Functions | |
assTextQuestion ($title="", $comment="", $author="", $owner=-1, $question="") | |
assTextQuestion constructor | |
isComplete () | |
Returns true, if a multiple choice question is complete for use. | |
fromXML (&$item, &$questionpool_id, &$tst_id, &$tst_object, &$question_counter, &$import_mapping) | |
Creates a question from a QTI file. | |
to_xml ($a_include_header=true, $a_include_binary=true, $a_shuffle=false, $test_output=false, $force_image_references=false) | |
Returns a QTI xml representation of the question. | |
saveToDb ($original_id="") | |
Saves a assTextQuestion object to a database. | |
loadFromDb ($question_id) | |
Loads a assTextQuestion object from a database. | |
duplicate ($for_test=true, $title="", $author="", $owner="") | |
Duplicates an assTextQuestion. | |
copyObject ($target_questionpool, $title="") | |
Copies an assTextQuestion object. | |
getQuestion () | |
Gets the text question. | |
setQuestion ($question="") | |
Sets the text question. | |
getMaxNumOfChars () | |
Gets the maximum number of characters for the text solution. | |
setMaxNumOfChars ($maxchars=0) | |
Sets the maximum number of characters for the text solution. | |
getMaximumPoints () | |
Returns the maximum points, a learner can reach answering the question. | |
setReachedPoints ($active_id, $points, $pass=NULL) | |
Sets the points, a learner has reached answering the question. | |
_setReachedPoints ($active_id, $question_id, $points, $maxpoints, $pass=NULL) | |
Sets the points, a learner has reached answering the question Additionally objective results are updated. | |
isKeywordMatching ($answertext, $a_keyword) | |
Checks if one of the keywords matches the answertext. | |
calculateReachedPoints ($active_id, $pass=NULL) | |
Returns the points, a learner has reached answering the question. | |
saveWorkingData ($active_id, $pass=NULL) | |
Saves the learners input of the question to the database. | |
syncWithOriginal () | |
createRandomSolution ($test_id, $user_id) | |
getQuestionType () | |
Returns the question type of the question. | |
getKeywords () | |
Returns the keywords of the question. | |
setKeywords ($a_keywords) | |
Sets the keywords of the question. | |
& | getKeywordList () |
Returns the keywords of the question in an array. | |
getTextRating () | |
Returns the rating option for text comparisons. | |
setTextRating ($a_text_rating) | |
Sets the rating option for text comparisons. | |
getAdditionalTableName () | |
Returns the name of the additional question data table in the database. | |
Data Fields | |
$question | |
$maxNumOfChars | |
$keywords | |
$text_rating |
Class for text questions.
assTextQuestion is a class for text questions
class.assTextQuestion.php Assessment
Definition at line 36 of file class.assTextQuestion.php.
assTextQuestion::_setReachedPoints | ( | $ | active_id, | |
$ | question_id, | |||
$ | points, | |||
$ | maxpoints, | |||
$ | pass = NULL | |||
) |
Sets the points, a learner has reached answering the question Additionally objective results are updated.
Sets the points, a learner has reached answering the question
integer | $user_id The database ID of the learner | |
integer | $test_id The database Id of the test containing the question | |
integer | $points The points the user has reached answering the question |
Definition at line 734 of file class.assTextQuestion.php.
References assQuestion::$points, $query, $result, assQuestion::_getSolutionMaxPass(), ilObjTest::_getUserIdFromActiveId(), and ilCourseObjectiveResult::_updateObjectiveResult().
Referenced by ilTestEvaluationGUI::evalSelectedUsers().
{ global $ilDB; if ($points <= $maxpoints) { if (is_null($pass)) { include_once "./assessment/classes/class.assQuestion.php"; $pass = assQuestion::_getSolutionMaxPass($question_id, $active_id); } $query = sprintf("UPDATE tst_test_result SET points = %s WHERE active_fi = %s AND question_fi = %s AND pass = %s", $ilDB->quote($points . ""), $ilDB->quote($active_id . ""), $ilDB->quote($question_id . ""), $ilDB->quote($pass . "") ); $result = $ilDB->query($query); // finally update objective result include_once "./assessment/classes/class.ilObjTest.php"; include_once './course/classes/class.ilCourseObjectiveResult.php'; ilCourseObjectiveResult::_updateObjectiveResult(ilObjTest::_getUserIdFromActiveId($active_id),$question_id,$points); return true; } else { return false; } }
assTextQuestion::assTextQuestion | ( | $ | title = "" , |
|
$ | comment = "" , |
|||
$ | author = "" , |
|||
$ | owner = -1 , |
|||
$ | question = "" | |||
) |
assTextQuestion constructor
The constructor takes possible arguments an creates an instance of the assTextQuestion object.
string | $title A title string to describe the question | |
string | $comment A comment string to describe the question | |
string | $author A string containing the name of the questions author | |
integer | $owner A numerical ID to identify the owner/creator | |
string | $question The question string of the text question public |
Definition at line 88 of file class.assTextQuestion.php.
References assQuestion::$author, assQuestion::$comment, assQuestion::$owner, $question, assQuestion::$title, and assQuestion::assQuestion().
{ $this->assQuestion($title, $comment, $author, $owner); $this->question = $question; $this->maxNumOfChars = 0; $this->points = 0; $this->keywords = ""; }
assTextQuestion::calculateReachedPoints | ( | $ | active_id, | |
$ | pass = NULL | |||
) |
Returns the points, a learner has reached answering the question.
Returns the points, a learner has reached answering the question The points are calculated from the given answers including checks for all special scoring options in the test container.
integer | $user_id The database ID of the learner | |
integer | $test_id The database Id of the test containing the question public |
Definition at line 833 of file class.assTextQuestion.php.
References $keywords, assQuestion::$points, $query, $result, $row, assQuestion::getId(), getKeywordList(), getMaximumPoints(), assQuestion::getSolutionMaxPass(), and isKeywordMatching().
{ global $ilDB; $points = 0; if (is_null($pass)) { $pass = $this->getSolutionMaxPass($active_id); } $query = sprintf("SELECT * FROM tst_solutions WHERE active_fi = %s AND question_fi = %s AND pass = %s", $ilDB->quote($active_id . ""), $ilDB->quote($this->getId() . ""), $ilDB->quote($pass . "") ); $result = $ilDB->query($query); if ($result->numRows() == 1) { $row = $result->fetchRow(DB_FETCHMODE_ASSOC); if ($row["points"]) { $points = $row["points"]; } else { $keywords =& $this->getKeywordList(); if (count($keywords)) { $foundkeyword = false; foreach ($keywords as $keyword) { if (!$foundkeyword) { if ($this->isKeywordMatching($row["value1"], $keyword)) { $foundkeyword = true; } } } if ($foundkeyword) $points = $this->getMaximumPoints(); } } } $points = parent::calculateReachedPoints($active_id, $pass = NULL, $points); return $points; }
assTextQuestion::copyObject | ( | $ | target_questionpool, | |
$ | title = "" | |||
) |
Copies an assTextQuestion object.
Copies an assTextQuestion object
public
Definition at line 582 of file class.assTextQuestion.php.
References assQuestion::$title, assQuestion::_getOriginalId(), and assQuestion::getObjId().
{ if ($this->id <= 0) { // The question has not been saved. It cannot be duplicated return; } // duplicate the question in database $clone = $this; include_once ("./assessment/classes/class.assQuestion.php"); $original_id = assQuestion::_getOriginalId($this->id); $clone->id = -1; $source_questionpool = $this->getObjId(); $clone->setObjId($target_questionpool); if ($title) { $clone->setTitle($title); } $clone->saveToDb(); // copy question page content $clone->copyPageOfQuestion($original_id); // copy XHTML media objects $clone->copyXHTMLMediaObjectsOfQuestion($original_id); return $clone->id; }
assTextQuestion::createRandomSolution | ( | $ | test_id, | |
$ | user_id | |||
) |
assTextQuestion::duplicate | ( | $ | for_test = true , |
|
$ | title = "" , |
|||
$ | author = "" , |
|||
$ | owner = "" | |||
) |
Duplicates an assTextQuestion.
Duplicates an assTextQuestion
public
Definition at line 531 of file class.assTextQuestion.php.
References assQuestion::$author, assQuestion::$owner, assQuestion::$title, assQuestion::_getOriginalId(), and assQuestion::getId().
Referenced by fromXML().
{ if ($this->id <= 0) { // The question has not been saved. It cannot be duplicated return; } // duplicate the question in database $this_id = $this->getId(); $clone = $this; include_once ("./assessment/classes/class.assQuestion.php"); $original_id = assQuestion::_getOriginalId($this->id); $clone->id = -1; if ($title) { $clone->setTitle($title); } if ($author) { $clone->setAuthor($author); } if ($owner) { $clone->setOwner($owner); } if ($for_test) { $clone->saveToDb($original_id); } else { $clone->saveToDb(); } // copy question page content $clone->copyPageOfQuestion($this_id); // copy XHTML media objects $clone->copyXHTMLMediaObjectsOfQuestion($this_id); return $clone->id; }
assTextQuestion::fromXML | ( | &$ | item, | |
&$ | questionpool_id, | |||
&$ | tst_id, | |||
&$ | tst_object, | |||
&$ | question_counter, | |||
&$ | import_mapping | |||
) |
Creates a question from a QTI file.
Receives parameters from a QTI parser and creates a valid ILIAS question object
object | $item The QTI item object | |
integer | $questionpool_id The id of the parent questionpool | |
integer | $tst_id The id of the parent test if the question is part of a test | |
object | $tst_object A reference to the parent test object | |
integer | $question_counter A reference to a question counter to count the questions of an imported question pool | |
array | $import_mapping An array containing references to included ILIAS objects public |
Definition at line 136 of file class.assTextQuestion.php.
References $_SESSION, $keywords, ilObjQuestionPool::_getImportDirectory(), ilObjTest::_getImportDirectory(), ilRTE::_replaceMediaObjectImageSrc(), ilObjMediaObject::_saveTempFileAsMediaObject(), ilObjMediaObject::_saveUsage(), duplicate(), getContent(), assQuestion::getId(), getQuestion(), assQuestion::QTIMaterialToString(), saveToDb(), assQuestion::setAuthor(), assQuestion::setComment(), assQuestion::setEstimatedWorkingTime(), setKeywords(), setMaxNumOfChars(), assQuestion::setObjId(), assQuestion::setOwner(), assQuestion::setPoints(), setQuestion(), assQuestion::setSuggestedSolution(), setTextRating(), and assQuestion::setTitle().
{ global $ilUser; // empty session variable for imported xhtml mobs unset($_SESSION["import_mob_xhtml"]); $presentation = $item->getPresentation(); $duration = $item->getDuration(); $now = getdate(); $maxchars = 0; $maxpoints = 0; $created = sprintf("%04d%02d%02d%02d%02d%02d", $now['year'], $now['mon'], $now['mday'], $now['hours'], $now['minutes'], $now['seconds']); foreach ($presentation->order as $entry) { switch ($entry["type"]) { case "response": $response = $presentation->response[$entry["index"]]; $rendertype = $response->getRenderType(); switch (strtolower(get_class($rendertype))) { case "ilqtirenderfib": $maxchars = $rendertype->getMaxchars(); break; } break; } } foreach ($item->resprocessing as $resprocessing) { $outcomes = $resprocessing->getOutcomes(); foreach ($outcomes->decvar as $decvar) { $maxpoints = $decvar->getMaxvalue(); } } $this->setTitle($item->getTitle()); $this->setComment($item->getComment()); $this->setAuthor($item->getAuthor()); $this->setOwner($ilUser->getId()); $this->setQuestion($this->QTIMaterialToString($item->getQuestiontext())); $this->setObjId($questionpool_id); $this->setEstimatedWorkingTime($duration["h"], $duration["m"], $duration["s"]); $this->setPoints($maxpoints); $this->setMaxNumOfChars($maxchars); $textrating = $item->getMetadataEntry("textrating"); if (strlen($textrating)) { $this->setTextRating($textrating); } $keywords = $item->getMetadataEntry("keywords"); if (strlen($keywords)) { $this->setKeywords($keywords); } $this->saveToDb(); if (count($item->suggested_solutions)) { foreach ($item->suggested_solutions as $suggested_solution) { $this->setSuggestedSolution($suggested_solution["solution"]->getContent(), $suggested_solution["gap_index"], true); } $this->saveToDb(); } // handle the import of media objects in XHTML code if (is_array($_SESSION["import_mob_xhtml"])) { include_once "./content/classes/Media/class.ilObjMediaObject.php"; include_once "./Services/RTE/classes/class.ilRTE.php"; foreach ($_SESSION["import_mob_xhtml"] as $mob) { if ($tst_id > 0) { include_once "./assessment/classes/class.ilObjTest.php"; $importfile = ilObjTest::_getImportDirectory() . "/" . $_SESSION["tst_import_subdir"] . "/" . $mob["uri"]; } else { include_once "./assessment/classes/class.ilObjQuestionPool.php"; $importfile = ilObjQuestionPool::_getImportDirectory() . "/" . $_SESSION["qpl_import_subdir"] . "/" . $mob["uri"]; } $media_object =& ilObjMediaObject::_saveTempFileAsMediaObject(basename($importfile), $importfile, FALSE); ilObjMediaObject::_saveUsage($media_object->getId(), "qpl:html", $this->getId()); $this->setQuestion(ilRTE::_replaceMediaObjectImageSrc(str_replace("src=\"" . $mob["mob"] . "\"", "src=\"" . "il_" . IL_INST_ID . "_mob_" . $media_object->getId() . "\"", $this->getQuestion()), 1)); } $this->saveToDb(); } if ($tst_id > 0) { $q_1_id = $this->getId(); $question_id = $this->duplicate(true); $tst_object->questions[$question_counter++] = $question_id; $import_mapping[$item->getIdent()] = array("pool" => $q_1_id, "test" => $question_id); } else { $import_mapping[$item->getIdent()] = array("pool" => $this->getId(), "test" => 0); } //$ilLog->write(strftime("%D %T") . ": finished import multiple choice question (single response)"); }
assTextQuestion::getAdditionalTableName | ( | ) |
Returns the name of the additional question data table in the database.
Returns the name of the additional question data table in the database
Reimplemented from assQuestion.
Definition at line 1094 of file class.assTextQuestion.php.
{ return "qpl_question_essay"; }
& assTextQuestion::getKeywordList | ( | ) |
Returns the keywords of the question in an array.
Returns the keywords of the question in an array
Definition at line 1031 of file class.assTextQuestion.php.
References $keywords.
Referenced by calculateReachedPoints().
{ $keywords = array(); if (preg_match_all("/([^\s]+)/", $this->keywords, $matches)) { foreach ($matches[1] as $keyword) { array_push($keywords, trim($keyword)); } } return $keywords; }
assTextQuestion::getKeywords | ( | ) |
Returns the keywords of the question.
Returns the keywords of the question
Definition at line 1005 of file class.assTextQuestion.php.
Referenced by saveToDb(), syncWithOriginal(), and to_xml().
{
return $this->keywords;
}
assTextQuestion::getMaximumPoints | ( | ) |
Returns the maximum points, a learner can reach answering the question.
Returns the maximum points, a learner can reach answering the question
public
Reimplemented from assQuestion.
Definition at line 681 of file class.assTextQuestion.php.
Referenced by calculateReachedPoints(), and isComplete().
{
return $this->points;
}
assTextQuestion::getMaxNumOfChars | ( | ) |
Gets the maximum number of characters for the text solution.
Gets the maximum number of characters for the text solution
Definition at line 647 of file class.assTextQuestion.php.
Referenced by saveToDb(), saveWorkingData(), and to_xml().
{ if (strcmp($this->maxNumOfChars, "") == 0) { return 0; } else { return $this->maxNumOfChars; } }
assTextQuestion::getQuestion | ( | ) |
Gets the text question.
Gets the question string of the assTextQuestion object
Definition at line 619 of file class.assTextQuestion.php.
Referenced by fromXML(), and to_xml().
{
return $this->question;
}
assTextQuestion::getQuestionType | ( | ) |
Returns the question type of the question.
Returns the question type of the question
Definition at line 992 of file class.assTextQuestion.php.
Referenced by saveToDb().
{
return 8;
}
assTextQuestion::getTextRating | ( | ) |
Returns the rating option for text comparisons.
Returns the rating option for text comparisons
Definition at line 1053 of file class.assTextQuestion.php.
Referenced by isKeywordMatching(), saveToDb(), syncWithOriginal(), and to_xml().
{
return $this->text_rating;
}
assTextQuestion::isComplete | ( | ) |
Returns true, if a multiple choice question is complete for use.
Returns true, if a multiple choice question is complete for use
Reimplemented from assQuestion.
Definition at line 111 of file class.assTextQuestion.php.
References getMaximumPoints().
Referenced by saveToDb(), and syncWithOriginal().
{ if (($this->title) and ($this->author) and ($this->question) and ($this->getMaximumPoints() > 0)) { return true; } else { return false; } }
assTextQuestion::isKeywordMatching | ( | $ | answertext, | |
$ | a_keyword | |||
) |
Checks if one of the keywords matches the answertext.
Checks if one of the keywords matches the answertext
string | $answertext The answertext of the user | |
string | $a_keyword The keyword which should be checked |
Definition at line 776 of file class.assTextQuestion.php.
References $result, getTextRating(), ilStr::strPos(), and ilStr::strToLower().
Referenced by calculateReachedPoints().
{ $result = FALSE; $textrating = $this->getTextRating(); include_once "./classes/class.ilStr.php"; switch ($textrating) { case TEXTGAP_RATING_CASEINSENSITIVE: if (ilStr::strPos(ilStr::strToLower($answertext), ilStr::strToLower($a_keyword)) !== false) return TRUE; break; case TEXTGAP_RATING_CASESENSITIVE: if (ilStr::strPos(utf8_decode($answertext), $a_keyword) !== false) return TRUE; break; } $answerwords = array(); if (preg_match_all("/([^\s.]+)/", $answertext, $matches)) { foreach ($matches[1] as $answerword) { array_push($answerwords, trim($answerword)); } } foreach ($answerwords as $a_original) { switch ($textrating) { case TEXTGAP_RATING_LEVENSHTEIN1: if (levenshtein(utf8_decode($a_original), utf8_decode($a_keyword)) <= 1) return TRUE; break; case TEXTGAP_RATING_LEVENSHTEIN2: if (levenshtein(utf8_decode($a_original), utf8_decode($a_keyword)) <= 2) return TRUE; break; case TEXTGAP_RATING_LEVENSHTEIN3: if (levenshtein(utf8_decode($a_original), utf8_decode($a_keyword)) <= 3) return TRUE; break; case TEXTGAP_RATING_LEVENSHTEIN4: if (levenshtein(utf8_decode($a_original), utf8_decode($a_keyword)) <= 4) return TRUE; break; case TEXTGAP_RATING_LEVENSHTEIN5: if (levenshtein(utf8_decode($a_original), utf8_decode($a_keyword)) <= 5) return TRUE; break; } } return $result; }
assTextQuestion::loadFromDb | ( | $ | question_id | ) |
Loads a assTextQuestion object from a database.
Loads a assTextQuestion object from a database
object | $db A pear DB object | |
integer | $question_id A unique key which defines the text question in the database public |
Reimplemented from assQuestion.
Definition at line 491 of file class.assTextQuestion.php.
References $data, $query, $result, ilRTE::_replaceMediaObjectImageSrc(), and assQuestion::setEstimatedWorkingTime().
{ global $ilDB; $query = sprintf("SELECT qpl_questions.*, qpl_question_essay.* FROM qpl_questions, qpl_question_essay WHERE question_id = %s AND qpl_questions.question_id = qpl_question_essay.question_fi", $ilDB->quote($question_id) ); $result = $ilDB->query($query); if (strcmp(strtolower(get_class($result)), db_result) == 0) { if ($result->numRows() == 1) { $data = $result->fetchRow(DB_FETCHMODE_OBJECT); $this->id = $question_id; $this->title = $data->title; $this->comment = $data->comment; $this->solution_hint = $data->solution_hint; $this->original_id = $data->original_id; $this->obj_id = $data->obj_fi; $this->author = $data->author; $this->owner = $data->owner; include_once("./Services/RTE/classes/class.ilRTE.php"); $this->question = ilRTE::_replaceMediaObjectImageSrc($data->question_text, 1); $this->maxNumOfChars = $data->maxNumOfChars; $this->keywords = $data->keywords; $this->text_rating = $data->textgap_rating; $this->points = $data->points; $this->setEstimatedWorkingTime(substr($data->working_time, 0, 2), substr($data->working_time, 3, 2), substr($data->working_time, 6, 2)); } } parent::loadFromDb($question_id); }
assTextQuestion::saveToDb | ( | $ | original_id = "" |
) |
Saves a assTextQuestion object to a database.
Saves a assTextQuestion object to a database
object | $db A pear DB object public |
Reimplemented from assQuestion.
Definition at line 388 of file class.assTextQuestion.php.
References $query, $result, ilRTE::_cleanupMediaObjectUsage(), ilRTE::_replaceMediaObjectImageSrc(), assQuestion::createPageObject(), assQuestion::getEstimatedWorkingTime(), assQuestion::getId(), getKeywords(), getMaxNumOfChars(), assQuestion::getPoints(), getQuestionType(), assQuestion::getTestId(), getTextRating(), assQuestion::insertIntoTest(), and isComplete().
Referenced by fromXML().
{ global $ilDB; $complete = 0; if ($this->isComplete()) { $complete = 1; } $estw_time = $this->getEstimatedWorkingTime(); $estw_time = sprintf("%02d:%02d:%02d", $estw_time['h'], $estw_time['m'], $estw_time['s']); if ($original_id) { $original_id = $ilDB->quote($original_id); } else { $original_id = "NULL"; } // cleanup RTE images which are not inserted into the question text include_once("./Services/RTE/classes/class.ilRTE.php"); ilRTE::_cleanupMediaObjectUsage($this->question, "qpl:html", $this->getId()); if ($this->id == -1) { // Neuen Datensatz schreiben $now = getdate(); $question_type = $this->getQuestionType(); $created = sprintf("%04d%02d%02d%02d%02d%02d", $now['year'], $now['mon'], $now['mday'], $now['hours'], $now['minutes'], $now['seconds']); $query = sprintf("INSERT INTO qpl_questions (question_id, question_type_fi, obj_fi, title, comment, author, owner, points, question_text, working_time, complete, created, original_id, TIMESTAMP) VALUES (NULL, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NULL)", $ilDB->quote($question_type), $ilDB->quote($this->obj_id), $ilDB->quote($this->title), $ilDB->quote($this->comment), $ilDB->quote($this->author), $ilDB->quote($this->owner), $ilDB->quote($this->getPoints() . ""), $ilDB->quote(ilRTE::_replaceMediaObjectImageSrc($this->question, 0)), $ilDB->quote($estw_time), $ilDB->quote("$complete"), $ilDB->quote($created), $original_id ); $result = $ilDB->query($query); if ($result == DB_OK) { $this->id = $ilDB->getLastInsertId(); $query = sprintf("INSERT INTO qpl_question_essay (question_fi, maxNumOfChars, keywords, textgap_rating) VALUES (%s, %s, %s, %s)", $ilDB->quote($this->id . ""), $ilDB->quote($this->getMaxNumOfChars()), $ilDB->quote($this->getKeywords() . ""), $ilDB->quote($this->getTextRating() . "") ); $ilDB->query($query); // create page object of question $this->createPageObject(); if ($this->getTestId() > 0) { $this->insertIntoTest($this->getTestId()); } } } else { // Vorhandenen Datensatz aktualisieren $query = sprintf("UPDATE qpl_questions SET obj_fi = %s, title = %s, comment = %s, author = %s, points = %s, question_text = %s, working_time=%s, complete = %s WHERE question_id = %s", $ilDB->quote($this->obj_id. ""), $ilDB->quote($this->title), $ilDB->quote($this->comment), $ilDB->quote($this->author), $ilDB->quote($this->getPoints() . ""), $ilDB->quote(ilRTE::_replaceMediaObjectImageSrc($this->question, 0)), $ilDB->quote($estw_time), $ilDB->quote("$complete"), $ilDB->quote($this->id) ); $result = $ilDB->query($query); $query = sprintf("UPDATE qpl_question_essay SET maxNumOfChars = %s, keywords = %s, textgap_rating = %s WHERE question_fi = %s", $ilDB->quote($this->getMaxNumOfChars()), $ilDB->quote($this->getKeywords() . ""), $ilDB->quote($this->getTextRating() . ""), $ilDB->quote($this->id . "") ); $result = $ilDB->query($query); } parent::saveToDb($original_id); }
assTextQuestion::saveWorkingData | ( | $ | active_id, | |
$ | pass = NULL | |||
) |
Saves the learners input of the question to the database.
Saves the learners input of the question to the database
integer | $test_id The database id of the test containing this question |
Reimplemented from assQuestion.
Definition at line 890 of file class.assTextQuestion.php.
References $_POST, $query, $result, ilObjAssessmentFolder::_enabledAssessmentLogging(), ilObjAssessmentFolder::_getLogLanguage(), ilObjTest::_getPass(), assQuestion::getId(), getMaxNumOfChars(), assQuestion::logAction(), ilUtil::stripSlashes(), and ilStr::subStr().
{ global $ilDB; global $ilUser; include_once "./assessment/classes/class.ilObjTest.php"; $activepass = ilObjTest::_getPass($active_id); $query = sprintf("DELETE FROM tst_solutions WHERE active_fi = %s AND question_fi = %s AND pass = %s", $ilDB->quote($active_id . ""), $ilDB->quote($this->getId() . ""), $ilDB->quote($activepass . "") ); $result = $ilDB->query($query); $text = ilUtil::stripSlashes($_POST["TEXT"], FALSE); if ($this->getMaxNumOfChars()) { include_once "./classes/class.ilStr.php"; $text = ilStr::subStr($text, 0, $this->getMaxNumOfChars()); } $entered_values = 0; if (strlen($text)) { $query = sprintf("INSERT INTO tst_solutions (solution_id, active_fi, question_fi, value1, value2, pass, TIMESTAMP) VALUES (NULL, %s, %s, %s, NULL, %s, NULL)", $ilDB->quote($active_id . ""), $ilDB->quote($this->getId() . ""), $ilDB->quote(trim($text) . ""), $ilDB->quote($activepass . "") ); $result = $ilDB->query($query); $entered_values++; } if ($entered_values) { include_once ("./classes/class.ilObjAssessmentFolder.php"); if (ilObjAssessmentFolder::_enabledAssessmentLogging()) { $this->logAction($this->lng->txtlng("assessment", "log_user_entered_values", ilObjAssessmentFolder::_getLogLanguage()), $active_id, $this->getId()); } } else { include_once ("./classes/class.ilObjAssessmentFolder.php"); if (ilObjAssessmentFolder::_enabledAssessmentLogging()) { $this->logAction($this->lng->txtlng("assessment", "log_user_not_entered_values", ilObjAssessmentFolder::_getLogLanguage()), $active_id, $this->getId()); } } parent::saveWorkingData($active_id, $pass); return true; }
assTextQuestion::setKeywords | ( | $ | a_keywords | ) |
Sets the keywords of the question.
Sets the keywords of the question
string | $a_keywords The keywords of the question public |
Definition at line 1018 of file class.assTextQuestion.php.
Referenced by fromXML().
{ $this->keywords = $a_keywords; }
assTextQuestion::setMaxNumOfChars | ( | $ | maxchars = 0 |
) |
Sets the maximum number of characters for the text solution.
Sets the maximum number of characters for the text solution
integer | $maxchars The maximum number of characters for the text solution public |
Definition at line 668 of file class.assTextQuestion.php.
Referenced by fromXML().
{ $this->maxNumOfChars = $maxchars; }
assTextQuestion::setQuestion | ( | $ | question = "" |
) |
Sets the text question.
Sets the question string of the assTextQuestion object
string | $question A string containing the text question public |
Definition at line 633 of file class.assTextQuestion.php.
References $question.
Referenced by fromXML().
{ $this->question = $question; }
assTextQuestion::setReachedPoints | ( | $ | active_id, | |
$ | points, | |||
$ | pass = NULL | |||
) |
Sets the points, a learner has reached answering the question.
Sets the points, a learner has reached answering the question
integer | $user_id The database ID of the learner | |
integer | $test_id The database Id of the test containing the question | |
integer | $points The points the user has reached answering the question |
Definition at line 697 of file class.assTextQuestion.php.
References assQuestion::$points, $query, $result, assQuestion::getId(), assQuestion::getPoints(), and assQuestion::getSolutionMaxPass().
{ global $ilDB; if (($points > 0) && ($points <= $this->getPoints())) { if (is_null($pass)) { $pass = $this->getSolutionMaxPass($active_id); } $query = sprintf("UPDATE tst_test_result SET points = %s WHERE active_fi = %s AND question_fi = %s AND pass = %s", $ilDB->quote($points . ""), $ilDB->quote($active_id . ""), $ilDB->quote($this->getId() . ""), $ilDB->quote($pass . "") ); $result = $ilDB->query($query); return true; } else { return false; } }
assTextQuestion::setTextRating | ( | $ | a_text_rating | ) |
Sets the rating option for text comparisons.
Sets the rating option for text comparisons
string | $a_textgap_rating The rating option for text comparisons |
Definition at line 1067 of file class.assTextQuestion.php.
Referenced by fromXML().
{ switch ($a_text_rating) { case TEXTGAP_RATING_CASEINSENSITIVE: case TEXTGAP_RATING_CASESENSITIVE: case TEXTGAP_RATING_LEVENSHTEIN1: case TEXTGAP_RATING_LEVENSHTEIN2: case TEXTGAP_RATING_LEVENSHTEIN3: case TEXTGAP_RATING_LEVENSHTEIN4: case TEXTGAP_RATING_LEVENSHTEIN5: $this->text_rating = $a_text_rating; break; default: $this->text_rating = TEXTGAP_RATING_CASEINSENSITIVE; break; } }
assTextQuestion::syncWithOriginal | ( | ) |
Reimplemented from assQuestion.
Definition at line 943 of file class.assTextQuestion.php.
References $query, $result, assQuestion::getEstimatedWorkingTime(), getKeywords(), getTextRating(), and isComplete().
{ global $ilDB; if ($this->original_id) { $complete = 0; if ($this->isComplete()) { $complete = 1; } $estw_time = $this->getEstimatedWorkingTime(); $estw_time = sprintf("%02d:%02d:%02d", $estw_time['h'], $estw_time['m'], $estw_time['s']); $query = sprintf("UPDATE qpl_questions SET obj_fi = %s, title = %s, comment = %s, author = %s, question_text = %s, working_time=%s, complete = %s WHERE question_id = %s", $ilDB->quote($this->obj_id. ""), $ilDB->quote($this->title. ""), $ilDB->quote($this->comment. ""), $ilDB->quote($this->author. ""), $ilDB->quote($this->question. ""), $ilDB->quote($estw_time. ""), $ilDB->quote($complete. ""), $ilDB->quote($this->original_id. "") ); $result = $ilDB->query($query); $query = sprintf("UPDATE qpl_question_essay SET maxNumOfChars = %s, keywords = %s, textgap_rating = %s WHERE question_fi = %s", $ilDB->quote($this->maxNumOfChars. ""), $ilDB->quote($this->getKeywords() . ""), $ilDB->quote($this->getTextRating() . ""), $ilDB->quote($this->original_id . "") ); $result = $ilDB->query($query); parent::syncWithOriginal(); } }
assTextQuestion::to_xml | ( | $ | a_include_header = true , |
|
$ | a_include_binary = true , |
|||
$ | a_shuffle = false , |
|||
$ | test_output = false , |
|||
$ | force_image_references = false | |||
) |
Returns a QTI xml representation of the question.
Returns a QTI xml representation of the question and sets the internal domxml variable with the DOM XML representation of the QTI xml representation
Definition at line 248 of file class.assTextQuestion.php.
References $pos, assQuestion::addQTIMaterial(), assQuestion::getAuthor(), assQuestion::getComment(), assQuestion::getEstimatedWorkingTime(), getKeywords(), getMaxNumOfChars(), assQuestion::getPoints(), getQuestion(), assQuestion::getSuggestedSolution(), getTextRating(), and assQuestion::getTitle().
{ include_once("./classes/class.ilXmlWriter.php"); $a_xml_writer = new ilXmlWriter; // set xml header $a_xml_writer->xmlHeader(); $a_xml_writer->xmlStartTag("questestinterop"); $attrs = array( "ident" => "il_".IL_INST_ID."_qst_".$this->getId(), "title" => $this->getTitle() ); $a_xml_writer->xmlStartTag("item", $attrs); // add question description $a_xml_writer->xmlElement("qticomment", NULL, $this->getComment()); // add estimated working time $workingtime = $this->getEstimatedWorkingTime(); $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]); $a_xml_writer->xmlElement("duration", NULL, $duration); // add ILIAS specific metadata $a_xml_writer->xmlStartTag("itemmetadata"); $a_xml_writer->xmlStartTag("qtimetadata"); $a_xml_writer->xmlStartTag("qtimetadatafield"); $a_xml_writer->xmlElement("fieldlabel", NULL, "ILIAS_VERSION"); $a_xml_writer->xmlElement("fieldentry", NULL, $this->ilias->getSetting("ilias_version")); $a_xml_writer->xmlEndTag("qtimetadatafield"); $a_xml_writer->xmlStartTag("qtimetadatafield"); $a_xml_writer->xmlElement("fieldlabel", NULL, "QUESTIONTYPE"); $a_xml_writer->xmlElement("fieldentry", NULL, TEXT_QUESTION_IDENTIFIER); $a_xml_writer->xmlEndTag("qtimetadatafield"); $a_xml_writer->xmlStartTag("qtimetadatafield"); $a_xml_writer->xmlElement("fieldlabel", NULL, "AUTHOR"); $a_xml_writer->xmlElement("fieldentry", NULL, $this->getAuthor()); $a_xml_writer->xmlEndTag("qtimetadatafield"); $a_xml_writer->xmlStartTag("qtimetadatafield"); $a_xml_writer->xmlElement("fieldlabel", NULL, "textrating"); $a_xml_writer->xmlElement("fieldentry", NULL, $this->getTextRating()); $a_xml_writer->xmlEndTag("qtimetadatafield"); $a_xml_writer->xmlStartTag("qtimetadatafield"); $a_xml_writer->xmlElement("fieldlabel", NULL, "keywords"); $a_xml_writer->xmlElement("fieldentry", NULL, $this->getKeywords()); $a_xml_writer->xmlEndTag("qtimetadatafield"); $a_xml_writer->xmlEndTag("qtimetadata"); $a_xml_writer->xmlEndTag("itemmetadata"); // PART I: qti presentation $attrs = array( "label" => $this->getTitle() ); $a_xml_writer->xmlStartTag("presentation", $attrs); // add flow to presentation $a_xml_writer->xmlStartTag("flow"); // add material with question text to presentation $this->addQTIMaterial($a_xml_writer, $this->getQuestion()); // add information on response rendering $attrs = array( "ident" => "TEXT", "rcardinality" => "Ordered" ); $a_xml_writer->xmlStartTag("response_str", $attrs); $attrs = array( "fibtype" => "String", "prompt" => "Box" ); if ($this->getMaxNumOfChars() > 0) { $attrs["maxchars"] = $this->getMaxNumOfChars(); } $a_xml_writer->xmlStartTag("render_fib", $attrs); $attrs = array( "ident" => "A" ); $a_xml_writer->xmlStartTag("response_label", $attrs); $a_xml_writer->xmlEndTag("response_label"); $a_xml_writer->xmlEndTag("render_fib"); $solution = $this->getSuggestedSolution(0); if (count($solution)) { if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $solution["internal_link"], $matches)) { $a_xml_writer->xmlStartTag("material"); $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3]; if (strcmp($matches[1], "") != 0) { $intlink = $solution["internal_link"]; } $attrs = array( "label" => "suggested_solution" ); $a_xml_writer->xmlElement("mattext", $attrs, $intlink); $a_xml_writer->xmlEndTag("material"); } } $a_xml_writer->xmlEndTag("response_str"); $a_xml_writer->xmlEndTag("flow"); $a_xml_writer->xmlEndTag("presentation"); // PART II: qti resprocessing $attrs = array( "scoremodel" => "HumanRater" ); $a_xml_writer->xmlStartTag("resprocessing", $attrs); $a_xml_writer->xmlStartTag("outcomes"); $attrs = array( "varname" => "WritingScore", "vartype" => "Integer", "minvalue" => "0", "maxvalue" => $this->getPoints() ); $a_xml_writer->xmlStartTag("decvar", $attrs); $a_xml_writer->xmlEndTag("decvar"); $a_xml_writer->xmlEndTag("outcomes"); $a_xml_writer->xmlStartTag("respcondition"); $a_xml_writer->xmlStartTag("conditionvar"); $a_xml_writer->xmlElement("other", NULL, "tutor_rated"); $a_xml_writer->xmlEndTag("conditionvar"); $a_xml_writer->xmlEndTag("respcondition"); $a_xml_writer->xmlEndTag("resprocessing"); $a_xml_writer->xmlEndTag("item"); $a_xml_writer->xmlEndTag("questestinterop"); $xml = $a_xml_writer->xmlDumpMem(FALSE); if (!$a_include_header) { $pos = strpos($xml, "?>"); $xml = substr($xml, $pos + 2); } return $xml; }
assTextQuestion::$keywords |
Definition at line 64 of file class.assTextQuestion.php.
Referenced by calculateReachedPoints(), fromXML(), and getKeywordList().
assTextQuestion::$maxNumOfChars |
Definition at line 54 of file class.assTextQuestion.php.
assTextQuestion::$question |
Definition at line 45 of file class.assTextQuestion.php.
Referenced by assTextQuestion(), and setQuestion().
assTextQuestion::$text_rating |
Definition at line 73 of file class.assTextQuestion.php.