Public Member Functions | Data Fields

assTextQuestion Class Reference

Class for text questions. More...

Inheritance diagram for assTextQuestion:
Collaboration diagram for assTextQuestion:

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

Detailed Description

Class for text questions.

assTextQuestion is a class for text questions

Author:
Helmut Schottmüller <helmut.schottmueller@mac.com>
Version:
Id:
class.assTextQuestion.php 14646 2007-09-04 10:03:31Z hschottm

class.assTextQuestion.php Assessment

Definition at line 36 of file class.assTextQuestion.php.


Member Function Documentation

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

Parameters:
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
Returns:
boolean true on success, otherwise false public

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;
                }
        }

Here is the call graph for this function:

Here is the caller graph for this function:

assTextQuestion::assTextQuestion ( title = "",
comment = "",
author = "",
owner = -1,
question = "" 
)

assTextQuestion constructor

The constructor takes possible arguments an creates an instance of the assTextQuestion object.

Parameters:
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
See also:
assQuestion:assQuestion()

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 = "";
        }

Here is the call graph for this function:

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.

Parameters:
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;
        }

Here is the call graph for this function:

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;
        }

Here is the call graph for this function:

assTextQuestion::createRandomSolution ( test_id,
user_id 
)

Reimplemented from assQuestion.

Definition at line 980 of file class.assTextQuestion.php.

        {
        }

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;
        }

Here is the call graph for this function:

Here is the caller graph for this function:

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

Parameters:
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)");
        }

Here is the call graph for this function:

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

Returns:
string The additional table name public

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

Returns:
array The keywords of the question public

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;
        }

Here is the caller graph for this function:

assTextQuestion::getKeywords (  ) 

Returns the keywords of the question.

Returns the keywords of the question

Returns:
string The keywords of the question public

Definition at line 1005 of file class.assTextQuestion.php.

Referenced by saveToDb(), syncWithOriginal(), and to_xml().

        {
                return $this->keywords;
        }

Here is the caller graph for this function:

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

See also:
$points

Reimplemented from assQuestion.

Definition at line 681 of file class.assTextQuestion.php.

Referenced by calculateReachedPoints(), and isComplete().

        {
                return $this->points;
        }

Here is the caller graph for this function:

assTextQuestion::getMaxNumOfChars (  ) 

Gets the maximum number of characters for the text solution.

Gets the maximum number of characters for the text solution

Returns:
integer The maximum number of characters for the text solution public
See also:
$maxNumOfChars

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;
                }
        }

Here is the caller graph for this function:

assTextQuestion::getQuestion (  ) 

Gets the text question.

Gets the question string of the assTextQuestion object

Returns:
string The question string of the assTextQuestion object public
See also:
$question

Definition at line 619 of file class.assTextQuestion.php.

Referenced by fromXML(), and to_xml().

        {
                return $this->question;
        }

Here is the caller graph for this function:

assTextQuestion::getQuestionType (  ) 

Returns the question type of the question.

Returns the question type of the question

Returns:
integer The question type of the question public

Definition at line 992 of file class.assTextQuestion.php.

Referenced by saveToDb().

        {
                return 8;
        }

Here is the caller graph for this function:

assTextQuestion::getTextRating (  ) 

Returns the rating option for text comparisons.

Returns the rating option for text comparisons

Returns:
string The rating option for text comparisons
See also:
$text_rating Public

Definition at line 1053 of file class.assTextQuestion.php.

Referenced by isKeywordMatching(), saveToDb(), syncWithOriginal(), and to_xml().

        {
                return $this->text_rating;
        }

Here is the caller graph for this function:

assTextQuestion::isComplete (  ) 

Returns true, if a multiple choice question is complete for use.

Returns true, if a multiple choice question is complete for use

Returns:
boolean True, if the multiple choice question is complete for use, otherwise false public

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;
                }
        }

Here is the call graph for this function:

Here is the caller graph for this function:

assTextQuestion::isKeywordMatching ( answertext,
a_keyword 
)

Checks if one of the keywords matches the answertext.

Checks if one of the keywords matches the answertext

Parameters:
string $answertext The answertext of the user
string $a_keyword The keyword which should be checked
Returns:
boolean TRUE if the keyword matches, FALSE otherwise private

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;
        }

Here is the call graph for this function:

Here is the caller graph for this function:

assTextQuestion::loadFromDb ( question_id  ) 

Loads a assTextQuestion object from a database.

Loads a assTextQuestion object from a database

Parameters:
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);
        }

Here is the call graph for this function:

assTextQuestion::saveToDb ( original_id = ""  ) 

Saves a assTextQuestion object to a database.

Saves a assTextQuestion object to a database

Parameters:
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);
        }

Here is the call graph for this function:

Here is the caller graph for this function:

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

Parameters:
integer $test_id The database id of the test containing this question
Returns:
boolean Indicates the save status (true if saved successful, false otherwise) public
See also:
$answers

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;
        }

Here is the call graph for this function:

assTextQuestion::setKeywords ( a_keywords  ) 

Sets the keywords of the question.

Sets the keywords of the question

Parameters:
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;
        }

Here is the caller graph for this function:

assTextQuestion::setMaxNumOfChars ( maxchars = 0  ) 

Sets the maximum number of characters for the text solution.

Sets the maximum number of characters for the text solution

Parameters:
integer $maxchars The maximum number of characters for the text solution public
See also:
$maxNumOfChars

Definition at line 668 of file class.assTextQuestion.php.

Referenced by fromXML().

        {
                $this->maxNumOfChars = $maxchars;
        }

Here is the caller graph for this function:

assTextQuestion::setQuestion ( question = ""  ) 

Sets the text question.

Sets the question string of the assTextQuestion object

Parameters:
string $question A string containing the text question public
See also:
$question

Definition at line 633 of file class.assTextQuestion.php.

References $question.

Referenced by fromXML().

        {
                $this->question = $question;
        }

Here is the caller graph for this function:

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

Parameters:
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
Returns:
boolean true on success, otherwise false public

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;
                }
        }

Here is the call graph for this function:

assTextQuestion::setTextRating ( a_text_rating  ) 

Sets the rating option for text comparisons.

Sets the rating option for text comparisons

Parameters:
string $a_textgap_rating The rating option for text comparisons
See also:
$textgap_rating Public

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;
                }
        }

Here is the caller graph for this function:

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();
                }
        }

Here is the call graph for this function:

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

Returns:
string The QTI xml representation of the question public

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;
        }

Here is the call graph for this function:


Field Documentation

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.


The documentation for this class was generated from the following file: