4 require_once
'./Modules/TestQuestionPool/classes/class.assQuestion.php';
5 require_once
'./Modules/Test/classes/inc.AssessmentConstants.php';
6 require_once
'./Modules/TestQuestionPool/interfaces/interface.ilObjQuestionScoringAdjustable.php';
7 require_once
'./Modules/TestQuestionPool/interfaces/interface.ilObjAnswerScoringAdjustable.php';
8 require_once
'./Modules/TestQuestionPool/interfaces/interface.iQuestionCondition.php';
9 require_once
'./Modules/TestQuestionPool/classes/class.ilUserQuestionResult.php';
10 require_once
'Modules/TestQuestionPool/interfaces/interface.ilAssSpecificFeedbackOptionLabelProvider.php';
116 $this->thumb_size = 150;
117 $this->answers =
array();
119 $this->selectionLimit = null;
120 $this->feedback_setting = 0;
147 if (strlen($this->title) and ($this->author) and ($this->question) and (count($this->answers)) and ($this->
getMaximumPoints() > 0)) {
165 $this->ensureNoInvalidObligation($this->
getId());
176 if (strlen($answer->getImage())) {
202 switch (strtoupper($path_info[
'extension'])) {
234 $this->
setId($question_id);
243 include_once(
"./Services/RTE/classes/class.ilRTE.php");
249 $this->isSingleline = (
$data[
'allow_images']) ?
false :
true;
250 $this->lastChange =
$data[
'tstamp'];
252 $this->feedback_setting =
$data[
'feedback_setting'];
261 "SELECT * FROM qpl_a_mc WHERE question_fi = %s ORDER BY aorder ASC",
265 include_once
"./Modules/TestQuestionPool/classes/class.assAnswerMultipleResponseImage.php";
269 if (!@file_exists($imagefilename)) {
270 $data[
"imagefile"] =
"";
272 include_once(
"./Services/RTE/classes/class.ilRTE.php");
278 parent::loadFromDb($question_id);
286 if ($this->
id <= 0) {
291 $this_id = $this->
getId();
295 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
299 if ((
int) $testObjId > 0) {
300 $clone->setObjId($testObjId);
321 $clone->copyPageOfQuestion($this_id);
323 $clone->copyXHTMLMediaObjectsOfQuestion($this_id);
325 $clone->duplicateImages($this_id, $thisObjId);
327 $clone->onDuplicate($thisObjId, $this_id, $clone->getObjId(), $clone->getId());
337 if ($this->
id <= 0) {
343 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
346 $source_questionpool_id = $this->
getObjId();
347 $clone->setObjId($target_questionpool_id);
357 $clone->copyImages(
$original_id, $source_questionpool_id);
359 $clone->onCopy($source_questionpool_id,
$original_id, $clone->getObjId(), $clone->getId());
366 if ($this->
id <= 0) {
371 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
374 $sourceParentId = $this->
getObjId();
380 $clone->setObjId($targetParentId);
382 if ($targetQuestionTitle) {
383 $clone->setTitle($targetQuestionTitle);
388 $clone->copyPageOfQuestion($sourceQuestionId);
390 $clone->copyXHTMLMediaObjectsOfQuestion($sourceQuestionId);
392 $clone->copyImages($sourceQuestionId, $sourceParentId);
394 $clone->onCopy($sourceParentId, $sourceQuestionId, $clone->getObjId(), $clone->getId());
438 $points_unchecked = 0.0,
442 include_once
"./Modules/TestQuestionPool/classes/class.assAnswerMultipleResponseImage.php";
443 if (array_key_exists($order, $this->answers)) {
446 $newchoices =
array();
447 for (
$i = 0;
$i < $order;
$i++) {
448 array_push($newchoices, $this->answers[
$i]);
450 array_push($newchoices, $answer);
451 for (
$i = $order;
$i < count($this->answers);
$i++) {
456 $this->answers = $newchoices;
460 array_push($this->answers, $answer);
472 return count($this->answers);
488 if (count($this->answers) < 1) {
491 if (
$index >= count($this->answers)) {
495 return $this->answers[
$index];
510 if (count($this->answers) < 1) {
513 if (
$index >= count($this->answers)) {
516 $answer = $this->answers[
$index];
517 if (strlen($answer->getImage())) {
520 unset($this->answers[
$index]);
521 $this->answers = array_values($this->answers);
522 for (
$i = 0;
$i < count($this->answers);
$i++) {
523 if ($this->answers[
$i]->getOrder() >
$index) {
524 $this->answers[
$i]->setOrder(
$i);
536 $this->answers =
array();
548 foreach ($this->answers as
$key => $value) {
549 if ($value->getPoints() > $value->getPointsUnchecked()) {
550 $allpoints += $value->getPoints();
552 $allpoints += $value->getPointsUnchecked();
571 if ($returndetails) {
572 throw new ilTestException(
'return details not implemented for ' . __METHOD__);
577 $found_values =
array();
578 if (is_null(
$pass)) {
583 if (strcmp(
$data[
"value1"],
"") != 0) {
584 array_push($found_values,
$data[
"value1"]);
599 $failureMsg = sprintf(
600 $this->lng->txt(
'ass_mc_sel_lim_exhausted_hint'),
615 if (!count($solutionSubmit) && !empty(
$_POST[
'tst_force_form_diff_input'])) {
635 if (is_null(
$pass)) {
636 include_once
"./Modules/Test/classes/class.ilObjTest.php";
642 $this->
getProcessLocker()->executeUserSolutionUpdateLockOperation(
function () use (&$entered_values, $active_id,
$pass, $authorized) {
647 foreach ($solutionSubmit as $value) {
648 if (strlen($value)) {
662 if ($entered_values) {
663 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
668 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
686 ) .
" WHERE question_fi = %s",
692 $oldthumbsize =
$data[
'thumb_size'];
696 if (!$this->isSingleline) {
705 'allow_images' =>
array(
'text', $this->isSingleline ? 0 : 1),
711 'question_fi' =>
array(
'integer', $this->
getId())
721 "DELETE FROM qpl_a_mc WHERE question_fi = %s",
726 foreach ($this->answers as
$key => $value) {
727 $answer_obj = $this->answers[
$key];
728 $next_id = $ilDB->nextId(
'qpl_a_mc');
730 "INSERT INTO qpl_a_mc (answer_id, question_fi, answertext, points, points_unchecked, aorder, imagefile, tstamp) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)",
731 array(
'integer',
'integer',
'text',
'float',
'float',
'integer',
'text',
'integer' ),
736 $answer_obj->getPoints(),
737 $answer_obj->getPointsUnchecked(),
738 $answer_obj->getOrder(),
739 $answer_obj->getImage(),
759 parent::syncWithOriginal();
770 return "assMultipleChoice";
800 public function setImageFile($image_filename, $image_tempfilename =
"")
803 if (!empty($image_tempfilename)) {
804 $image_filename = str_replace(
" ",
"_", $image_filename);
806 if (!file_exists($imagepath)) {
809 if (!ilUtil::moveUploadedFile($image_tempfilename, $image_filename, $imagepath . $image_filename)) {
812 include_once
"./Services/MediaObjects/classes/class.ilObjMediaObject.php";
814 if (!preg_match(
"/^image/", $mimetype)) {
815 unlink($imagepath . $image_filename);
836 @unlink($imagepath . $image_filename);
837 $thumbpath = $imagepath . $this->
getThumbPrefix() . $image_filename;
841 public function duplicateImages($question_id, $objectId = null)
847 $imagepath_original = str_replace(
"/$this->id/images",
"/$question_id/images", $imagepath);
849 if ((
int) $objectId > 0) {
850 $imagepath_original = str_replace(
"/$this->obj_id/",
"/$objectId/", $imagepath_original);
853 foreach ($this->answers as $answer) {
856 if (!file_exists($imagepath)) {
860 if (file_exists($imagepath_original .
$filename)) {
861 if (!copy($imagepath_original . $filename, $imagepath . $filename)) {
862 $ilLog->warning(sprintf(
863 "Could not clone source image '%s' to '%s' (srcQuestionId: %s|tgtQuestionId: %s|srcParentObjId: %s|tgtParentObjId: %s)",
864 $imagepath_original . $filename,
865 $imagepath . $filename,
874 if (file_exists($imagepath_original . $this->
getThumbPrefix() . $filename)) {
876 $ilLog->warning(sprintf(
877 "Could not clone thumbnail source image '%s' to '%s' (srcQuestionId: %s|tgtQuestionId: %s|srcParentObjId: %s|tgtParentObjId: %s)",
891 public function copyImages($question_id, $source_questionpool)
895 $imagepath_original = str_replace(
"/$this->id/images",
"/$question_id/images", $imagepath);
896 $imagepath_original = str_replace(
"/$this->obj_id/",
"/$source_questionpool/", $imagepath_original);
897 foreach ($this->answers as $answer) {
900 if (!file_exists($imagepath)) {
903 if (!@copy($imagepath_original .
$filename, $imagepath . $filename)) {
904 $ilLog->write(
"image could not be duplicated!!!!", $ilLog->ERROR);
905 $ilLog->write(
"object: " . print_r($this,
true), $ilLog->ERROR);
907 if (@file_exists($imagepath_original . $this->
getThumbPrefix() . $filename)) {
909 $ilLog->write(
"image thumbnail could not be duplicated!!!!", $ilLog->ERROR);
910 $ilLog->write(
"object: " . print_r($this,
true), $ilLog->ERROR);
927 $originalObjId = parent::lookupParentObjId($this->
getOriginalId());
928 $imagepath_original = $this->
getImagePath($question_id, $originalObjId);
931 foreach ($this->answers as $answer) {
934 if (@file_exists($imagepath .
$filename)) {
935 if (!file_exists($imagepath)) {
938 if (!file_exists($imagepath_original)) {
941 if (!@copy($imagepath . $filename, $imagepath_original . $filename)) {
942 $ilLog->write(
"image could not be duplicated!!!!", $ilLog->ERROR);
943 $ilLog->write(
"object: " . print_r($this,
true), $ilLog->ERROR);
946 if (@file_exists($imagepath . $this->
getThumbPrefix() . $filename)) {
948 $ilLog->write(
"image thumbnail could not be duplicated!!!!", $ilLog->ERROR);
949 $ilLog->write(
"object: " . print_r($this,
true), $ilLog->ERROR);
961 $text = parent::getRTETextWithMediaObjects();
962 foreach ($this->answers as
$index => $answer) {
963 $text .= $this->feedbackOBJ->getSpecificAnswerFeedbackContent($this->
getId(),
$index);
964 $answer_obj = $this->answers[
$index];
965 $text .= $answer_obj->getAnswertext();
989 $worksheet->setCell($startrow +
$i, 0, $answer->getAnswertext());
992 foreach ($solution as $solutionvalue) {
993 if (
$id == $solutionvalue[
"value1"]) {
1005 return $startrow +
$i + 1;
1015 $this->thumb_size = $a_size;
1034 require_once
'./Services/RTE/classes/class.ilRTE.php';
1044 'onenotcorrect' => $this->
formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(),
false)),
1045 'allcorrect' => $this->
formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(),
true))
1051 if ((
string) $answer_obj->getImage()) {
1054 array_push($answers,
array(
1055 "answertext" => (
string) $this->
formatSAQuestion($answer_obj->getAnswertext()),
1056 "points_checked" => (
float) $answer_obj->getPointsChecked(),
1057 "points_unchecked" => (float) $answer_obj->getPointsUnchecked(),
1058 "order" => (int) $answer_obj->getOrder(),
1059 "image" => (
string) $answer_obj->getImage(),
1061 $this->feedbackOBJ->getSpecificAnswerFeedbackExportPresentation($this->getId(),
$key)
1080 $answer = $this->answers[
$index];
1081 if (is_object($answer)) {
1083 $answer->setImage(
'');
1091 $multilineAnswerSetting = $ilUser->getPref(
"tst_multiline_answers");
1092 if ($multilineAnswerSetting != 1) {
1093 $multilineAnswerSetting = 0;
1095 return $multilineAnswerSetting;
1101 $ilUser->writePref(
"tst_multiline_answers", $a_setting);
1115 $this->feedback_setting = $a_feedback_setting;
1129 if ($this->feedback_setting) {
1138 return 'feedback_correct_sc_mc';
1156 return $numExistingSolutionRecords > 0;
1176 SELECT SUM(points) points_for_checked_answers 1178 WHERE question_fi = %s AND points > 0 1185 return $row[
'points_for_checked_answers'] > 0;
1196 public function ensureNoInvalidObligation($questionId)
1202 SELECT SUM(qpl_a_mc.points) points_for_checked_answers, 1205 FROM tst_test_question 1208 ON qpl_a_mc.question_fi = tst_test_question.question_fi 1210 WHERE tst_test_question.question_fi = %s 1211 AND tst_test_question.obligatory = 1 1213 GROUP BY test_question_id 1218 $updateTestQuestionIds =
array();
1220 while (
$row = $ilDB->fetchAssoc(
$res)) {
1221 if (
$row[
'points_for_checked_answers'] <= 0) {
1222 $updateTestQuestionIds[] =
$row[
'test_question_id'];
1226 if (count($updateTestQuestionIds)) {
1227 $test_question_id__IN__updateTestQuestionIds = $ilDB->in(
1229 $updateTestQuestionIds,
1235 UPDATE tst_test_question 1237 WHERE $test_question_id__IN__updateTestQuestionIds 1240 $ilDB->manipulate(
$query);
1249 $solutionSubmit =
array();
1251 if (preg_match(
"/^multiple_choice_result_(\d+)/",
$key)) {
1252 if (strlen($value)) {
1253 $solutionSubmit[] = $value;
1257 return $solutionSubmit;
1268 foreach ($this->answers as
$key => $answer) {
1269 if (in_array(
$key, $found_values)) {
1270 $points += $answer->getPoints();
1272 $points += $answer->getPointsUnchecked();
1276 include_once
"./Modules/Test/classes/class.ilObjTest.php";
1278 if (($mc_scoring == 0) && (count($found_values) == 0)) {
1295 require_once
"./Modules/TestQuestionPool/classes/class.ilOperatorsExpressionMapping.php";
1327 $maxStep = $this->lookupMaxStep($active_id,
$pass);
1329 if ($maxStep !== null) {
1330 $data = $ilDB->queryF(
1331 "SELECT value1+1 as value1 FROM tst_solutions WHERE active_fi = %s AND pass = %s AND question_fi = %s AND step = %s",
1332 array(
"integer",
"integer",
"integer",
"integer"),
1336 $data = $ilDB->queryF(
1337 "SELECT value1+1 as value1 FROM tst_solutions WHERE active_fi = %s AND pass = %s AND question_fi = %s",
1338 array(
"integer",
"integer",
"integer"),
1343 while (
$row = $ilDB->fetchAssoc(
$data)) {
1374 $config = parent::buildTestPresentationConfig();
1375 $config->setUseUnchangedAnswerLabel($this->lng->txt(
'tst_mc_label_none_above'));
flushAnswers()
Deletes all answers.
static isObligationPossible($questionId)
returns boolean wether it is possible to set this question type as obligatory or not considering the ...
calculateReachedPointsForSolution($found_values, $active_id=0)
static makeDirParents($a_dir)
Create a new directory and all parent directories.
static logAction($logtext="", $active_id="", $question_id="")
Logs an action into the Test&Assessment log.
getId()
Gets the id of the assQuestion object.
addAnswer( $answertext="", $points=0.0, $points_unchecked=0.0, $order=0, $answerimage="")
Adds a possible answer for a multiple choice question.
setLastChange($lastChange)
static _getOriginalId($question_id)
Returns the original id of a question.
formatSAQuestion($a_q)
Format self assessment question.
getRTETextWithMediaObjects()
Collects all text in the question which could contain media objects which were created with the Rich ...
const PercentageResultExpression
toJSON()
Returns a JSON representation of the question.
Class iQuestionCondition.
generateThumbForFile($path, $file)
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.
isComplete()
Returns true, if a multiple choice question is complete for use.
static getNumExistingSolutionRecords($activeId, $pass, $questionId)
returns the number of existing solution records for the given test active / pass and given question i...
duplicate($for_test=true, $title="", $author="", $owner="", $testObjId=null)
Duplicates an assMultipleChoiceQuestion.
copyObject($target_questionpool_id, $title="")
Copies an assMultipleChoice object.
const NumberOfResultExpression
createNewOriginalFromThisDuplicate($targetParentId, $targetQuestionTitle="")
saveAdditionalQuestionDataToDb()
Saves a record to the question types additional data table.
const ExclusiveResultExpression
rebuildThumbnails()
Rebuild the thumbnail images with a new thumbnail size.
reworkWorkingData($active_id, $pass, $obligationsAnswered, $authorized)
{}
calculateReachedPoints($active_id, $pass=null, $authorizedSolution=true, $returndetails=false)
Returns the points, a learner has reached answering the question.
Abstract basic class which is to be extended by the concrete assessment question type classes...
ASS_AnswerBinaryStateImage is a class for answers with a binary state indicator (checked/unchecked, set/unset) and an image file.
getSolutionValues($active_id, $pass=null, $authorized=true)
Loads solutions of a given user from the database an returns it.
setSelectionLimit($selectionLimit)
setId($id=-1)
Sets the id of the assQuestion object.
getImagePathWeb()
Returns the web image path for web accessable images of a question.
getSolutionMaxPass($active_id)
Returns the maximum pass a users question solution.
setEstimatedWorkingTime($hour=0, $min=0, $sec=0)
Sets the estimated working time of a question from given hour, minute and second. ...
migrateToLmContent($content)
setOutputType($output_type=OUTPUT_ORDER)
Sets the output type of the assMultipleChoice object.
getQuestionType()
Returns the question type of the question.
getUserQuestionResult($active_id, $pass)
Get the user solution for a question by active_id and the test pass.
setNrOfTries($a_nr_of_tries)
setAdditionalContentEditingMode($additinalContentEditingMode)
setter for additional content editing mode for this question
loadFromDb($question_id)
Loads a assMultipleChoice object from a database.
setShuffle($shuffle=true)
Sets the shuffle flag.
static _replaceMediaObjectImageSrc($a_text, $a_direction=0, $nic=IL_INST_ID)
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
Class for multiple choice tests.
getObjId()
Get the object id of the container object.
getSpecificFeedbackAllCorrectOptionLabel()
getShuffle()
Gets the shuffle flag.
lmMigrateQuestionTypeSpecificContent(ilAssSelfAssessmentMigrator $migrator)
Base Exception for all Exceptions relating to Modules/Test.
getMultilineAnswerSetting()
removeAnswerImage($index)
saveToDb($original_id="")
Saves a assMultipleChoice object to a database.
deleteAnswer($index=0)
Deletes an answer with a given index.
isAnswered($active_id, $pass=null)
returns boolean wether the question is answered during test pass or not
static _getLogLanguage()
retrieve the log language for assessment logging
setAuthor($author="")
Sets the authors name of the assQuestion object.
static _enabledAssessmentLogging()
check wether assessment logging is enabled or not
getImagePath($question_id=null, $object_id=null)
Returns the image path for web accessable images of a question.
foreach($_POST as $key=> $value) $res
Class ilUserQuestionResult.
getAnswerCount()
Returns the number of answers.
saveCurrentSolution($active_id, $pass, $value1, $value2, $authorized=true, $tstamp=null)
saveWorkingData($active_id, $pass=null, $authorized=true)
Saves the learners input of the question to the database.
getSpecificFeedbackSetting()
Gets the current feedback settings in effect for the question.
isForcedEmptySolution($solutionSubmit)
Interface ilObjAnswerScoringAdjustable.
getQuestion()
Gets the question string of the question object.
getAvailableAnswerOptions($index=null)
If index is null, the function returns an array with all anwser options Else it returns the specific ...
static convertImage( $a_from, $a_to, $a_target_format="", $a_geometry="", $a_background_color="")
convert image
__construct( $title="", $comment="", $author="", $owner=-1, $question="", $output_type=OUTPUT_ORDER)
assMultipleChoice constructor
syncImages()
Sync images of a MC question on synchronisation with the original question.
getOperators($expression)
Get all available operations for a specific question.
setIsSingleline($isSingleline)
getAnswer($index=0)
Returns an answer with a given index.
& getAnswers()
Returns a reference to the answers array.
setSpecificFeedbackSetting($a_feedback_setting)
Sets the feedback settings in effect for the question.
buildTestPresentationConfig()
deleteImage($image_filename)
Deletes an image file.
getExpressionTypes()
Get all available expression types for a specific question.
Create styles array
The data for the language used.
static getOperatorsByExpression($expression)
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
saveAnswerSpecificDataToDb()
Saves the answer specific records into a question types answer table.
setPoints($a_points)
Sets the maximum available points for the question.
saveQuestionDataToDb($original_id="")
getMaximumPoints()
Returns the maximum points, a learner can reach answering the question.
setImageFile($image_filename, $image_tempfilename="")
Sets the image file and uploads the image to the object's image directory.
setQuestion($question="")
Sets the question string of the question object.
Interface ilObjQuestionScoringAdjustable.
removeCurrentSolution($active_id, $pass, $authorized=true)
getAdditionalTableName()
Returns the name of the additional question data table in the database.
static _getMCScoring($active_id)
Gets the scoring type for multiple choice questions.
setExportDetailsXLS($worksheet, $startrow, $active_id, $pass)
{}
setOriginalId($original_id)
getCurrentSolutionResultSet($active_id, $pass, $authorized=true)
Get a restulset for the current user solution for a this question by active_id and pass...
getAnswerTableName()
Returns the name of the answer table in the database.
getTitle()
Gets the title string of the assQuestion object.
Add data(end) time
Method that wraps PHPs time in order to allow simulations with the workflow.
if(!file_exists("$old.txt")) if($old===$new) if(file_exists("$new.txt")) $file
getOutputType()
Gets the multiple choice output type which is either OUTPUT_ORDER (=0) or OUTPUT_RANDOM (=1)...
setTitle($title="")
Sets the title string of the assQuestion object.
setObjId($obj_id=0)
Set the object id of the container object.
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
setComment($comment="")
Sets the comment string of the assQuestion object.
setMultilineAnswerSetting($a_setting=0)
copyImages($question_id, $source_questionpool)
setOwner($owner="")
Sets the creator/owner ID of the assQuestion object.
const EmptyAnswerExpression