ILIAS  trunk Revision v12.0_alpha-1221-g4e438232683
assClozeTest Class Reference

Class for cloze tests. More...

+ Inheritance diagram for assClozeTest:
+ Collaboration diagram for assClozeTest:

Public Member Functions

 __construct (string $title="", string $comment="", string $author="", int $owner=-1, string $question="")
 
 isComplete ()
 Returns TRUE, if a cloze test is complete for use. More...
 
 cleanQuestiontext ($text)
 Cleans cloze question text to remove attributes or tags from older ILIAS versions. More...
 
 replaceFirstGap (string $gaptext, string $content)
 
 loadFromDb (int $question_id)
 
 saveToDb (?int $original_id=null)
 
 saveAnswerSpecificDataToDb ()
 Saves the answer specific records into a question types answer table. More...
 
 saveAdditionalQuestionDataToDb ()
 Saves a record to the question types additional data table. More...
 
 getGaps ()
 
 flushGaps ()
 
 setClozeText (string $cloze_text='')
 
 setClozeTextValue ($cloze_text="")
 
 getClozeText ()
 Returns the cloze text. More...
 
 getClozeTextForHTMLOutput ()
 Returns the cloze text as HTML (with optional nl2br) Fix for Mantis 29987: We assume Tiny embeds any text in tags, so if no tags are present, we derive it's non-HTML content and apply nl2br. More...
 
 getStartTag ()
 Returns the start tag of a cloze gap. More...
 
 setStartTag ($start_tag="[gap]")
 Sets the start tag of a cloze gap. More...
 
 getEndTag ()
 Returns the end tag of a cloze gap. More...
 
 setEndTag ($end_tag="[/gap]")
 Sets the end tag of a cloze gap. More...
 
 getFeedbackMode ()
 
 setFeedbackMode ($feedbackMode)
 
 createGapsFromQuestiontext ()
 Create gap entries by parsing the question text. More...
 
 setGapType ($gap_index, $gap_type)
 Set the type of a gap with a given index. More...
 
 setGapShuffle ($gap_index=0, $shuffle=1)
 Sets the shuffle state of a gap with a given index. More...
 
 clearGapAnswers ()
 Removes all answers from the gaps. More...
 
 getGapCount ()
 Returns the number of gaps. More...
 
 addGapAnswer ($gap_index, $order, $answer)
 Sets the answer text of a gap with a given index. More...
 
 getGap (int $gap_index=0)
 
 setGapSize ($gap_index, $size)
 
 setGapAnswerPoints ($gap_index, $order, $points)
 Sets the points of a gap with a given index and an answer with a given order. More...
 
 addGapText ($gap_index)
 Adds a new answer text value to a text gap with a given index. More...
 
 addGapAtIndex ($gap, $index)
 Adds a ClozeGap object at a given index. More...
 
 setGapAnswerLowerBound ($gap_index, $order, $bound)
 Sets the lower bound of a gap with a given index and an answer with a given order. More...
 
 setGapAnswerUpperBound ($gap_index, $order, $bound)
 Sets the upper bound of a gap with a given index and an answer with a given order. More...
 
 getMaximumPoints ()
 Returns the maximum points, a learner can reach answering the question. More...
 
 cloneQuestionTypeSpecificProperties (\assQuestion $target)
 
 updateClozeTextFromGaps ()
 Updates the gap parameters in the cloze text from the form input. More...
 
 deleteAnswerText ($gap_index, $answer_index)
 Deletes the answer text of a gap with a given index and an answer with a given order. More...
 
 deleteGap ($gap_index)
 Deletes a gap with a given index. More...
 
 getTextgapPoints ($a_original, $a_entered, $max_points)
 Returns the points for a text gap and compares the given solution with the entered solution using the text gap rating options. More...
 
 getNumericgapPoints ($a_original, $a_entered, $max_points, $lowerBound, $upperBound)
 Returns the points for a text gap and compares the given solution with the entered solution using the text gap rating options. More...
 
 checkForValidFormula (string $value)
 
 calculateReachedPoints (int $active_id, ?int $pass=null, bool $authorized_solution=true)
 
 getUserResultDetails (int $active_id, ?int $pass=null, bool $authorized_solution=true)
 
 fetchSolutionSubmit ()
 
 saveWorkingData (int $active_id, ?int $pass=null, bool $authorized=true)
 
 getQuestionType ()
 Returns the question type of the question. More...
 
 getTextgapRating ()
 Returns the rating option for text gaps. More...
 
 setTextgapRating ($a_textgap_rating)
 Sets the rating option for text gaps. More...
 
 getIdenticalScoring ()
 Returns the identical scoring status of the question. More...
 
 setIdenticalScoring (bool $identical_scoring)
 Sets the identical scoring option for cloze questions. More...
 
 getAdditionalTableName ()
 Returns the name of the additional question data table in the database. More...
 
 getAnswerTableName ()
 
 setFixedTextLength (?int $fixed_text_length)
 Sets a fixed text length for all text fields in the cloze question. More...
 
 getFixedTextLength ()
 Gets the fixed text length for all text fields in the cloze question. More...
 
 getMaximumGapPoints ($gap_index)
 Returns the maximum points for a gap. More...
 
 getRTETextWithMediaObjects ()
 Collects all text in the question which could contain media objects which were created with the Rich Text Editor. More...
 
 getGapCombinationsExists ()
 
 getGapCombinations ()
 
 setGapCombinationsExists ($value)
 
 setGapCombinations ($value)
 
 toJSON ()
 Returns a JSON representation of the question. More...
 
 getOperators (string $expression)
 Get all available operations for a specific question. More...
 
 getExpressionTypes ()
 Get all available expression types for a specific question. More...
 
 getUserQuestionResult (int $active_id, int $pass)
 Get the user solution for a question by active_id and the test pass. More...
 
 getAvailableAnswerOptions ($index=null)
 If index is null, the function returns an array with all anwser options Else it returns the specific answer option. More...
 
 calculateCombinationResult ($user_result)
 
 calculateReachedPointsFromPreviewSession (ilAssQuestionPreviewSession $preview_session)
 
 fetchAnswerValueForGap ($userSolution, $gapIndex)
 
 isAddableAnswerOptionValue (int $qIndex, string $answerOptionValue)
 
 addAnswerOptionValue (int $qIndex, string $answerOptionValue, float $points)
 
 toLog (AdditionalInformationGenerator $additional_info)
 MUST return an array of the question settings that can be stored in the log. More...
 
 solutionValuesToText (array $solution_values)
 MUST convert the given solution values into text. More...
 
 getCorrectSolutionForTextOutput (int $active_id, int $pass)
 
- Public Member Functions inherited from assQuestion
 getQuestionType ()
 
 isComplete ()
 
 saveWorkingData (int $active_id, ?int $pass=null, bool $authorized=true)
 
 calculateReachedPoints (int $active_id, ?int $pass=null, bool $authorized_solution=true)
 
 getAdditionalTableName ()
 
 getAnswerTableName ()
 
 toLog (AdditionalInformationGenerator $additional_info)
 MUST return an array of the question settings that can be stored in the log. More...
 
 getCurrentUser ()
 
 getShuffler ()
 
 setShuffler (Transformation $shuffler)
 
 setProcessLocker (ilAssQuestionProcessLocker $processLocker)
 
 getProcessLocker ()
 
 fromXML (string $importdirectory, int $user_id, ilQTIItem $item, int $questionpool_id, ?int $tst_id, ?ilObject &$tst_object, int &$question_counter, array $import_mapping)
 
 toXML (bool $a_include_header=true, bool $a_include_binary=true, bool $a_shuffle=false, bool $test_output=false, bool $force_image_references=false)
 Returns a QTI xml representation of the question. More...
 
 setTitle (string $title="")
 
 setId (int $id=-1)
 
 setTestId (int $id=-1)
 
 setComment (string $comment="")
 
 setShuffle (?bool $shuffle=true)
 
 setAuthor (string $author="")
 
 setOwner (int $owner=-1)
 
 getTitle ()
 
 getTitleForHTMLOutput ()
 
 getTitleFilenameCompliant ()
 
 getId ()
 
 getShuffle ()
 
 getTestId ()
 
 getComment ()
 
 getDescriptionForHTMLOutput ()
 
 getThumbSize ()
 
 setThumbSize (int $a_size)
 
 getMinimumThumbSize ()
 
 getMaximumThumbSize ()
 
 getAuthor ()
 
 getAuthorForHTMLOutput ()
 
 getOwner ()
 
 getObjId ()
 
 setObjId (int $obj_id=0)
 
 getLifecycle ()
 
 setLifecycle (ilAssQuestionLifecycle $lifecycle)
 
 setExternalId (?string $external_id)
 
 getExternalId ()
 
 getSuggestedSolutionOutput ()
 
 getSuggestedSolutions ()
 
 getReachedPoints (int $active_id, int $pass)
 
 getMaximumPoints ()
 
 getAdjustedReachedPoints (int $active_id, int $pass, bool $authorized_solution=true)
 
 calculateResultsFromSolution (int $active_id, int $pass)
 Calculates the question results from a previously saved question solution. More...
 
 persistWorkingState (int $active_id, $pass, bool $authorized=true)
 persists the working state for current testactive and testpass More...
 
 persistPreviewState (ilAssQuestionPreviewSession $preview_session)
 persists the preview state for current user and question More...
 
 validateSolutionSubmit ()
 
 getSuggestedSolutionPath ()
 
 getImagePath ($question_id=null, $object_id=null)
 Returns the image path for web accessable images of a question. More...
 
 getSuggestedSolutionPathWeb ()
 
 getImagePathWeb ()
 Returns the web image path for web accessable images of a question. More...
 
 getTestOutputSolutions (int $activeId, int $pass)
 
 getUserSolutionPreferingIntermediate (int $active_id, ?int $pass=null)
 
 getSolutionValues (int $active_id, ?int $pass=null, bool $authorized=true)
 Loads solutions of a given user from the database an returns it. More...
 
 deleteAnswers (int $question_id)
 
 deleteAdditionalTableData (int $question_id)
 
 delete (int $question_id)
 
 getTotalAnswers ()
 
 cloneXHTMLMediaObjectsOfQuestion (int $source_question_id)
 
 createPageObject ()
 
 clonePageOfQuestion (int $a_q_id)
 
 getPageOfQuestion ()
 
 setOriginalId (?int $original_id)
 
 getOriginalId ()
 
 fixSvgToPng (string $imageFilenameContainingString)
 
 fixUnavailableSkinImageSources (string $html)
 
 loadFromDb (int $question_id)
 
 createNewQuestion (bool $a_create_page=true)
 Creates a new question without an owner when a new question is created This assures that an ID is given to the question if a file upload or something else occurs. More...
 
 saveQuestionDataToDb (?int $original_id=null)
 
 duplicate (bool $for_test=true, string $title='', string $author='', int $owner=-1, $test_obj_id=null)
 
 copyObject (int $target_parent_id, string $title='')
 
 createNewOriginalFromThisDuplicate (int $target_parent_id, string $target_question_title='')
 
 saveToDb (?int $original_id=null)
 
 deleteSuggestedSolutions ()
 
 getSuggestedSolution (int $subquestion_index=0)
 
 resolveInternalLink (string $internal_link)
 
 resolveSuggestedSolutionLinks ()
 
 getInternalLinkHref (string $target)
 
 syncWithOriginal ()
 
 getPoints ()
 
 setPoints (float $points)
 
 getSolutionMaxPass (int $active_id)
 
 isWriteable ()
 
 calculateReachedPointsFromPreviewSession (ilAssQuestionPreviewSession $preview_session)
 
 isPreviewSolutionCorrect (ilAssQuestionPreviewSession $preview_session)
 
 adjustReachedPointsByScoringOptions (float $points, int $active_id)
 Adjust the given reached points by checks for all special scoring options in the test container. More...
 
 buildHashedImageFilename (string $plain_image_filename, bool $unique=false)
 
 getQuestion ()
 
 getQuestionForHTMLOutput ()
 
 setQuestion (string $question="")
 
 getQuestionTypeID ()
 
 cleanupMediaObjectUsage ()
 
 getInstances ()
 
 getActiveUserData (int $active_id)
 Returns the user id and the test id for a given active id. More...
 
 hasSpecificFeedback ()
 
 getNrOfTries ()
 
 setNrOfTries (int $a_nr_of_tries)
 
 setExportImagePath (string $path)
 
 formatSAQuestion ($a_q)
 
 setPreventRteUsage (bool $prevent_rte_usage)
 
 getPreventRteUsage ()
 
 migrateContentForLearningModule (ilAssSelfAssessmentMigrator $migrator)
 
 setSelfAssessmentEditingMode (bool $selfassessmenteditingmode)
 
 getSelfAssessmentEditingMode ()
 
 setDefaultNrOfTries (int $defaultnroftries)
 
 getDefaultNrOfTries ()
 
 syncSkillAssignments (int $srcParentId, int $srcQuestionId, int $trgParentId, int $trgQuestionId)
 
 isAnswered (int $active_id, int $pass)
 
 getAdditionalContentEditingMode ()
 
 setAdditionalContentEditingMode (?string $additionalContentEditingMode)
 
 isAdditionalContentEditingModePageObject ()
 
 isValidAdditionalContentEditingMode (string $additionalContentEditingMode)
 
 getValidAdditionalContentEditingModes ()
 
 getHtmlUserSolutionPurifier ()
 
 getHtmlQuestionContentPurifier ()
 
 setLastChange (int $lastChange)
 
 getLastChange ()
 
 removeIntermediateSolution (int $active_id, int $pass)
 
 removeCurrentSolution (int $active_id, int $pass, bool $authorized=true)
 
 saveCurrentSolution (int $active_id, int $pass, $value1, $value2, bool $authorized=true, $tstamp=0)
 
 updateCurrentSolution (int $solutionId, $value1, $value2, bool $authorized=true)
 
 updateCurrentSolutionsAuthorization (int $activeId, int $pass, bool $authorized, bool $keepTime=false)
 
 setStep ($step)
 
 getStep ()
 
 toJSON ()
 
 intermediateSolutionExists (int $active_id, int $pass)
 
 authorizedSolutionExists (int $active_id, ?int $pass)
 
 authorizedOrIntermediateSolutionExists (int $active_id, int $pass)
 
 lookupForExistingSolutions (int $activeId, int $pass)
 Lookup if an authorized or intermediate solution exists. More...
 
 isAddableAnswerOptionValue (int $qIndex, string $answerOptionValue)
 
 addAnswerOptionValue (int $qIndex, string $answerOptionValue, float $points)
 
 removeAllExistingSolutions ()
 
 removeExistingSolutions (int $activeId, int $pass)
 
 resetUsersAnswer (int $activeId, int $pass)
 
 removeResultRecord (int $activeId, int $pass)
 
 fetchValuePairsFromIndexedValues (array $indexedValues)
 
 fetchIndexedValuesFromValuePairs (array $value_pairs)
 
 updateTimestamp ()
 
 getTestPresentationConfig ()
 
 hasWritableOriginalInQuestionPool ()
 
 answerToParticipantInteraction (AdditionalInformationGenerator $additional_info, int $test_ref_id, int $active_id, int $pass, string $source_ip, TestParticipantInteractionTypes $interaction_type)
 
 toQuestionAdministrationInteraction (AdditionalInformationGenerator $additional_info, int $test_ref_id, TestQuestionAdministrationInteractionTypes $interaction_type)
 
 getSolutionForTextOutput (int $active_id, int $pass)
 
 getCorrectSolutionForTextOutput (int $active_id, int $pass)
 
 getVariablesAsTextArray (int $active_id, int $pass)
 
 validateSolutionSubmit ()
 
 toLog (AdditionalInformationGenerator $additional_info)
 
 answerToParticipantInteraction (AdditionalInformationGenerator $additional_info, int $test_id, int $active_id, int $pass, string $source_ip, TestParticipantInteractionTypes $interaction_type)
 
 toQuestionAdministrationInteraction (AdditionalInformationGenerator $additional_info, int $test_id, TestQuestionAdministrationInteractionTypes $interaction_type)
 
 saveAdditionalQuestionDataToDb ()
 Saves a record to the question types additional data table. More...
 
 saveAnswerSpecificDataToDb ()
 Saves the answer specific records into a question types answer table. More...
 
- Public Member Functions inherited from iQuestionCondition
 getOperators (string $expression)
 Get all available operations for a specific question. More...
 
 getExpressionTypes ()
 Get all available expression types for a specific question. More...
 
 getUserQuestionResult (int $active_id, int $pass)
 Get the user solution for a question by active_id and the test pass. More...
 
 getAvailableAnswerOptions (?int $index=null)
 If index is null, the function returns an array with all anwser options else it returns the specific answer option. More...
 
 toJSON ()
 

Data Fields

array $gaps = []
 
string $textgap_rating = assClozeGap::TEXTGAP_RATING_CASEINSENSITIVE
 The rating option for text gaps. More...
 
ilAssQuestionFeedback $feedbackOBJ
 
- Data Fields inherited from assQuestion
const ADDITIONAL_CONTENT_EDITING_MODE_RTE = 'default'
 
const ADDITIONAL_CONTENT_EDITING_MODE_IPE = 'pageobject'
 
const TRIM_PATTERN = '/^[\p{C}\p{Z}]+|[\p{C}\p{Z}]+$/u'
 
ilAssQuestionFeedback $feedbackOBJ
 
bool $prevent_rte_usage = false
 
bool $selfassessmenteditingmode = false
 
int $defaultnroftries = 0
 
string $questionActionCmd = 'handleQuestionAction'
 
const KEY_VALUES_IMPLOSION_SEPARATOR = ':'
 
- Data Fields inherited from iQuestionCondition
const StringResultExpression = '~TEXT~'
 
const PercentageResultExpression = '%n%'
 
const NumericResultExpression = '#n#'
 
const MatchingResultExpression = ';n:m;'
 
const OrderingResultExpression = '$n,m,o,p$'
 
const NumberOfResultExpression = '+n+'
 
const ExclusiveResultExpression = '*n,m,o,p*'
 
const EmptyAnswerExpression = "?"
 

Protected Member Functions

 saveClozeGapItemsToDb (assClozeGap $gap, int $key)
 
 saveClozeTextGapRecordToDb (int $next_id, int $key, assAnswerCloze $item, assClozeGap $gap)
 
 saveClozeSelectGapRecordToDb (int $next_id, int $key, assAnswerCloze $item, assClozeGap $gap)
 
 saveClozeNumericGapRecordToDb (int $next_id, int $key, assAnswerCloze $item, assClozeGap $gap)
 
 isValidNumericSubmitValue ($submittedValue)
 
 getSolutionSubmit ()
 
 lmMigrateQuestionTypeSpecificContent (ilAssSelfAssessmentMigrator $migrator)
 
 calculateReachedPointsForSolution (?array $user_result, array &$detailed=[])
 
 solutionValuesToLog (AdditionalInformationGenerator $additional_info, array $solution_values)
 MUST convert the given solution values into an array or a string that can be stored in the log. More...
 
- Protected Member Functions inherited from assQuestion
 solutionValuesToLog (AdditionalInformationGenerator $additional_info, array $solution_values)
 MUST convert the given solution values into an array or a string that can be stored in the log. More...
 
 solutionValuesToText (array $solution_values)
 MUST convert the given solution values into text. More...
 
 getQuestionAction ()
 
 isNonEmptyItemListPostSubmission (string $post_submission_field_name)
 
 savePreviewData (ilAssQuestionPreviewSession $preview_session)
 
 deletePageOfQuestion (int $question_id)
 
 cloneQuestionTypeSpecificProperties (self $target)
 
 removeAllImageFiles (string $image_target_path)
 
 onDuplicate (int $original_parent_id, int $original_question_id, int $duplicate_parent_id, int $duplicate_question_id)
 
 afterSyncWithOriginal (int $original_question_id, int $clone_question_id, int $original_parent_id, int $clone_parent_id)
 
 onCopy (int $sourceParentId, int $sourceQuestionId, int $targetParentId, int $targetQuestionId)
 
 duplicateComments (int $parent_source_id, int $source_id, int $parent_target_id, int $target_id)
 
 deleteComments ()
 
 getNotesManager ()
 
 getNotesDataService ()
 
 getNotesRepo ()
 
 cloneSuggestedSolutions (int $source_question_id, int $target_question_id)
 
 duplicateSuggestedSolutionFiles (int $parent_id, int $question_id)
 Duplicates the files of a suggested solution if the question is duplicated. More...
 
 cloneSuggestedSolutionFiles (int $source_question_id, int $target_question_id)
 
 copySuggestedSolutions (int $target_question_id)
 
 ensureNonNegativePoints (float $points)
 
 purifyAndPrepareTextAreaOutput (string $content)
 
 getRTETextWithMediaObjects ()
 
 getSelfAssessmentFormatter ()
 
 lmMigrateQuestionTypeGenericContent (ilAssSelfAssessmentMigrator $migrator)
 
 lmMigrateQuestionTypeSpecificContent (ilAssSelfAssessmentMigrator $migrator)
 
 duplicateSkillAssignments (int $srcParentId, int $srcQuestionId, int $trgParentId, int $trgQuestionId)
 
 buildQuestionDataQuery ()
 
 getCurrentSolutionResultSet (int $active_id, int $pass, bool $authorized=true)
 
 removeSolutionRecordById (int $solutionId)
 
 getSolutionRecordById (int $solutionId)
 
 deleteDummySolutionRecord (int $activeId, int $passIndex)
 
 isDummySolutionRecord (array $solutionRecord)
 
 deleteSolutionRecordByValues (int $activeId, int $passIndex, bool $authorized, array $matchValues)
 
 duplicateIntermediateSolutionAuthorized (int $activeId, int $passIndex)
 
 forceExistingIntermediateSolution (int $activeId, int $passIndex, bool $considerDummyRecordCreation)
 
 lookupMaxStep (int $active_id, int $pass)
 
 buildTestPresentationConfig ()
 
 getSuggestedSolutionsRepo ()
 
 loadSuggestedSolutions ()
 
 answerToLog (AdditionalInformationGenerator $additional_info, int $active_id, int $pass)
 

Protected Attributes

 $gap_combinations = []
 
bool $gap_combinations_exist = false
 
bool $identical_scoring = true
 Defines the scoring for "identical solutions". More...
 
int $fixed_text_length = null
 
string $cloze_text = ''
 
 $feedbackMode = ilAssClozeTestFeedback::FB_MODE_GAP_QUESTION
 
- Protected Attributes inherited from assQuestion
const HAS_SPECIFIC_FEEDBACK = true
 
GeneralQuestionPropertiesRepository $questionrepository
 
RequestDataCollector $questionpool_request
 
QuestionFiles $question_files
 
ilAssQuestionProcessLocker $processLocker
 
ilTestQuestionConfig $testQuestionConfig
 
SuggestedSolutionsDatabaseRepository $suggestedsolution_repo
 
ILIAS $ilias
 
ilGlobalPageTemplate $tpl
 
ilLanguage $lng
 
ilDBInterface $db
 
ilObjUser $current_user
 
SkillUsageService $skillUsageService
 
HTTPServices $http
 
Refinery $refinery
 
Transformation $shuffler
 
LoggingServices $log
 
Container $dic
 
ilAssQuestionLifecycle $lifecycle
 
ilAssQuestionPage $page
 
TestResultRepository $test_result_repository
 
int $id
 
string $title
 
string $comment
 
int $owner
 
string $author
 
int $thumb_size
 
string $question
 
float $points = 0.0
 
bool $shuffle = true
 
int $test_id
 
int $obj_id = 0
 
int $original_id = null
 
int $lastChange = null
 
string $external_id = null
 
int $step = null
 
array $suggested_solutions
 

Private Member Functions

 fetchUserResult (int $active_id, ?int $pass)
 

Private Attributes

string $start_tag = '[gap]'
 
string $end_tag = '[/gap]'
 
RandomGroup $randomGroup
 

Additional Inherited Members

- Static Public Member Functions inherited from assQuestion
static setForcePassResultUpdateEnabled (bool $force_pass_results_update_enabled)
 
static isForcePassResultUpdateEnabled ()
 
static _getSuggestedSolutionOutput (int $question_id)
 
static _getReachedPoints (int $active_id, int $question_id, int $pass)
 
static isFileAvailable (string $file)
 
static saveOriginalId (int $questionId, int $originalId)
 
static resetOriginalId (int $questionId)
 
static instantiateQuestion (int $question_id)
 
static _getSolutionMaxPass (int $question_id, int $active_id)
 Returns the maximum pass a users question solution. More...
 
static getFeedbackClassNameByQuestionType (string $questionType)
 
static _questionExistsInTest (int $question_id, int $test_id)
 
static lookupParentObjId (int $question_id)
 
static implodeKeyValues (array $keyValues)
 
static explodeKeyValues (string $keyValues)
 
static convertISO8601FormatH_i_s_ExtendedToSeconds (string $time)
 
static extendedTrim (string $value)
 Trim non-printable characters from the beginning and end of a string. More...
 
- Static Protected Member Functions inherited from assQuestion
static getNumExistingSolutionRecords (int $activeId, int $pass, int $questionId)
 
- Static Protected Attributes inherited from assQuestion
static $force_pass_results_update_enabled = false
 
static $imageSourceFixReplaceMap
 

Detailed Description

Class for cloze tests.

Author
Helmut Schottmüller helmu.nosp@m.t.sc.nosp@m.hottm.nosp@m.uell.nosp@m.er@ma.nosp@m.c.co.nosp@m.m
Björn Heyser bheys.nosp@m.er@d.nosp@m.ataba.nosp@m.y.de
Maximilian Becker mbeck.nosp@m.er@d.nosp@m.ataba.nosp@m.y.de
Version
$Id$

Definition at line 38 of file class.assClozeTest.php.

Constructor & Destructor Documentation

◆ __construct()

assClozeTest::__construct ( string  $title = "",
string  $comment = "",
string  $author = "",
int  $owner = -1,
string  $question = "" 
)

Definition at line 82 of file class.assClozeTest.php.

88 {
89 global $DIC;
91 $this->setQuestion($question); // @TODO: Should this be $question?? See setter for why this is not trivial.
92 $this->randomGroup = $DIC->refinery()->random();
93 }
setQuestion(string $question="")
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $DIC
Definition: shib_login.php:26

References assQuestion\$author, assQuestion\$comment, $DIC, assQuestion\$owner, assQuestion\$question, assQuestion\$title, ILIAS\GlobalScreen\Provider\__construct(), and assQuestion\setQuestion().

+ Here is the call graph for this function:

Member Function Documentation

◆ addAnswerOptionValue()

assClozeTest::addAnswerOptionValue ( int  $qIndex,
string  $answerOptionValue,
float  $points 
)

Reimplemented from assQuestion.

Definition at line 1619 of file class.assClozeTest.php.

1619 : void
1620 {
1621 $gap = $this->getGap($qIndex); /* @var assClozeGap $gap */
1622
1623 $item = new assAnswerCloze($answerOptionValue, $points);
1624 $item->setOrder($gap->getItemCount());
1625
1626 $gap->addItem($item);
1627 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getGap(int $gap_index=0)

References assClozeGap\addItem(), assClozeGap\getItemCount(), and ASS_AnswerSimple\setOrder().

+ Here is the call graph for this function:

◆ addGapAnswer()

assClozeTest::addGapAnswer (   $gap_index,
  $order,
  $answer 
)

Sets the answer text of a gap with a given index.

The index of the first gap is 0, the index of the second gap is 1 and so on.

Parameters
integer$gap_indexA nonnegative index of the n-th gap
integer$orderThe order of the answer text
string$answerThe answer text @access public
See also
$gaps

Definition at line 626 of file class.assClozeTest.php.

626 : void
627 {
628 if (array_key_exists($gap_index, $this->gaps)) {
629 if ($this->gaps[$gap_index]->getType() == assClozeGap::TYPE_NUMERIC) {
630 // only allow notation with "." for real numbers
631 $answer = str_replace(",", ".", $answer);
632 }
633 $this->gaps[$gap_index]->addItem(new assAnswerCloze(trim($answer), 0, $order));
634 }
635 }

References assClozeGap\TYPE_NUMERIC.

◆ addGapAtIndex()

assClozeTest::addGapAtIndex (   $gap,
  $index 
)

Adds a ClozeGap object at a given index.

Parameters
object$gapThe gap object
integer$indexA nonnegative index of the n-th gap @access public
See also
$gaps

Definition at line 697 of file class.assClozeTest.php.

697 : void
698 {
699 $this->gaps[$index] = $gap;
700 }

◆ addGapText()

assClozeTest::addGapText (   $gap_index)

Adds a new answer text value to a text gap with a given index.

The index of the first gap is 0, the index of the second gap is 1 and so on.

Parameters
integer$gap_indexA nonnegative index of the n-th gap @access public
See also
$gaps

Definition at line 677 of file class.assClozeTest.php.

677 : void
678 {
679 if (array_key_exists($gap_index, $this->gaps)) {
680 $answer = new assAnswerCloze(
681 "",
682 0,
683 $this->gaps[$gap_index]->getItemCount()
684 );
685 $this->gaps[$gap_index]->addItem($answer);
686 }
687 }

◆ calculateCombinationResult()

assClozeTest::calculateCombinationResult (   $user_result)

Definition at line 1404 of file class.assClozeTest.php.

1404 : array
1405 {
1406 $points = 0;
1407
1408 $assClozeGapCombinationObj = new assClozeGapCombination($this->db);
1409 $gap_used_in_combination = [];
1410 if ($assClozeGapCombinationObj->combinationExistsForQid($this->getId())) {
1411 $combinations_for_question = $assClozeGapCombinationObj->getCleanCombinationArray($this->getId());
1412 $gap_answers = [];
1413
1414 foreach ($user_result as $user_result_build_list) {
1415 if (is_array($user_result_build_list)) {
1416 $gap_answers[$user_result_build_list['gap_id']] = $user_result_build_list['value'];
1417 }
1418 }
1419
1420 foreach ($combinations_for_question as $combination) {
1421 foreach ($combination as $row_key => $row_answers) {
1422 $combination_fulfilled = true;
1423 $points_for_combination = $row_answers['points'];
1424 foreach ($row_answers as $gap_key => $combination_gap_answer) {
1425 if ($gap_key !== 'points') {
1426 $gap_used_in_combination[$gap_key] = $gap_key;
1427 }
1428 if ($combination_fulfilled && array_key_exists($gap_key, $gap_answers)) {
1429 switch ($combination_gap_answer['type']) {
1431 $is_text_gap_correct = $this->getTextgapPoints($gap_answers[$gap_key], $combination_gap_answer['answer'], 1);
1432 if ($is_text_gap_correct != 1) {
1433 $combination_fulfilled = false;
1434 }
1435 break;
1437 $answer = $this->gaps[$gap_key]->getItem($gap_answers[$gap_key]);
1438 $answertext = $answer?->getAnswertext();
1439 if ($answertext != $combination_gap_answer['answer']) {
1440 $combination_fulfilled = false;
1441 }
1442 break;
1444 $answer = $this->gaps[$gap_key]->getItem(0);
1445 if ($combination_gap_answer['answer'] != 'out_of_bound') {
1446 $is_numeric_gap_correct = $this->getNumericgapPoints($answer->getAnswertext(), $gap_answers[$gap_key], 1, $answer->getLowerBound(), $answer->getUpperBound());
1447 if ($is_numeric_gap_correct != 1) {
1448 $combination_fulfilled = false;
1449 }
1450 } else {
1451 $wrong_is_the_new_right = $this->getNumericgapPoints($answer->getAnswertext(), $gap_answers[$gap_key], 1, $answer->getLowerBound(), $answer->getUpperBound());
1452 if ($wrong_is_the_new_right == 1) {
1453 $combination_fulfilled = false;
1454 }
1455 }
1456 break;
1457 }
1458 } else {
1459 if ($gap_key !== 'points') {
1460 $combination_fulfilled = false;
1461 }
1462 }
1463 }
1464 if ($combination_fulfilled) {
1465 $points += $points_for_combination;
1466 }
1467 }
1468 }
1469 }
1470 return [$points, $gap_used_in_combination];
1471 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getTextgapPoints($a_original, $a_entered, $max_points)
Returns the points for a text gap and compares the given solution with the entered solution using the...
getNumericgapPoints($a_original, $a_entered, $max_points, $lowerBound, $upperBound)
Returns the points for a text gap and compares the given solution with the entered solution using the...

References ILIAS\Survey\Mode\getId(), assClozeGap\TYPE_NUMERIC, assClozeGap\TYPE_SELECT, and assClozeGap\TYPE_TEXT.

+ Here is the call graph for this function:

◆ calculateReachedPoints()

assClozeTest::calculateReachedPoints ( int  $active_id,
?int  $pass = null,
bool  $authorized_solution = true 
)

Reimplemented from assQuestion.

Definition at line 973 of file class.assClozeTest.php.

977 : float {
978 $user_result = $this->fetchUserResult($active_id, $pass, $authorized_solution);
979 return $this->calculateReachedPointsForSolution($user_result);
980 }
calculateReachedPointsForSolution(?array $user_result, array &$detailed=[])
fetchUserResult(int $active_id, ?int $pass)

◆ calculateReachedPointsForSolution()

assClozeTest::calculateReachedPointsForSolution ( ?array  $user_result,
array &  $detailed = [] 
)
protected
Parameters
array$user_result
array$detailed

Definition at line 1476 of file class.assClozeTest.php.

1476 : float
1477 {
1478 $points = 0.0;
1479
1480 $assClozeGapCombinationObj = new assClozeGapCombination($this->db);
1481 $combinations[1] = [];
1482 if ($this->gap_combinations_exist) {
1483 $combinations = $this->calculateCombinationResult($user_result);
1484 $points = $combinations[0];
1485 }
1486
1487 $solution_values_text = []; // for identical scoring checks
1488 $solution_values_select = []; // for identical scoring checks
1489 $solution_values_numeric = []; // for identical scoring checks
1490 foreach ($user_result as $gap_id => $value) {
1491 if (is_string($value)) {
1492 $value = ["value" => $value];
1493 }
1494
1495 if (array_key_exists($gap_id, $this->gaps) && !array_key_exists($gap_id, $combinations[1])) {
1496 switch ($this->gaps[$gap_id]->getType()) {
1498 $gappoints = 0.0;
1499 for ($order = 0; $order < $this->gaps[$gap_id]->getItemCount(); $order++) {
1500 $answer = $this->gaps[$gap_id]->getItem($order);
1501 $gotpoints = $this->getTextgapPoints($answer->getAnswertext(), $value["value"], $answer->getPoints());
1502 if ($gotpoints > $gappoints) {
1503 $gappoints = $gotpoints;
1504 }
1505 }
1506 if (!$this->getIdenticalScoring()) {
1507 // check if the same solution text was already entered
1508 if ((in_array($value["value"], $solution_values_text)) && ($gappoints > 0.0)) {
1509 $gappoints = 0.0;
1510 }
1511 }
1512 $points += $gappoints;
1513 $detailed[$gap_id] = ["points" => $gappoints, "best" => ($this->getMaximumGapPoints($gap_id) == $gappoints) ? true : false, "positive" => ($gappoints > 0.0) ? true : false];
1514 array_push($solution_values_text, $value["value"]);
1515 break;
1517 $gappoints = 0.0;
1518 for ($order = 0; $order < $this->gaps[$gap_id]->getItemCount(); $order++) {
1519 $answer = $this->gaps[$gap_id]->getItem($order);
1520 $gotpoints = $this->getNumericgapPoints($answer->getAnswertext(), $value["value"], $answer->getPoints(), $answer->getLowerBound(), $answer->getUpperBound());
1521 if ($gotpoints > $gappoints) {
1522 $gappoints = $gotpoints;
1523 }
1524 }
1525 if (!$this->getIdenticalScoring()) {
1526 // check if the same solution value was already entered
1527 $eval = new EvalMath();
1528 $eval->suppress_errors = true;
1529 $found_value = false;
1530 foreach ($solution_values_numeric as $solval) {
1531 if ($eval->e($solval) == $eval->e($value["value"])) {
1532 $found_value = true;
1533 }
1534 }
1535 if ($found_value && ($gappoints > 0.0)) {
1536 $gappoints = 0.0;
1537 }
1538 }
1539 $points += $gappoints;
1540 $detailed[$gap_id] = ["points" => $gappoints, "best" => ($this->getMaximumGapPoints($gap_id) == $gappoints) ? true : false, "positive" => ($gappoints > 0.0) ? true : false];
1541 array_push($solution_values_numeric, $value["value"]);
1542 break;
1544 if ($value["value"] >= 0.0) {
1545 for ($order = 0; $order < $this->gaps[$gap_id]->getItemCount(); $order++) {
1546 $answer = $this->gaps[$gap_id]->getItem($order);
1547 if ($value["value"] == $answer->getOrder()) {
1548 $answerpoints = $answer->getPoints();
1549 if (!$this->getIdenticalScoring()) {
1550 // check if the same solution value was already entered
1551 if ((in_array($answer->getAnswertext(), $solution_values_select)) && ($answerpoints > 0.0)) {
1552 $answerpoints = 0.0;
1553 }
1554 }
1555 $points += $answerpoints;
1556 $detailed[$gap_id] = ["points" => $answerpoints, "best" => ($this->getMaximumGapPoints($gap_id) == $answerpoints) ? true : false, "positive" => ($answerpoints > 0.0) ? true : false];
1557 array_push($solution_values_select, $answer->getAnswertext());
1558 }
1559 }
1560 }
1561 break;
1562 }
1563 }
1564 }
1565
1566 return $points;
1567 }
return true
getMaximumGapPoints($gap_index)
Returns the maximum points for a gap.
calculateCombinationResult($user_result)
getIdenticalScoring()
Returns the identical scoring status of the question.

References true, assClozeGap\TYPE_NUMERIC, assClozeGap\TYPE_SELECT, and assClozeGap\TYPE_TEXT.

◆ calculateReachedPointsFromPreviewSession()

assClozeTest::calculateReachedPointsFromPreviewSession ( ilAssQuestionPreviewSession  $preview_session)

Reimplemented from assQuestion.

Definition at line 1569 of file class.assClozeTest.php.

1569 : float
1570 {
1571 $participant_session = $preview_session->getParticipantsSolution();
1572
1573 if (!is_array($participant_session)) {
1574 return 0.0;
1575 }
1576
1577 $user_solution = [];
1578
1579 foreach ($participant_session as $key => $val) {
1580 $user_solution[$key] = ['gap_id' => $key, 'value' => $val];
1581 }
1582
1583 $reached_points = $this->calculateReachedPointsForSolution($user_solution);
1584
1585 return $this->ensureNonNegativePoints($reached_points);
1586 }
ensureNonNegativePoints(float $points)

References ilAssQuestionPreviewSession\getParticipantsSolution().

+ Here is the call graph for this function:

◆ checkForValidFormula()

assClozeTest::checkForValidFormula ( string  $value)

Definition at line 968 of file class.assClozeTest.php.

968 : int
969 {
970 return preg_match("/^-?(\\d*)(,|\\.|\\/){0,1}(\\d*)$/", $value, $matches);
971 }

◆ cleanQuestiontext()

assClozeTest::cleanQuestiontext (   $text)

Cleans cloze question text to remove attributes or tags from older ILIAS versions.

Parameters
string$textThe cloze question text
Returns
string The cleaned cloze question text

Definition at line 119 of file class.assClozeTest.php.

119 : string
120 {
121 if ($text === null) {
122 return '';
123 }
124 // fau: fixGapReplace - mask dollars for replacement
125 $text = str_replace('$', 'GAPMASKEDDOLLAR', $text);
126 $text = preg_replace("/\[gap[^\]]*?\]/", "[gap]", $text);
127 $text = preg_replace("/<gap([^>]*?)>/", "[gap]", $text);
128 $text = str_replace("</gap>", "[/gap]", $text);
129 $text = str_replace('GAPMASKEDDOLLAR', '$', $text);
130 // fau.
131 return $text;
132 }
$text
Definition: xapiexit.php:21

References $text.

◆ clearGapAnswers()

assClozeTest::clearGapAnswers ( )

Removes all answers from the gaps.

@access public

See also
$gaps

Definition at line 593 of file class.assClozeTest.php.

593 : void
594 {
595 foreach ($this->gaps as $gap_index => $gap) {
596 $this->gaps[$gap_index]->clearItems();
597 }
598 }

◆ cloneQuestionTypeSpecificProperties()

assClozeTest::cloneQuestionTypeSpecificProperties ( \assQuestion  $target)

Definition at line 784 of file class.assClozeTest.php.

786 : \assQuestion {
787 if ($this->gap_combinations_exist) {
788 $gap_combination = new assClozeGapCombination($this->db);
789 $gap_combination->clearGapCombinationsFromDb($target->getId());
790 $gap_combination->importGapCombinationToDb(
791 $target->getId(),
792 $this->gap_combinations,
793 );
794
795 // Mantis 46713: The maximum points may have changed due to the combinations,
796 // so the question must be saved again
797 $target->saveToDb();
798 }
799
800 return $target;
801 }

References assQuestion\getId(), and assQuestion\saveToDb().

+ Here is the call graph for this function:

◆ createGapsFromQuestiontext()

assClozeTest::createGapsFromQuestiontext ( )

Create gap entries by parsing the question text.

@access public

See also
$gaps

Definition at line 540 of file class.assClozeTest.php.

540 : void
541 {
542 $search_pattern = "|\[gap\](.*?)\[/gap\]|i";
543 preg_match_all($search_pattern, $this->getClozeText(), $found);
544 $this->gaps = [];
545 if (count($found[0])) {
546 foreach ($found[1] as $gap_index => $answers) {
547 // create text gaps by default
549 $textparams = preg_split("/(?<!\\\\),/", $answers);
550 foreach ($textparams as $key => $value) {
551 $answer = new assAnswerCloze($value, 0, $key);
552 $gap->addItem($answer);
553 }
554 $this->gaps[$gap_index] = $gap;
555 }
556 }
557 }
Class for cloze question gaps.
getClozeText()
Returns the cloze text.

References assClozeGap\addItem(), and assClozeGap\TYPE_TEXT.

+ Here is the call graph for this function:

◆ deleteAnswerText()

assClozeTest::deleteAnswerText (   $gap_index,
  $answer_index 
)

Deletes the answer text of a gap with a given index and an answer with a given order.

The index of the first gap is 0, the index of the second gap is 1 and so on.

Parameters
integer$gap_indexA nonnegative index of the n-th gap
integer$answer_indexThe order of the answer text @access public
See also
$gaps

Definition at line 833 of file class.assClozeTest.php.

833 : void
834 {
835 if (array_key_exists($gap_index, $this->gaps)) {
836 if ($this->gaps[$gap_index]->getItemCount() == 1) {
837 // this is the last answer text => remove the gap
838 $this->deleteGap($gap_index);
839 } else {
840 // remove the answer text
841 $this->gaps[$gap_index]->deleteItem($answer_index);
843 }
844 }
845 }
updateClozeTextFromGaps()
Updates the gap parameters in the cloze text from the form input.
deleteGap($gap_index)
Deletes a gap with a given index.

◆ deleteGap()

assClozeTest::deleteGap (   $gap_index)

Deletes a gap with a given index.

The index of the first gap is 0, the index of the second gap is 1 and so on.

Parameters
integer$gap_indexA nonnegative index of the n-th gap @access public
See also
$gaps

Definition at line 855 of file class.assClozeTest.php.

855 : void
856 {
857 if (array_key_exists($gap_index, $this->gaps)) {
858 $output = $this->getClozeText();
859 foreach ($this->getGaps() as $replace_gap_index => $gap) {
860 $answers = [];
861 foreach ($gap->getItemsRaw() as $item) {
862 array_push($answers, str_replace(",", "\\,", $item->getAnswerText()));
863 }
864 if ($replace_gap_index == $gap_index) {
865 // fau: fixGapReplace - use replace function
866 $output = $this->replaceFirstGap($output, '');
867 // fau.
868 } else {
869 // fau: fixGapReplace - use replace function
870 $output = $this->replaceFirstGap($output, "[_gap]" . join(",", $answers) . "[/_gap]");
871 // fau.
872 }
873 }
874 $output = str_replace("_gap]", "gap]", $output);
875 $this->cloze_text = $output;
876 unset($this->gaps[$gap_index]);
877 $this->gaps = array_values($this->gaps);
878 }
879 }
replaceFirstGap(string $gaptext, string $content)

References assClozeGap\getItemsRaw().

+ Here is the call graph for this function:

◆ fetchAnswerValueForGap()

assClozeTest::fetchAnswerValueForGap (   $userSolution,
  $gapIndex 
)

Definition at line 1588 of file class.assClozeTest.php.

1588 : string
1589 {
1590 $answerValue = '';
1591
1592 foreach ($userSolution as $value1 => $value2) {
1593 if ($value1 == $gapIndex) {
1594 $answerValue = $value2;
1595 break;
1596 }
1597 }
1598
1599 return $answerValue;
1600 }

◆ fetchSolutionSubmit()

assClozeTest::fetchSolutionSubmit ( )

Definition at line 1030 of file class.assClozeTest.php.

1030 : array
1031 {
1032 $solution_submit = [];
1033 $post_wrapper = $this->dic->http()->wrapper()->post();
1034 foreach ($this->getGaps() as $index => $gap) {
1035 if (!$post_wrapper->has("gap_$index")) {
1036 continue;
1037 }
1038 $value = trim($post_wrapper->retrieve(
1039 "gap_$index",
1040 $this->dic->refinery()->kindlyTo()->string()
1041 ));
1042 if ($value === '') {
1043 continue;
1044 }
1045
1046 if ($gap->getType() === assClozeGap::TYPE_SELECT && $value === '-1') {
1047 continue;
1048 }
1049
1050 if ($gap->getType() === assClozeGap::TYPE_NUMERIC) {
1051 $value = str_replace(',', '.', $value);
1052 if (!is_numeric($value)) {
1053 $value = null;
1054 }
1055 }
1056
1057 $solution_submit[$index] = $value;
1058 }
1059
1060 return $solution_submit;
1061 }

References assClozeGap\getType(), assClozeGap\TYPE_NUMERIC, and assClozeGap\TYPE_SELECT.

+ Here is the call graph for this function:

◆ fetchUserResult()

assClozeTest::fetchUserResult ( int  $active_id,
?int  $pass 
)
private

Definition at line 993 of file class.assClozeTest.php.

996 : array {
997 if (is_null($pass)) {
998 $pass = $this->getSolutionMaxPass($active_id);
999 }
1000
1001 $result = $this->getCurrentSolutionResultSet($active_id, $pass, true);
1002 $user_result = [];
1003 while ($data = $this->db->fetchAssoc($result)) {
1004 if ($data['value2'] === '') {
1005 continue;
1006 }
1007 $user_result[$data['value1']] = [
1008 'gap_id' => $data['value1'],
1009 'value' => $data['value2']
1010 ];
1011 }
1012
1013 ksort($user_result);
1014 return $user_result;
1015 }
getCurrentSolutionResultSet(int $active_id, int $pass, bool $authorized=true)
getSolutionMaxPass(int $active_id)

◆ flushGaps()

assClozeTest::flushGaps ( )

Definition at line 413 of file class.assClozeTest.php.

413 : void
414 {
415 $this->gaps = [];
416 }

◆ getAdditionalTableName()

assClozeTest::getAdditionalTableName ( )

Returns the name of the additional question data table in the database.

Returns
string The additional table name @access public

Reimplemented from assQuestion.

Definition at line 1176 of file class.assClozeTest.php.

1176 : string
1177 {
1178 return "qpl_qst_cloze";
1179 }

◆ getAnswerTableName()

assClozeTest::getAnswerTableName ( )

Reimplemented from assQuestion.

Definition at line 1181 of file class.assClozeTest.php.

1181 : array
1182 {
1183 return ["qpl_a_cloze",'qpl_a_cloze_combi_res'];
1184 }

◆ getAvailableAnswerOptions()

assClozeTest::getAvailableAnswerOptions (   $index = null)

If index is null, the function returns an array with all anwser options Else it returns the specific answer option.

Parameters
null | int$index
Returns
array|ASS_AnswerSimple

Definition at line 1395 of file class.assClozeTest.php.

1396 {
1397 if ($index !== null) {
1398 return $this->getGap($index);
1399 } else {
1400 return $this->getGaps();
1401 }
1402 }

◆ getClozeText()

assClozeTest::getClozeText ( )

Returns the cloze text.

Returns
string The cloze text string @access public
See also
$cloze_text

Definition at line 437 of file class.assClozeTest.php.

437 : string
438 {
439 return $this->cloze_text;
440 }

Referenced by isComplete().

+ Here is the caller graph for this function:

◆ getClozeTextForHTMLOutput()

assClozeTest::getClozeTextForHTMLOutput ( )

Returns the cloze text as HTML (with optional nl2br) Fix for Mantis 29987: We assume Tiny embeds any text in tags, so if no tags are present, we derive it's non-HTML content and apply nl2br.

Returns
string The cloze text string as HTML
See also
$cloze_text

Definition at line 450 of file class.assClozeTest.php.

450 : string
451 {
452 $gaps = [];
453 preg_match_all('/\[gap\].*?\[\/gap\]/', $this->getClozeText(), $gaps);
454 $string_with_replaced_gaps = str_replace($gaps[0], '######GAP######', $this->getClozeText());
455 $cleaned_text = $this->getHtmlQuestionContentPurifier()->purify(
456 $string_with_replaced_gaps
457 );
458 $cleaned_text_with_gaps = preg_replace_callback('/######GAP######/', function ($match) use (&$gaps) {
459 return array_shift($gaps[0]);
460 }, $cleaned_text);
461
463 || !(new ilSetting('advanced_editing'))->get('advanced_editing_javascript_editor') === 'tinymce') {
464 $cleaned_text_with_gaps = nl2br($cleaned_text_with_gaps);
465 }
466
467 return ilLegacyFormElementsUtil::prepareTextareaOutput($cleaned_text_with_gaps, true);
468 }
isAdditionalContentEditingModePageObject()
static prepareTextareaOutput(string $txt_output, bool $prepare_for_latex_output=false, bool $omitNl2BrWhenTextArea=false)
Prepares a string for a text area output where latex code may be in it If the text is HTML-free,...
ILIAS Setting Class.

References ilLegacyFormElementsUtil\prepareTextareaOutput().

+ Here is the call graph for this function:

◆ getCorrectSolutionForTextOutput()

assClozeTest::getCorrectSolutionForTextOutput ( int  $active_id,
int  $pass 
)

Reimplemented from assQuestion.

Definition at line 1717 of file class.assClozeTest.php.

1717 : array
1718 {
1719 $answers = [];
1720 foreach ($this->getGaps() as $gap_index => $gap) {
1721 $correct_answers = array_map(
1722 fn(int $v): string => $gap->getItem($v)->getAnswertext(),
1723 $gap->getBestSolutionIndexes()
1724 );
1725 $answers[] = $this->lng->txt('gap') . ' ' . $gap_index + 1 . ': '
1726 . implode(',', $correct_answers);
1727 }
1728 return $answers;
1729 }

References assClozeGap\getBestSolutionIndexes(), assClozeGap\getItem(), and ILIAS\Repository\lng().

+ Here is the call graph for this function:

◆ getEndTag()

assClozeTest::getEndTag ( )

Returns the end tag of a cloze gap.

Returns
string The end tag of a cloze gap @access public
See also
$end_tag

Definition at line 501 of file class.assClozeTest.php.

501 : string
502 {
503 return $this->end_tag;
504 }

◆ getExpressionTypes()

◆ getFeedbackMode()

assClozeTest::getFeedbackMode ( )
Returns
string

Definition at line 521 of file class.assClozeTest.php.

521 : string
522 {
523 return $this->feedbackMode;
524 }

◆ getFixedTextLength()

assClozeTest::getFixedTextLength ( )

Gets the fixed text length for all text fields in the cloze question.

Returns
integer The text field length @access public

Definition at line 1203 of file class.assClozeTest.php.

1203 : ?int
1204 {
1206 }

◆ getGap()

assClozeTest::getGap ( int  $gap_index = 0)

Definition at line 637 of file class.assClozeTest.php.

637 : ?assClozeGap
638 {
639 if (array_key_exists($gap_index, $this->gaps)) {
640 return $this->gaps[$gap_index];
641 }
642 return null;
643 }

◆ getGapCombinations()

assClozeTest::getGapCombinations ( )

Definition at line 1245 of file class.assClozeTest.php.

1245 : array
1246 {
1248 }

◆ getGapCombinationsExists()

assClozeTest::getGapCombinationsExists ( )

Definition at line 1240 of file class.assClozeTest.php.

1240 : bool
1241 {
1243 }

◆ getGapCount()

assClozeTest::getGapCount ( )

Returns the number of gaps.

Returns
integer The number of gaps @access public
See also
$gaps

Definition at line 607 of file class.assClozeTest.php.

607 : int
608 {
609 if (is_array($this->gaps)) {
610 return count($this->gaps);
611 } else {
612 return 0;
613 }
614 }

◆ getGaps()

assClozeTest::getGaps ( )

Definition at line 408 of file class.assClozeTest.php.

408 : array
409 {
410 return $this->gaps;
411 }

Referenced by isComplete().

+ Here is the caller graph for this function:

◆ getIdenticalScoring()

assClozeTest::getIdenticalScoring ( )

Returns the identical scoring status of the question.

Returns
boolean The identical scoring status
See also
$identical_scoring @access public

Definition at line 1153 of file class.assClozeTest.php.

1153 : bool
1154 {
1156 }
bool $identical_scoring
Defines the scoring for "identical solutions".

◆ getMaximumGapPoints()

assClozeTest::getMaximumGapPoints (   $gap_index)

Returns the maximum points for a gap.

Parameters
integer$gap_indexThe index of the gap
Returns
double The maximum points for the gap @access public
See also
$points

Definition at line 1216 of file class.assClozeTest.php.

1217 {
1218 $points = 0;
1219 $gap_max_points = 0;
1220 if (array_key_exists($gap_index, $this->gaps)) {
1221 $gap = &$this->gaps[$gap_index];
1222 foreach ($gap->getItems($this->getShuffler()) as $answer) {
1223 if ($answer->getPoints() > $gap_max_points) {
1224 $gap_max_points = $answer->getPoints();
1225 }
1226 }
1227 $points += $gap_max_points;
1228 }
1229 return $points;
1230 }

References assClozeGap\getItems().

+ Here is the call graph for this function:

◆ getMaximumPoints()

assClozeTest::getMaximumPoints ( )

Returns the maximum points, a learner can reach answering the question.

@access public

See also
$points

Reimplemented from assQuestion.

Definition at line 742 of file class.assClozeTest.php.

742 : float
743 {
744 $assClozeGapCombinationObj = new assClozeGapCombination($this->db);
745 $points = 0;
746 $gaps_used_in_combination = [];
747 if ($this->gap_combinations_exist) {
748 $points = $assClozeGapCombinationObj->getMaxPointsForCombination($this->getId());
749 $gaps_used_in_combination = $assClozeGapCombinationObj->getGapsWhichAreUsedInCombination($this->getId());
750 }
751 foreach ($this->gaps as $gap_index => $gap) {
752 if (!array_key_exists($gap_index, $gaps_used_in_combination)) {
753 if ($gap->getType() == assClozeGap::TYPE_TEXT) {
754 $gap_max_points = 0;
755 foreach ($gap->getItems($this->getShuffler()) as $item) {
756 if ($item->getPoints() > $gap_max_points) {
757 $gap_max_points = $item->getPoints();
758 }
759 }
760 $points += $gap_max_points;
761 } elseif ($gap->getType() == assClozeGap::TYPE_SELECT) {
762 $srpoints = 0;
763 foreach ($gap->getItems($this->getShuffler()) as $item) {
764 if ($item->getPoints() > $srpoints) {
765 $srpoints = $item->getPoints();
766 }
767 }
768 $points += $srpoints;
769 } elseif ($gap->getType() == assClozeGap::TYPE_NUMERIC) {
770 $numpoints = 0;
771 foreach ($gap->getItems($this->getShuffler()) as $item) {
772 if ($item->getPoints() > $numpoints) {
773 $numpoints = $item->getPoints();
774 }
775 }
776 $points += $numpoints;
777 }
778 }
779 }
780
781 return $points;
782 }

References ILIAS\Survey\Mode\getId(), assClozeGap\getItems(), assClozeGap\getType(), assClozeGap\TYPE_NUMERIC, assClozeGap\TYPE_SELECT, and assClozeGap\TYPE_TEXT.

Referenced by isComplete().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getNumericgapPoints()

assClozeTest::getNumericgapPoints (   $a_original,
  $a_entered,
  $max_points,
  $lowerBound,
  $upperBound 
)

Returns the points for a text gap and compares the given solution with the entered solution using the text gap rating options.

Parameters
string$a_originalThe original (correct) text
string$a_enteredThe text entered by the user
float$max_pointsThe maximum number of points for the solution @access public

Definition at line 942 of file class.assClozeTest.php.

942 : float
943 {
944 $eval = new EvalMath();
945 $eval->suppress_errors = true;
946 $result = 0.0;
947
948 if ($eval->e($a_entered) === false) {
949 return 0.0;
950 } elseif (($eval->e($lowerBound) !== false) && ($eval->e($upperBound) !== false)) {
951 if (($eval->e($a_entered) >= $eval->e($lowerBound)) && ($eval->e($a_entered) <= $eval->e($upperBound))) {
952 $result = $max_points;
953 }
954 } elseif ($eval->e($lowerBound) !== false) {
955 if (($eval->e($a_entered) >= $eval->e($lowerBound)) && ($eval->e($a_entered) <= $eval->e($a_original))) {
956 $result = $max_points;
957 }
958 } elseif ($eval->e($upperBound) !== false) {
959 if (($eval->e($a_entered) >= $eval->e($a_original)) && ($eval->e($a_entered) <= $eval->e($upperBound))) {
960 $result = $max_points;
961 }
962 } elseif ($eval->e($a_entered) == $eval->e($a_original)) {
963 $result = $max_points;
964 }
965 return $result;
966 }

◆ getOperators()

assClozeTest::getOperators ( string  $expression)

Get all available operations for a specific question.

Parameters
$expression

Implements iQuestionCondition.

Definition at line 1323 of file class.assClozeTest.php.

1323 : array
1324 {
1326 }
static getOperatorsByExpression(string $expression)

References ilOperatorsExpressionMapping\getOperatorsByExpression().

+ Here is the call graph for this function:

◆ getQuestionType()

assClozeTest::getQuestionType ( )

Returns the question type of the question.

Returns
integer The question type of the question @access public

Reimplemented from assQuestion.

Definition at line 1104 of file class.assClozeTest.php.

1104 : string
1105 {
1106 return "assClozeTest";
1107 }

◆ getRTETextWithMediaObjects()

assClozeTest::getRTETextWithMediaObjects ( )

Collects all text in the question which could contain media objects which were created with the Rich Text Editor.

Reimplemented from assQuestion.

Definition at line 1236 of file class.assClozeTest.php.

1236 : string
1237 {
1238 return parent::getRTETextWithMediaObjects() . $this->getClozeText();
1239 }

◆ getSolutionSubmit()

assClozeTest::getSolutionSubmit ( )
protected

Definition at line 1063 of file class.assClozeTest.php.

1063 : array
1064 {
1065 return $this->fetchSolutionSubmit();
1066 }

◆ getStartTag()

assClozeTest::getStartTag ( )

Returns the start tag of a cloze gap.

Returns
string The start tag of a cloze gap @access public
See also
$start_tag

Definition at line 477 of file class.assClozeTest.php.

477 : string
478 {
479 return $this->start_tag;
480 }

◆ getTextgapPoints()

assClozeTest::getTextgapPoints (   $a_original,
  $a_entered,
  $max_points 
)

Returns the points for a text gap and compares the given solution with the entered solution using the text gap rating options.

Parameters
string$a_originalThe original (correct) text
string$a_enteredThe text entered by the user
integer$max_pointsThe maximum number of points for the solution @access public

Definition at line 890 of file class.assClozeTest.php.

890 : float
891 {
892 global $DIC;
893 $refinery = $DIC->refinery();
894 $result = 0;
895 $gaprating = $this->getTextgapRating();
896
897 switch ($gaprating) {
899 if (strcmp(ilStr::strToLower($a_original), ilStr::strToLower($a_entered)) == 0) {
900 $result = $max_points;
901 }
902 break;
904 if (strcmp($a_original, $a_entered) == 0) {
905 $result = $max_points;
906 }
907 break;
909 $transformation = $refinery->string()->levenshtein()->standard($a_original, 1);
910 break;
912 $transformation = $refinery->string()->levenshtein()->standard($a_original, 2);
913 break;
915 $transformation = $refinery->string()->levenshtein()->standard($a_original, 3);
916 break;
918 $transformation = $refinery->string()->levenshtein()->standard($a_original, 4);
919 break;
921 $transformation = $refinery->string()->levenshtein()->standard($a_original, 5);
922 break;
923 }
924
925 // run answers against Levenshtein2 methods
926 if (isset($transformation) && $transformation->transform($a_entered) >= 0) {
927 $result = $max_points;
928 }
929 return $result;
930 }
const TEXTGAP_RATING_CASESENSITIVE
const TEXTGAP_RATING_LEVENSHTEIN1
const TEXTGAP_RATING_LEVENSHTEIN5
const TEXTGAP_RATING_CASEINSENSITIVE
const TEXTGAP_RATING_LEVENSHTEIN4
const TEXTGAP_RATING_LEVENSHTEIN2
const TEXTGAP_RATING_LEVENSHTEIN3
getTextgapRating()
Returns the rating option for text gaps.
Refinery $refinery
static strToLower(string $a_string)
Definition: class.ilStr.php:69

References $DIC, ILIAS\UI\examples\Layout\Page\Mail\$refinery, ilStr\strToLower(), assClozeGap\TEXTGAP_RATING_CASEINSENSITIVE, assClozeGap\TEXTGAP_RATING_CASESENSITIVE, assClozeGap\TEXTGAP_RATING_LEVENSHTEIN1, assClozeGap\TEXTGAP_RATING_LEVENSHTEIN2, assClozeGap\TEXTGAP_RATING_LEVENSHTEIN3, assClozeGap\TEXTGAP_RATING_LEVENSHTEIN4, and assClozeGap\TEXTGAP_RATING_LEVENSHTEIN5.

+ Here is the call graph for this function:

◆ getTextgapRating()

assClozeTest::getTextgapRating ( )

Returns the rating option for text gaps.

Returns
string The rating option for text gaps
See also
$textgap_rating @access public

Definition at line 1116 of file class.assClozeTest.php.

1116 : string
1117 {
1118 return $this->textgap_rating;
1119 }
string $textgap_rating
The rating option for text gaps.

◆ getUserQuestionResult()

assClozeTest::getUserQuestionResult ( int  $active_id,
int  $pass 
)

Get the user solution for a question by active_id and the test pass.

Implements iQuestionCondition.

Definition at line 1339 of file class.assClozeTest.php.

1343 $result = new ilUserQuestionResult($this, $active_id, $pass);
1344
1345 $maxStep = $this->lookupMaxStep($active_id, $pass);
1346 if ($maxStep > 0) {
1347 $data = $this->db->queryF(
1348 "
1349 SELECT sol.value1+1 as val, sol.value2, cloze.cloze_type
1350 FROM tst_solutions sol
1351 INNER JOIN qpl_a_cloze cloze ON cloze.gap_id = value1 AND cloze.question_fi = sol.question_fi
1352 WHERE sol.active_fi = %s AND sol.pass = %s AND sol.question_fi = %s AND sol.step = %s
1353 GROUP BY sol.solution_id, sol.value1+1, sol.value2, cloze.cloze_type
1354 ",
1355 ["integer", "integer", "integer","integer"],
1356 [$active_id, $pass, $this->getId(), $maxStep]
1357 );
1358 } else {
1359 $data = $this->db->queryF(
1360 "
1361 SELECT sol.value1+1 as val, sol.value2, cloze.cloze_type
1362 FROM tst_solutions sol
1363 INNER JOIN qpl_a_cloze cloze ON cloze.gap_id = value1 AND cloze.question_fi = sol.question_fi
1364 WHERE sol.active_fi = %s AND sol.pass = %s AND sol.question_fi = %s
1365 GROUP BY sol.solution_id, sol.value1+1, sol.value2, cloze.cloze_type
1366 ",
1367 ["integer", "integer", "integer"],
1368 [$active_id, $pass, $this->getId()]
1369 );
1370 }
1371
1372 while ($row = $this->db->fetchAssoc($data)) {
1373 if ($row["cloze_type"] == 1) {
1374 $row["value2"]++;
1375 }
1376 $result->addKeyValue($row["val"], $row["value2"]);
1377 }
1378
1379 $points = $this->calculateReachedPoints($active_id, $pass);
1380 $max_points = $this->getMaximumPoints();
1381
1382 $result->setReachedPercentage(($points / $max_points) * 100);
1383
1384 return $result;
1385 }
calculateReachedPoints(int $active_id, ?int $pass=null, bool $authorized_solution=true)
getMaximumPoints()
Returns the maximum points, a learner can reach answering the question.
lookupMaxStep(int $active_id, int $pass)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...

◆ getUserResultDetails()

assClozeTest::getUserResultDetails ( int  $active_id,
?int  $pass = null,
bool  $authorized_solution = true 
)

Definition at line 982 of file class.assClozeTest.php.

986 : array {
987 $user_result = $this->fetchUserResult($active_id, $pass, $authorized_solution);
988 $detailed = [];
989 $this->calculateReachedPointsForSolution($user_result, $detailed);
990 return $detailed;
991 }

◆ isAddableAnswerOptionValue()

assClozeTest::isAddableAnswerOptionValue ( int  $qIndex,
string  $answerOptionValue 
)

Reimplemented from assQuestion.

Definition at line 1602 of file class.assClozeTest.php.

1602 : bool
1603 {
1604 $gap = $this->getGap($qIndex);
1605
1606 if ($gap->getType() != assClozeGap::TYPE_TEXT) {
1607 return false;
1608 }
1609
1610 foreach ($gap->getItems($this->randomGroup->dontShuffle()) as $item) {
1611 if ($item->getAnswertext() === $answerOptionValue) {
1612 return false;
1613 }
1614 }
1615
1616 return true;
1617 }

References assClozeGap\getItems(), assClozeGap\getType(), and assClozeGap\TYPE_TEXT.

+ Here is the call graph for this function:

◆ isComplete()

assClozeTest::isComplete ( )

Returns TRUE, if a cloze test is complete for use.

Returns
boolean TRUE, if the cloze test is complete for use, otherwise FALSE

Reimplemented from assQuestion.

Definition at line 100 of file class.assClozeTest.php.

100 : bool
101 {
102 if ($this->getTitle() !== ''
103 && $this->getAuthor()
104 && $this->getClozeText()
105 && count($this->getGaps())
106 && $this->getMaximumPoints() > 0) {
107 return true;
108 }
109 return false;
110 }

References assQuestion\getAuthor(), getClozeText(), getGaps(), getMaximumPoints(), and assQuestion\getTitle().

+ Here is the call graph for this function:

◆ isValidNumericSubmitValue()

assClozeTest::isValidNumericSubmitValue (   $submittedValue)
protected

Definition at line 1017 of file class.assClozeTest.php.

1017 : bool
1018 {
1019 if (is_numeric($submittedValue)) {
1020 return true;
1021 }
1022
1023 if (preg_match('/^[-+]{0,1}\d+\/\d+$/', $submittedValue)) {
1024 return true;
1025 }
1026
1027 return false;
1028 }

◆ lmMigrateQuestionTypeSpecificContent()

assClozeTest::lmMigrateQuestionTypeSpecificContent ( ilAssSelfAssessmentMigrator  $migrator)
protected
Parameters
ilAssSelfAssessmentMigrator$migrator

Reimplemented from assQuestion.

Definition at line 1263 of file class.assClozeTest.php.

1263 : void
1264 {
1265 // DO NOT USE SETTER FOR CLOZE TEXT -> SETTER DOES RECREATE GAP OBJECTS without having gap type info ^^
1266 //$this->setClozeText( $migrator->migrateToLmContent($this->getClozeText()) );
1267 $this->cloze_text = $migrator->migrateToLmContent($this->getClozeText());
1268 // DO NOT USE SETTER FOR CLOZE TEXT -> SETTER DOES RECREATE GAP OBJECTS without having gap type info ^^
1269 }

References ilAssSelfAssessmentMigrator\migrateToLmContent().

+ Here is the call graph for this function:

◆ loadFromDb()

assClozeTest::loadFromDb ( int  $question_id)

Reimplemented from assQuestion.

Definition at line 147 of file class.assClozeTest.php.

147 : void
148 {
149 $result = $this->db->queryF(
150 "SELECT qpl_questions.*, " . $this->getAdditionalTableName() . ".* FROM qpl_questions LEFT JOIN " . $this->getAdditionalTableName() . " ON " . $this->getAdditionalTableName() . ".question_fi = qpl_questions.question_id WHERE qpl_questions.question_id = %s",
151 ["integer"],
152 [$question_id]
153 );
154 if ($result->numRows() == 1) {
155 $data = $this->db->fetchAssoc($result);
156 $this->setId($question_id);
157 $this->setNrOfTries($data['nr_of_tries']);
158 $this->setObjId($data["obj_fi"]);
159 $this->setTitle((string) $data["title"]);
160 $this->setComment((string) $data["description"]);
161 $this->setOriginalId($data["original_id"]);
162 $this->setAuthor($data["author"]);
163 $this->setPoints($data["points"]);
164 $this->setOwner($data["owner"]);
165 $this->setQuestion($this->cleanQuestiontext($data["question_text"]));
166 $this->setClozeText($data['cloze_text'] ?? '');
167 $this->setFixedTextLength($data["fixed_textlen"]);
168 $this->setIdenticalScoring(($data['tstamp'] === 0) ? true : (bool) $data['identical_scoring']);
169 $this->setFeedbackMode($data['feedback_mode'] === null ? ilAssClozeTestFeedback::FB_MODE_GAP_QUESTION : $data['feedback_mode']);
170
171 try {
175 }
176
177 $this->question = ilRTE::_replaceMediaObjectImageSrc($this->question, 1);
178 $this->cloze_text = ilRTE::_replaceMediaObjectImageSrc($this->cloze_text, 1);
179 $this->setTextgapRating($data["textgap_rating"]);
180
181 try {
182 $this->setAdditionalContentEditingMode($data['add_cont_edit_mode']);
184 }
185
186 $result = $this->db->queryF(
187 "SELECT * FROM qpl_a_cloze WHERE question_fi = %s ORDER BY gap_id, aorder ASC",
188 ["integer"],
189 [$question_id]
190 );
191 if ($result->numRows() > 0) {
192 $this->gaps = [];
193 while ($data = $this->db->fetchAssoc($result)) {
194 switch ($data["cloze_type"]) {
196 if (!array_key_exists($data["gap_id"], $this->gaps)) {
197 $this->gaps[$data["gap_id"]] = new assClozeGap(assClozeGap::TYPE_TEXT);
198 }
199 $answer = new assAnswerCloze(
200 $data["answertext"],
201 $data["points"],
202 $data["aorder"]
203 );
204 $this->gaps[$data["gap_id"]]->setGapSize((int) $data['gap_size']);
205
206 $this->gaps[$data["gap_id"]]->addItem($answer);
207 break;
209 if (!array_key_exists($data["gap_id"], $this->gaps)) {
210 $this->gaps[$data["gap_id"]] = new assClozeGap(assClozeGap::TYPE_SELECT);
211 $this->gaps[$data["gap_id"]]->setShuffle($data["shuffle"]);
212 }
213 $answer = new assAnswerCloze(
214 $data["answertext"],
215 $data["points"],
216 $data["aorder"]
217 );
218 $this->gaps[$data["gap_id"]]->addItem($answer);
219 break;
221 if (!array_key_exists($data["gap_id"], $this->gaps)) {
222 $this->gaps[$data["gap_id"]] = new assClozeGap(assClozeGap::TYPE_NUMERIC);
223 }
224 $answer = new assAnswerCloze(
225 $data["answertext"],
226 $data["points"],
227 $data["aorder"]
228 );
229 $this->gaps[$data["gap_id"]]->setGapSize((int) $data['gap_size']);
230 $answer->setLowerBound($data["lowerlimit"]);
231 $answer->setUpperBound($data["upperlimit"]);
232 $this->gaps[$data["gap_id"]]->addItem($answer);
233 break;
234 }
235 }
236 }
237 }
238 $check_for_gap_combinations = (new assClozeGapCombination($this->db))->loadFromDb($question_id);
239 if (count($check_for_gap_combinations) != 0) {
240 $this->setGapCombinationsExists(true);
241 $this->setGapCombinations($check_for_gap_combinations);
242 }
243 parent::loadFromDb($question_id);
244 }
setIdenticalScoring(bool $identical_scoring)
Sets the identical scoring option for cloze questions.
setFeedbackMode($feedbackMode)
setFixedTextLength(?int $fixed_text_length)
Sets a fixed text length for all text fields in the cloze question.
setTextgapRating($a_textgap_rating)
Sets the rating option for text gaps.
getAdditionalTableName()
Returns the name of the additional question data table in the database.
setClozeText(string $cloze_text='')
setGapCombinationsExists($value)
cleanQuestiontext($text)
Cleans cloze question text to remove attributes or tags from older ILIAS versions.
loadFromDb(int $question_id)
setOriginalId(?int $original_id)
setId(int $id=-1)
setAdditionalContentEditingMode(?string $additionalContentEditingMode)
setAuthor(string $author="")
setComment(string $comment="")
setObjId(int $obj_id=0)
setOwner(int $owner=-1)
setNrOfTries(int $a_nr_of_tries)
setLifecycle(ilAssQuestionLifecycle $lifecycle)
setTitle(string $title="")
setPoints(float $points)
const FB_MODE_GAP_QUESTION
constants for different feedback modes (per gap or per gap-answers/options)
static _replaceMediaObjectImageSrc(string $a_text, int $a_direction=0, string $nic='')
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...

References $data, Vendor\Package\$e, ilRTE\_replaceMediaObjectImageSrc(), ilAssClozeTestFeedback\FB_MODE_GAP_QUESTION, ilAssQuestionLifecycle\getDraftInstance(), ilAssQuestionLifecycle\getInstance(), assClozeGap\TYPE_NUMERIC, assClozeGap\TYPE_SELECT, and assClozeGap\TYPE_TEXT.

+ Here is the call graph for this function:

◆ replaceFirstGap()

assClozeTest::replaceFirstGap ( string  $gaptext,
string  $content 
)

Definition at line 134 of file class.assClozeTest.php.

137 : string {
138 $output = preg_replace(
139 '/\[gap\].*?\[\/gap\]/',
140 str_replace('$', 'GAPMASKEDDOLLAR', $content),
141 $gaptext,
142 1
143 );
144 return str_replace('GAPMASKEDDOLLAR', '$', $output);
145 }

◆ saveAdditionalQuestionDataToDb()

assClozeTest::saveAdditionalQuestionDataToDb ( )

Saves a record to the question types additional data table.

Returns
mixed

Implements ilObjQuestionScoringAdjustable.

Definition at line 268 of file class.assClozeTest.php.

268 : void
269 {
270 $this->db->manipulateF(
271 "DELETE FROM " . $this->getAdditionalTableName() . " WHERE question_fi = %s",
272 [ "integer" ],
273 [ $this->getId() ]
274 );
275
276 $this->db->insert($this->getAdditionalTableName(), [
277 'question_fi' => ['integer', $this->getId()],
278 'textgap_rating' => ['text', $this->getTextgapRating()],
279 'identical_scoring' => ['text', $this->getIdenticalScoring()],
280 'fixed_textlen' => ['integer', $this->getFixedTextLength() ? $this->getFixedTextLength() : null],
281 'cloze_text' => ['text', ilRTE::_replaceMediaObjectImageSrc($this->getClozeText(), 0)],
282 'feedback_mode' => ['text', $this->getFeedbackMode()]
283 ]);
284 }
getFixedTextLength()
Gets the fixed text length for all text fields in the cloze question.

References ilRTE\_replaceMediaObjectImageSrc(), and ILIAS\Survey\Mode\getId().

+ Here is the call graph for this function:

◆ saveAnswerSpecificDataToDb()

assClozeTest::saveAnswerSpecificDataToDb ( )

Saves the answer specific records into a question types answer table.

Returns
mixed

Implements ilObjAnswerScoringAdjustable.

Definition at line 255 of file class.assClozeTest.php.

255 : void
256 {
257 $this->db->manipulateF(
258 "DELETE FROM qpl_a_cloze WHERE question_fi = %s",
259 [ "integer" ],
260 [ $this->getId() ]
261 );
262
263 foreach ($this->gaps as $key => $gap) {
264 $this->saveClozeGapItemsToDb($gap, $key);
265 }
266 }
saveClozeGapItemsToDb(assClozeGap $gap, int $key)

References ILIAS\Survey\Mode\getId().

+ Here is the call graph for this function:

◆ saveClozeGapItemsToDb()

assClozeTest::saveClozeGapItemsToDb ( assClozeGap  $gap,
int  $key 
)
protected

Definition at line 285 of file class.assClozeTest.php.

288 : void {
289 foreach ($gap->getItems($this->getShuffler()) as $item) {
290 $next_id = $this->db->nextId('qpl_a_cloze');
291 switch ($gap->getType()) {
293 $this->saveClozeTextGapRecordToDb($next_id, $key, $item, $gap);
294 break;
296 $this->saveClozeSelectGapRecordToDb($next_id, $key, $item, $gap);
297 break;
299 $this->saveClozeNumericGapRecordToDb($next_id, $key, $item, $gap);
300 break;
301 }
302 }
303 }
getItems(Transformation $shuffler, ?int $gap_index=null)
saveClozeSelectGapRecordToDb(int $next_id, int $key, assAnswerCloze $item, assClozeGap $gap)
saveClozeTextGapRecordToDb(int $next_id, int $key, assAnswerCloze $item, assClozeGap $gap)
saveClozeNumericGapRecordToDb(int $next_id, int $key, assAnswerCloze $item, assClozeGap $gap)

References assClozeGap\getType(), assClozeGap\TYPE_NUMERIC, assClozeGap\TYPE_SELECT, and assClozeGap\TYPE_TEXT.

+ Here is the call graph for this function:

◆ saveClozeNumericGapRecordToDb()

assClozeTest::saveClozeNumericGapRecordToDb ( int  $next_id,
int  $key,
assAnswerCloze  $item,
assClozeGap  $gap 
)
protected

Definition at line 367 of file class.assClozeTest.php.

372 : void {
373 $eval = new EvalMath();
374 $eval->suppress_errors = true;
375 $this->db->manipulateF(
376 'INSERT INTO qpl_a_cloze (answer_id, question_fi, gap_id, answertext, points, aorder, cloze_type, lowerlimit, upperlimit, gap_size) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)',
377 [
388 ],
389 [
390 $next_id,
391 $this->getId(),
392 $key,
393 $item->getAnswertext(),
394 $item->getPoints(),
395 $item->getOrder(),
396 $gap->getType(),
397 ($eval->e($item->getLowerBound()) !== false && ($item->getLowerBound() ?? '') !== '')
398 ? $item->getLowerBound()
399 : $item->getAnswertext(),
400 ($eval->e($item->getUpperBound()) !== false && ($item->getUpperBound() ?? '') !== '')
401 ? $item->getUpperBound()
402 : $item->getAnswertext(),
403 $gap->getGapSize()
404 ]
405 );
406 }
getOrder()
Gets the sort/display order.
getPoints()
Gets the points.
getAnswertext()
Gets the answer text.
getLowerBound()
Returns the lower bound.
getUpperBound()
Returns the upper bound.

◆ saveClozeSelectGapRecordToDb()

assClozeTest::saveClozeSelectGapRecordToDb ( int  $next_id,
int  $key,
assAnswerCloze  $item,
assClozeGap  $gap 
)
protected

Definition at line 336 of file class.assClozeTest.php.

341 : void {
342 $this->db->manipulateF(
343 'INSERT INTO qpl_a_cloze (answer_id, question_fi, gap_id, answertext, points, aorder, cloze_type, shuffle) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
344 [
353 ],
354 [
355 $next_id,
356 $this->getId(),
357 $key,
358 $item->getAnswertext(),
359 $item->getPoints(),
360 $item->getOrder(),
361 $gap->getType(),
362 $gap->getShuffle() ? '1' : '0'
363 ]
364 );
365 }
getShuffle()
Gets the shuffle state of the items.

◆ saveClozeTextGapRecordToDb()

assClozeTest::saveClozeTextGapRecordToDb ( int  $next_id,
int  $key,
assAnswerCloze  $item,
assClozeGap  $gap 
)
protected

Definition at line 305 of file class.assClozeTest.php.

310 : void {
311 $this->db->manipulateF(
312 'INSERT INTO qpl_a_cloze (answer_id, question_fi, gap_id, answertext, points, aorder, cloze_type, gap_size) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
313 [
322 ],
323 [
324 $next_id,
325 $this->getId(),
326 $key,
327 $item->getAnswertext(),
328 $item->getPoints(),
329 $item->getOrder(),
330 $gap->getType(),
331 $gap->getGapSize()
332 ]
333 );
334 }

◆ saveToDb()

assClozeTest::saveToDb ( ?int  $original_id = null)

Reimplemented from assQuestion.

Definition at line 246 of file class.assClozeTest.php.

246 : void
247 {
251
252 parent::saveToDb();
253 }
saveAnswerSpecificDataToDb()
Saves the answer specific records into a question types answer table.
saveAdditionalQuestionDataToDb()
Saves a record to the question types additional data table.
saveQuestionDataToDb(?int $original_id=null)

◆ saveWorkingData()

assClozeTest::saveWorkingData ( int  $active_id,
?int  $pass = null,
bool  $authorized = true 
)

Reimplemented from assQuestion.

Definition at line 1068 of file class.assClozeTest.php.

1072 : bool {
1073 if (is_null($pass)) {
1074 $pass = ilObjTest::_getPass($active_id);
1075 }
1076
1077 $this->getProcessLocker()->executeUserSolutionUpdateLockOperation(
1078 function () use ($active_id, $pass, $authorized) {
1079 $this->removeCurrentSolution($active_id, $pass, $authorized);
1080
1081 foreach ($this->fetchSolutionSubmit() as $key => $value) {
1082 if ($value === null || $value === '') {
1083 continue;
1084 }
1085 $gap = $this->getGap($key);
1086 if ($gap === null
1087 || $gap->getType() === assClozeGap::TYPE_SELECT && $value === -1) {
1088 continue;
1089 }
1090 $this->saveCurrentSolution($active_id, $pass, $key, $value, $authorized);
1091 }
1092 }
1093 );
1094
1095 return true;
1096 }
saveCurrentSolution(int $active_id, int $pass, $value1, $value2, bool $authorized=true, $tstamp=0)
removeCurrentSolution(int $active_id, int $pass, bool $authorized=true)
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.

References ilObjTest\_getPass().

+ Here is the call graph for this function:

◆ setClozeText()

assClozeTest::setClozeText ( string  $cloze_text = '')

Definition at line 418 of file class.assClozeTest.php.

418 : void
419 {
420 $this->gaps = [];
421 $this->cloze_text = $this->cleanQuestiontext($cloze_text);
423 }
createGapsFromQuestiontext()
Create gap entries by parsing the question text.

◆ setClozeTextValue()

assClozeTest::setClozeTextValue (   $cloze_text = "")

Definition at line 425 of file class.assClozeTest.php.

425 : void
426 {
427 $this->cloze_text = $cloze_text;
428 }

◆ setEndTag()

assClozeTest::setEndTag (   $end_tag = "[/gap]")

Sets the end tag of a cloze gap.

Parameters
string$end_tagThe end tag for a cloze gap @access public
See also
$end_tag

Definition at line 513 of file class.assClozeTest.php.

513 : void
514 {
515 $this->end_tag = $end_tag;
516 }

◆ setFeedbackMode()

assClozeTest::setFeedbackMode (   $feedbackMode)
Parameters
string$feedbackMode

Definition at line 529 of file class.assClozeTest.php.

529 : void
530 {
531 $this->feedbackMode = $feedbackMode;
532 }

◆ setFixedTextLength()

assClozeTest::setFixedTextLength ( ?int  $fixed_text_length)

Sets a fixed text length for all text fields in the cloze question.

Parameters
integer$a_text_lenThe text field length @access public

Definition at line 1192 of file class.assClozeTest.php.

1192 : void
1193 {
1194 $this->fixed_text_length = $fixed_text_length;
1195 }

◆ setGapAnswerLowerBound()

assClozeTest::setGapAnswerLowerBound (   $gap_index,
  $order,
  $bound 
)

Sets the lower bound of a gap with a given index and an answer with a given order.

The index of the first gap is 0, the index of the second gap is 1 and so on.

Parameters
integer$gap_indexA nonnegative index of the n-th gap
integer$orderThe order of the answer text
string$answerThe lower bound of the answer @access public
See also
$gaps

Definition at line 712 of file class.assClozeTest.php.

712 : void
713 {
714 if (array_key_exists($gap_index, $this->gaps)) {
715 $this->gaps[$gap_index]->setItemLowerBound($order, $bound);
716 }
717 }

◆ setGapAnswerPoints()

assClozeTest::setGapAnswerPoints (   $gap_index,
  $order,
  $points 
)

Sets the points of a gap with a given index and an answer with a given order.

The index of the first gap is 0, the index of the second gap is 1 and so on.

Parameters
integer$gap_indexA nonnegative index of the n-th gap
integer$orderThe order of the answer text
string$answerThe points of the answer @access public
See also
$gaps

Definition at line 662 of file class.assClozeTest.php.

662 : void
663 {
664 if (array_key_exists($gap_index, $this->gaps)) {
665 $this->gaps[$gap_index]->setItemPoints($order, $points);
666 }
667 }

◆ setGapAnswerUpperBound()

assClozeTest::setGapAnswerUpperBound (   $gap_index,
  $order,
  $bound 
)

Sets the upper bound of a gap with a given index and an answer with a given order.

The index of the first gap is 0, the index of the second gap is 1 and so on.

Parameters
integer$gap_indexA nonnegative index of the n-th gap
integer$orderThe order of the answer text
string$answerThe upper bound of the answer @access public
See also
$gaps

Definition at line 729 of file class.assClozeTest.php.

729 : void
730 {
731 if (array_key_exists($gap_index, $this->gaps)) {
732 $this->gaps[$gap_index]->setItemUpperBound($order, $bound);
733 }
734 }

◆ setGapCombinations()

assClozeTest::setGapCombinations (   $value)

Definition at line 1255 of file class.assClozeTest.php.

1255 : void
1256 {
1257 $this->gap_combinations = $value;
1258 }

◆ setGapCombinationsExists()

assClozeTest::setGapCombinationsExists (   $value)

Definition at line 1250 of file class.assClozeTest.php.

1250 : void
1251 {
1252 $this->gap_combinations_exist = $value;
1253 }

◆ setGapShuffle()

assClozeTest::setGapShuffle (   $gap_index = 0,
  $shuffle = 1 
)

Sets the shuffle state of a gap with a given index.

The index of the first gap is 0, the index of the second gap is 1 and so on.

Parameters
integer$indexA nonnegative index of the n-th gap
integer$shuffleTurn shuffle on (=1) or off (=0) @access public
See also
$gaps

Definition at line 580 of file class.assClozeTest.php.

580 : void
581 {
582 if (array_key_exists($gap_index, $this->gaps)) {
583 $this->gaps[$gap_index]->setShuffle($shuffle);
584 }
585 }

◆ setGapSize()

assClozeTest::setGapSize (   $gap_index,
  $size 
)

Definition at line 645 of file class.assClozeTest.php.

645 : void
646 {
647 if (array_key_exists($gap_index, $this->gaps)) {
648 $this->gaps[$gap_index]->setGapSize((int) $size);
649 }
650 }

◆ setGapType()

assClozeTest::setGapType (   $gap_index,
  $gap_type 
)

Set the type of a gap with a given index.

@access private

Definition at line 564 of file class.assClozeTest.php.

564 : void
565 {
566 if (array_key_exists($gap_index, $this->gaps)) {
567 $this->gaps[$gap_index]->setType($gap_type);
568 }
569 }

◆ setIdenticalScoring()

assClozeTest::setIdenticalScoring ( bool  $identical_scoring)

Sets the identical scoring option for cloze questions.

Parameters
boolean$a_identical_scoringThe identical scoring option for cloze questions
See also
$identical_scoring @access public

Definition at line 1165 of file class.assClozeTest.php.

1165 : void
1166 {
1167 $this->identical_scoring = $identical_scoring;
1168 }

◆ setStartTag()

assClozeTest::setStartTag (   $start_tag = "[gap]")

Sets the start tag of a cloze gap.

Parameters
string$start_tagThe start tag for a cloze gap @access public
See also
$start_tag

Definition at line 489 of file class.assClozeTest.php.

489 : void
490 {
491 $this->start_tag = $start_tag;
492 }

◆ setTextgapRating()

assClozeTest::setTextgapRating (   $a_textgap_rating)

Sets the rating option for text gaps.

Parameters
string$a_textgap_ratingThe rating option for text gaps
See also
$textgap_rating @access public

Definition at line 1128 of file class.assClozeTest.php.

1128 : void
1129 {
1130 switch ($a_textgap_rating) {
1138 $this->textgap_rating = $a_textgap_rating;
1139 break;
1140 default:
1141 $this->textgap_rating = assClozeGap::TEXTGAP_RATING_CASEINSENSITIVE;
1142 break;
1143 }
1144 }

References assClozeGap\TEXTGAP_RATING_CASEINSENSITIVE, assClozeGap\TEXTGAP_RATING_CASESENSITIVE, assClozeGap\TEXTGAP_RATING_LEVENSHTEIN1, assClozeGap\TEXTGAP_RATING_LEVENSHTEIN2, assClozeGap\TEXTGAP_RATING_LEVENSHTEIN3, assClozeGap\TEXTGAP_RATING_LEVENSHTEIN4, and assClozeGap\TEXTGAP_RATING_LEVENSHTEIN5.

◆ solutionValuesToLog()

assClozeTest::solutionValuesToLog ( AdditionalInformationGenerator  $additional_info,
array  $solution_values 
)
protected

MUST convert the given solution values into an array or a string that can be stored in the log.

Language variables must be generated through the corresponding functions in the AdditionalInformationGenerator. If an array is returned it will be rendered into a line per array entry in the format "key: value". If the key exists as a language variable, it will be translated.

Reimplemented from assQuestion.

Definition at line 1673 of file class.assClozeTest.php.

1676 : array {
1677 $parsed_solution = [];
1678 foreach ($this->getGaps() as $gap_index => $gap) {
1679 foreach ($solution_values as $solutionvalue) {
1680 if ($gap_index !== (int) $solutionvalue['value1']) {
1681 continue;
1682 }
1683
1684 if ($gap->getType() === assClozeGap::TYPE_SELECT) {
1685 $parsed_solution[$gap_index + 1] = $gap->getItem($solutionvalue['value2'])->getAnswertext();
1686 continue;
1687 }
1688
1689 $parsed_solution[$gap_index + 1] = $solutionvalue['value2'];
1690 }
1691 }
1692 return $parsed_solution;
1693 }

References assClozeGap\getItem(), assClozeGap\getType(), and assClozeGap\TYPE_SELECT.

+ Here is the call graph for this function:

◆ solutionValuesToText()

assClozeTest::solutionValuesToText ( array  $solution_values)

MUST convert the given solution values into text.

If the text has multiple lines each line MUST be placed as an entry in an array.

Reimplemented from assQuestion.

Definition at line 1695 of file class.assClozeTest.php.

1695 : array
1696 {
1697 $parsed_solution = [];
1698 foreach ($this->getGaps() as $gap_index => $gap) {
1699 foreach ($solution_values as $solutionvalue) {
1700 if ($gap_index !== (int) $solutionvalue['value1']) {
1701 continue;
1702 }
1703
1704 if ($gap->getType() === assClozeGap::TYPE_SELECT) {
1705 $parsed_solution[] = $this->lng->txt('gap') . ' ' . $gap_index + 1 . ': '
1706 . $gap->getItem($solutionvalue['value2'])->getAnswertext();
1707 continue;
1708 }
1709
1710 $parsed_solution[] = $this->lng->txt('gap') . ' ' . $gap_index + 1 . ': '
1711 . $solutionvalue['value2'];
1712 }
1713 }
1714 return $parsed_solution;
1715 }

References assClozeGap\getItem(), assClozeGap\getType(), ILIAS\Repository\lng(), and assClozeGap\TYPE_SELECT.

+ Here is the call graph for this function:

◆ toJSON()

assClozeTest::toJSON ( )

Returns a JSON representation of the question.

Reimplemented from assQuestion.

Definition at line 1274 of file class.assClozeTest.php.

1274 : string
1275 {
1276 $result = [
1277 'id' => $this->getId(),
1278 'type' => (string) $this->getQuestionType(),
1279 'title' => $this->getTitleForHTMLOutput(),
1280 'question' => $this->formatSAQuestion($this->getQuestion()),
1281 'clozetext' => $this->formatSAQuestion($this->getClozeText()),
1282 'nr_of_tries' => $this->getNrOfTries(),
1283 'shuffle' => $this->getShuffle(),
1284 'feedback' => [
1285 'onenotcorrect' => $this->formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(), false)),
1286 'allcorrect' => $this->formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(), true))
1287 ]
1288 ];
1289
1290 $gaps = [];
1291 foreach ($this->getGaps() as $key => $gap) {
1292 $items = [];
1293 foreach ($gap->getItems($this->getShuffler()) as $item) {
1294 $jitem = [];
1295 $jitem['points'] = $item->getPoints();
1296 $jitem['value'] = $this->formatSAQuestion($item->getAnswertext());
1297 $jitem['order'] = $item->getOrder();
1298 if ($gap->getType() == assClozeGap::TYPE_NUMERIC) {
1299 $jitem['lowerbound'] = $item->getLowerBound();
1300 $jitem['upperbound'] = $item->getUpperBound();
1301 } else {
1302 $jitem['value'] = trim($jitem['value']);
1303 }
1304 array_push($items, $jitem);
1305 }
1306
1307 if ($gap->getGapSize() && ($gap->getType() == assClozeGap::TYPE_TEXT || $gap->getType() == assClozeGap::TYPE_NUMERIC)) {
1308 $jgap['size'] = $gap->getGapSize();
1309 }
1310
1311 $jgap['shuffle'] = $gap->getShuffle();
1312 $jgap['type'] = $gap->getType();
1313 $jgap['item'] = $items;
1314
1315 array_push($gaps, $jgap);
1316 }
1317 $result['gaps'] = $gaps;
1318 $mobs = ilObjMediaObject::_getMobsOfObject("qpl:html", $this->getId());
1319 $result['mobs'] = $mobs;
1320 return json_encode($result);
1321 }
getQuestionType()
Returns the question type of the question.
static _getMobsOfObject(string $a_type, int $a_id, int|false $a_usage_hist_nr=0, string $a_lang="-")

References ilObjMediaObject\_getMobsOfObject(), assClozeGap\getGapSize(), ILIAS\Survey\Mode\getId(), assClozeGap\getItems(), assClozeGap\getShuffle(), assClozeGap\getType(), assClozeGap\TYPE_NUMERIC, and assClozeGap\TYPE_TEXT.

+ Here is the call graph for this function:

◆ toLog()

assClozeTest::toLog ( AdditionalInformationGenerator  $additional_info)

MUST return an array of the question settings that can be stored in the log.

Language variables must be generated through the corresponding functions in the AdditionalInformationGenerator. If an array is returned it will be rendered into a line per array entry in the format "key: value". If the key exists as a language variable, it will be translated.

Reimplemented from assQuestion.

Definition at line 1629 of file class.assClozeTest.php.

1629 : array
1630 {
1631 $result = [
1632 AdditionalInformationGenerator::KEY_QUESTION_TYPE => (string) $this->getQuestionType(),
1633 AdditionalInformationGenerator::KEY_QUESTION_TITLE => $this->getTitleForHTMLOutput(),
1634 AdditionalInformationGenerator::KEY_QUESTION_TEXT => $this->formatSAQuestion($this->getQuestion()),
1635 AdditionalInformationGenerator::KEY_QUESTION_CLOZE_CLOZETEXT => $this->formatSAQuestion($this->getClozeText()),
1636 AdditionalInformationGenerator::KEY_QUESTION_SHUFFLE_ANSWER_OPTIONS => $additional_info
1638 AdditionalInformationGenerator::KEY_FEEDBACK => [
1639 AdditionalInformationGenerator::KEY_QUESTION_FEEDBACK_ON_INCOMPLETE => $this->formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(), false)),
1640 AdditionalInformationGenerator::KEY_QUESTION_FEEDBACK_ON_COMPLETE => $this->formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(), true))
1641 ]
1642 ];
1643
1644 $gaps = [];
1645 foreach ($this->getGaps() as $gap_index => $gap) {
1646 $items = [];
1647 foreach ($gap->getItems($this->getShuffler()) as $item) {
1648 $item_array = [
1649 AdditionalInformationGenerator::KEY_QUESTION_REACHABLE_POINTS => $item->getPoints(),
1650 AdditionalInformationGenerator::KEY_QUESTION_ANSWER_OPTION => $this->formatSAQuestion($item->getAnswertext()),
1651 AdditionalInformationGenerator::KEY_QUESTION_ANSWER_OPTION_ORDER => $item->getOrder()
1652 ];
1653 if ($gap->getType() === assClozeGap::TYPE_NUMERIC) {
1654 $item_array[AdditionalInformationGenerator::KEY_QUESTION_LOWER_LIMIT] = $item->getLowerBound();
1655 $item_array[AdditionalInformationGenerator::KEY_QUESTION_UPPER_LIMIT] = $item->getUpperBound();
1656 }
1657 array_push($items, $item_array);
1658 }
1659
1660 $gap_array[AdditionalInformationGenerator::KEY_QUESTION_TEXTSIZE] = $gap->getGapSize();
1661 $gap_array[AdditionalInformationGenerator::KEY_QUESTION_SHUFFLE_ANSWER_OPTIONS] = $additional_info->getTrueFalseTagForBool(
1662 $gap->getShuffle()
1663 );
1664 $gap_array[AdditionalInformationGenerator::KEY_QUESTION_CLOZE_GAP_TYPE] = $gap->getType();
1665 $gap_array[AdditionalInformationGenerator::KEY_QUESTION_ANSWER_OPTIONS] = $items;
1666
1667 $gaps[$gap_index + 1] = $gap_array;
1668 }
1669 $result[AdditionalInformationGenerator::KEY_QUESTION_CLOZE_GAPS] = $gaps;
1670 return $result;
1671 }

References assClozeGap\getGapSize(), assClozeGap\getItems(), assClozeGap\getShuffle(), ILIAS\Test\Logging\AdditionalInformationGenerator\getTrueFalseTagForBool(), assClozeGap\getType(), and assClozeGap\TYPE_NUMERIC.

+ Here is the call graph for this function:

◆ updateClozeTextFromGaps()

assClozeTest::updateClozeTextFromGaps ( )

Updates the gap parameters in the cloze text from the form input.

@access private

Definition at line 808 of file class.assClozeTest.php.

808 : void
809 {
810 $output = $this->getClozeText();
811 foreach ($this->getGaps() as $gap_index => $gap) {
812 $answers = [];
813 foreach ($gap->getItemsRaw() as $item) {
814 array_push($answers, str_replace([',', '['], ["\\,", '[&hairsp;'], $item->getAnswerText()));
815 }
816 // fau: fixGapReplace - use replace function
817 $output = $this->replaceFirstGap($output, "[_gap]" . ilLegacyFormElementsUtil::prepareTextareaOutput(join(",", $answers), true) . "[/_gap]");
818 // fau.
819 }
820 $output = str_replace("_gap]", "gap]", $output);
821 $this->cloze_text = $output;
822 }

References assClozeGap\getItemsRaw(), and ilLegacyFormElementsUtil\prepareTextareaOutput().

+ Here is the call graph for this function:

Field Documentation

◆ $cloze_text

string assClozeTest::$cloze_text = ''
protected

Definition at line 77 of file class.assClozeTest.php.

◆ $end_tag

string assClozeTest::$end_tag = '[/gap]'
private

Definition at line 56 of file class.assClozeTest.php.

◆ $feedbackMode

assClozeTest::$feedbackMode = ilAssClozeTestFeedback::FB_MODE_GAP_QUESTION
protected

Definition at line 79 of file class.assClozeTest.php.

◆ $feedbackOBJ

ilAssQuestionFeedback assClozeTest::$feedbackOBJ

Definition at line 78 of file class.assClozeTest.php.

◆ $fixed_text_length

int assClozeTest::$fixed_text_length = null
protected

Definition at line 76 of file class.assClozeTest.php.

◆ $gap_combinations

assClozeTest::$gap_combinations = []
protected

Definition at line 53 of file class.assClozeTest.php.

◆ $gap_combinations_exist

bool assClozeTest::$gap_combinations_exist = false
protected

Definition at line 54 of file class.assClozeTest.php.

◆ $gaps

array assClozeTest::$gaps = []

Definition at line 44 of file class.assClozeTest.php.

◆ $identical_scoring

bool assClozeTest::$identical_scoring = true
protected

Defines the scoring for "identical solutions".

If the learner selects the same solution twice or more in different gaps, only the first choice will be scored if identical_scoring is 0.

Definition at line 75 of file class.assClozeTest.php.

◆ $randomGroup

RandomGroup assClozeTest::$randomGroup
private

Definition at line 80 of file class.assClozeTest.php.

◆ $start_tag

string assClozeTest::$start_tag = '[gap]'
private

Definition at line 55 of file class.assClozeTest.php.

◆ $textgap_rating

string assClozeTest::$textgap_rating = assClozeGap::TEXTGAP_RATING_CASEINSENSITIVE

The rating option for text gaps.

This could contain one of the following options:

  • case insensitive text gaps
  • case sensitive text gaps
  • various levenshtein distances

Definition at line 66 of file class.assClozeTest.php.


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