ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
assClozeTest Class Reference

Class for cloze tests. More...

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

Public Member Functions

 __construct ( $title="", $comment="", $author="", $owner=-1, $question="")
 assClozeTest constructor More...
 
 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 ($gaptext, $content)
 Replace the first gap in a string without treating backreferences. More...
 
 loadFromDb ($question_id)
 Loads a assClozeTest object from a database. More...
 
 saveToDb ($original_id="")
 Saves a assClozeTest object to a database. More...
 
 saveAnswerSpecificDataToDb ()
 Save all gaps to the database. More...
 
 saveAdditionalQuestionDataToDb ()
 Saves the data for the additional data table. More...
 
 getGaps ()
 Returns the array of gaps. More...
 
 flushGaps ()
 Deletes all gaps without changing the cloze text. More...
 
 setClozeText ($cloze_text="")
 Evaluates the text gap solutions from the cloze text. More...
 
 setClozeTextValue ($cloze_text="")
 
 getClozeText ()
 Returns the cloze text. 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 ($gap_index=0)
 Returns the gap at a given index. More...
 
 setGapSize ($gap_index, $order, $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...
 
 duplicate ($for_test=true, $title="", $author="", $owner="", $testObjId=null)
 Duplicates an assClozeTest. More...
 
 copyObject ($target_questionpool_id, $title="")
 Copies an assClozeTest object. More...
 
 createNewOriginalFromThisDuplicate ($targetParentId, $targetQuestionTitle="")
 
 copyGapCombination ($orgID, $newID)
 
 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 ($value)
 
 calculateReachedPoints ($active_id, $pass=null, $authorized=true, $returndetails=false)
 Returns the points, a learner has reached answering the question. More...
 
 validateSolutionSubmit ()
 
 fetchSolutionSubmit ($submit)
 
 getSolutionSubmitValidation ()
 
 getSolutionSubmit ()
 
 saveWorkingData ($active_id, $pass=null, $authorized=true)
 Saves the learners input of the question to the database. More...
 
 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 ($a_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 ()
 Returns the name of the answer table in the database. More...
 
 setFixedTextLength ($a_text_len)
 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)
 
 setExportDetailsXLS ($worksheet, $startrow, $active_id, $pass)
 {Creates an Excel worksheet for the detailed cumulated results of this question.
Parameters
object$worksheetReference to the parent excel worksheet
object$startrowStartrow of the output in the excel worksheet
object$active_idActive id of the participant
object$passTest pass
Returns
object
} More...
 
 toJSON ()
 Returns a JSON representation of the question. More...
 
 getOperators ($expression)
 Get all available operations for a specific question. More...
 
 getExpressionTypes ()
 Get all available expression types for a specific question. 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 $previewSession)
 
 fetchAnswerValueForGap ($userSolution, $gapIndex)
 
 isAddableAnswerOptionValue ($qIndex, $answerOptionValue)
 
 addAnswerOptionValue ($qIndex, $answerOptionValue, $points)
 
 savePartial ()
 
- Public Member Functions inherited from assQuestion
 __construct ( $title="", $comment="", $author="", $owner=-1, $question="")
 assQuestion constructor More...
 
 getShuffler ()
 
 setShuffler (ilArrayElementShuffler $shuffler)
 
 setProcessLocker ($processLocker)
 
 getProcessLocker ()
 
 fromXML (&$item, &$questionpool_id, &$tst_id, &$tst_object, &$question_counter, &$import_mapping)
 Receives parameters from a QTI parser and creates a valid ILIAS question object. More...
 
 toXML ($a_include_header=true, $a_include_binary=true, $a_shuffle=false, $test_output=false, $force_image_references=false)
 Returns a QTI xml representation of the question. More...
 
 isComplete ()
 Returns true, if a question is complete for use. More...
 
 questionTitleExists ($questionpool_id, $title)
 Returns TRUE if the question title exists in the database. More...
 
 setTitle ($title="")
 Sets the title string of the assQuestion object. More...
 
 setId ($id=-1)
 Sets the id of the assQuestion object. More...
 
 setTestId ($id=-1)
 Sets the test id of the assQuestion object. More...
 
 setComment ($comment="")
 Sets the comment string of the assQuestion object. More...
 
 setOutputType ($outputType=OUTPUT_HTML)
 Sets the output type. More...
 
 setShuffle ($shuffle=true)
 Sets the shuffle flag. More...
 
 setEstimatedWorkingTime ($hour=0, $min=0, $sec=0)
 Sets the estimated working time of a question from given hour, minute and second. More...
 
 setEstimatedWorkingTimeFromDurationString ($durationString)
 Sets the estimated working time of a question from a given datetime string. More...
 
 keyInArray ($searchkey, $array)
 returns TRUE if the key occurs in an array More...
 
 setAuthor ($author="")
 Sets the authors name of the assQuestion object. More...
 
 setOwner ($owner="")
 Sets the creator/owner ID of the assQuestion object. More...
 
 getTitle ()
 Gets the title string of the assQuestion object. More...
 
 getTitleFilenameCompliant ()
 returns the object title prepared to be used as a filename More...
 
 getId ()
 Gets the id of the assQuestion object. More...
 
 getShuffle ()
 Gets the shuffle flag. More...
 
 getTestId ()
 Gets the test id of the assQuestion object. More...
 
 getComment ()
 Gets the comment string of the assQuestion object. More...
 
 getOutputType ()
 Gets the output type. More...
 
 supportsJavascriptOutput ()
 Returns true if the question type supports JavaScript output. More...
 
 supportsNonJsOutput ()
 
 requiresJsSwitch ()
 
 getEstimatedWorkingTime ()
 Gets the estimated working time of a question. More...
 
 getAuthor ()
 Gets the authors name of the assQuestion object. More...
 
 getOwner ()
 Gets the creator/owner ID of the assQuestion object. More...
 
 getObjId ()
 Get the object id of the container object. More...
 
 setObjId ($obj_id=0)
 Set the object id of the container object. More...
 
 setExternalId ($external_id)
 
 getExternalId ()
 
 getSuggestedSolutionOutput ()
 
_getSuggestedSolution ($question_id, $subquestion_index=0)
 Returns a suggested solution for a given subquestion index. More...
 
 getSuggestedSolutions ()
 Return the suggested solutions. More...
 
 getReachedPoints ($active_id, $pass=null)
 Returns the points, a learner has reached answering the question This is the fast way to get the points directly from the database. More...
 
 getMaximumPoints ()
 Returns the maximum points, a learner can reach answering the question. More...
 
 getAdjustedReachedPoints ($active_id, $pass=null, $authorizedSolution=true)
 returns the reached points ... More...
 
 calculateResultsFromSolution ($active_id, $pass=null, $obligationsEnabled=false)
 Calculates the question results from a previously saved question solution. More...
 
 persistWorkingState ($active_id, $pass=null, $obligationsEnabled=false, $authorized=true)
 persists the working state for current testactive and testpass More...
 
 persistPreviewState (ilAssQuestionPreviewSession $previewSession)
 persists the preview state for current user and question More...
 
 validateSolutionSubmit ()
 
 saveWorkingData ($active_id, $pass=null, $authorized=true)
 Saves the learners input of the question to the database. More...
 
 moveUploadedMediaFile ($file, $name)
 Move an uploaded media file to an public accessible temp dir to present it. More...
 
 getSuggestedSolutionPath ()
 Returns the path for a suggested solution. More...
 
 getJavaPath ()
 Returns the image path for web accessable images of a question. More...
 
 getImagePath ($question_id=null, $object_id=null)
 Returns the image path for web accessable images of a question. More...
 
 buildImagePath ($questionId, $parentObjectId)
 
 getFlashPath ()
 Returns the image path for web accessable flash files of a question. More...
 
 getJavaPathWeb ()
 Returns the web image path for web accessable java applets of a question. More...
 
 getSuggestedSolutionPathWeb ()
 Returns the web path for a suggested solution. More...
 
 getImagePathWeb ()
 Returns the web image path for web accessable images of a question. More...
 
 getFlashPathWeb ()
 Returns the web image path for web accessable flash applications of a question. More...
 
 getTestOutputSolutions ($activeId, $pass)
 
 getUserSolutionPreferingIntermediate ($active_id, $pass=null)
 
 getSolutionValues ($active_id, $pass=null, $authorized=true)
 Loads solutions of a given user from the database an returns it. More...
 
 isInUse ($question_id="")
 Checks whether the question is in use or not. More...
 
 isClone ($question_id="")
 Checks whether the question is a clone of another question or not. More...
 
 pcArrayShuffle ($array)
 Shuffles the values of a given array. More...
 
 getAdditionalTableName ()
 Returns the name of the additional question data table in the database. More...
 
 getAnswerTableName ()
 Returns the name of the answer table in the database. More...
 
 deleteAnswers ($question_id)
 Deletes datasets from answers tables. More...
 
 deleteAdditionalTableData ($question_id)
 Deletes datasets from the additional question table in the database. More...
 
 delete ($question_id)
 Deletes a question and all materials from the database. More...
 
 getTotalAnswers ()
 get total number of answers More...
 
 _getTotalAnswers ($a_q_id)
 get number of answers for question id (static) note: do not use $this inside this method More...
 
 copyXHTMLMediaObjectsOfQuestion ($a_q_id)
 
 syncXHTMLMediaObjectsOfQuestion ()
 
 createPageObject ()
 create page object of question More...
 
 copyPageOfQuestion ($a_q_id)
 
 getPageOfQuestion ()
 
 setOriginalId ($original_id)
 
 getOriginalId ()
 
 fixSvgToPng ($imageFilenameContainingString)
 
 fixUnavailableSkinImageSources ($html)
 
 loadFromDb ($question_id)
 Loads the question from the database. More...
 
 createNewQuestion ($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 ($original_id="")
 
 saveToDb ($original_id="")
 Saves the question to the database. More...
 
 setNewOriginalId ($newId)
 
 deleteSuggestedSolutions ()
 Deletes all suggestes solutions in the database. More...
 
 getSuggestedSolution ($subquestion_index=0)
 Returns a suggested solution for a given subquestion index. More...
 
 getSuggestedSolutionTitle ($subquestion_index=0)
 Returns the title of a suggested solution at a given subquestion_index. More...
 
 setSuggestedSolution ($solution_id="", $subquestion_index=0, $is_import=false)
 Sets a suggested solution for the question. More...
 
 _resolveInternalLink ($internal_link)
 
 _resolveIntLinks ($question_id)
 
 syncWithOriginal ()
 
 createRandomSolution ($test_id, $user_id)
 
 _questionExists ($question_id)
 Returns true if the question already exists in the database. More...
 
 _questionExistsInPool ($question_id)
 Returns true if the question already exists in the database and is assigned to a question pool. More...
 
 getPoints ()
 Returns the maximum available points for the question. More...
 
 setPoints ($a_points)
 Sets the maximum available points for the question. More...
 
 getSolutionMaxPass ($active_id)
 Returns the maximum pass a users question solution. More...
 
 calculateReachedPoints ($active_id, $pass=null, $authorizedSolution=true, $returndetails=false)
 Returns the points, a learner has reached answering the question. More...
 
 deductHintPointsFromReachedPoints (ilAssQuestionPreviewSession $previewSession, $reachedPoints)
 
 calculateReachedPointsFromPreviewSession (ilAssQuestionPreviewSession $previewSession)
 
 isPreviewSolutionCorrect (ilAssQuestionPreviewSession $previewSession)
 
 adjustReachedPointsByScoringOptions ($points, $active_id, $pass=null)
 Adjust the given reached points by checks for all special scoring options in the test container. More...
 
 isHTML ($a_text)
 Checks if a given string contains HTML or not. More...
 
 prepareTextareaOutput ($txt_output, $prepare_for_latex_output=false, $omitNl2BrWhenTextArea=false)
 Prepares a string for a text area output in tests. More...
 
 QTIMaterialToString ($a_material)
 Reads an QTI material tag an creates a text string. More...
 
 addQTIMaterial (&$a_xml_writer, $a_material, $close_material_tag=true, $add_mobs=true)
 Creates a QTI material tag from a plain text or xhtml text. More...
 
 buildHashedImageFilename ($plain_image_filename, $unique=false)
 
 getQuestion ()
 Gets the question string of the question object. More...
 
 setQuestion ($question="")
 Sets the question string of the question object. More...
 
 getQuestionType ()
 Returns the question type of the question. More...
 
 getQuestionTypeID ()
 Returns the question type of the question. More...
 
 cleanupMediaObjectUsage ()
 synchronises appearances of media objects in the question with media object usage table More...
 
getInstances ()
 Gets all instances of the question. More...
 
 getActiveUserData ($active_id)
 Returns the user id and the test id for a given active id. More...
 
 setExportDetailsXLS ($worksheet, $startrow, $active_id, $pass)
 Creates an Excel worksheet for the detailed cumulated results of this question. More...
 
 __get ($value)
 Object getter. More...
 
 __set ($key, $value)
 Object setter. More...
 
 getNrOfTries ()
 
 setNrOfTries ($a_nr_of_tries)
 
 setExportImagePath ($a_path)
 
 formatSAQuestion ($a_q)
 Format self assessment question. More...
 
 setPreventRteUsage ($a_val)
 Set prevent rte usage. More...
 
 getPreventRteUsage ()
 Get prevent rte usage. More...
 
 migrateContentForLearningModule (ilAssSelfAssessmentMigrator $migrator)
 
 setSelfAssessmentEditingMode ($a_selfassessmenteditingmode)
 Set Self-Assessment Editing Mode. More...
 
 getSelfAssessmentEditingMode ()
 Get Self-Assessment Editing Mode. More...
 
 setDefaultNrOfTries ($a_defaultnroftries)
 Set Default Nr of Tries. More...
 
 getDefaultNrOfTries ()
 Get Default Nr of Tries. More...
 
 syncSkillAssignments ($srcParentId, $srcQuestionId, $trgParentId, $trgQuestionId)
 
 isAnswered ($active_id, $pass=null)
 returns boolean wether the question is answered during test pass or not More...
 
 isAutosaveable ()
 
 getAdditionalContentEditingMode ()
 getter for additional content editing mode for this question More...
 
 setAdditionalContentEditingMode ($additinalContentEditingMode)
 setter for additional content editing mode for this question More...
 
 isAdditionalContentEditingModePageObject ()
 isser for additional "pageobject" content editing mode More...
 
 isValidAdditionalContentEditingMode ($additionalContentEditingMode)
 returns the fact wether the passed additional content mode is valid or not More...
 
 getValidAdditionalContentEditingModes ()
 getter for valid additional content editing modes More...
 
 addQuestionChangeListener (ilQuestionChangeListener $listener)
 
 getQuestionChangeListeners ()
 
 getHtmlUserSolutionPurifier ()
 
 getHtmlQuestionContentPurifier ()
 
 setLastChange ($lastChange)
 
 getLastChange ()
 
 removeIntermediateSolution ($active_id, $pass)
 
 removeCurrentSolution ($active_id, $pass, $authorized=true)
 
 saveCurrentSolution ($active_id, $pass, $value1, $value2, $authorized=true, $tstamp=null)
 
 updateCurrentSolution ($solutionId, $value1, $value2, $authorized=true)
 
 updateCurrentSolutionsAuthorization ($activeId, $pass, $authorized, $keepTime=false)
 
 setStep ($step)
 
 getStep ()
 
 toJSON ()
 
 duplicate ($for_test=true, $title="", $author="", $owner="", $testObjId=null)
 
 intermediateSolutionExists ($active_id, $pass)
 
 authorizedSolutionExists ($active_id, $pass)
 
 authorizedOrIntermediateSolutionExists ($active_id, $pass)
 
 isAddableAnswerOptionValue ($qIndex, $answerOptionValue)
 
 addAnswerOptionValue ($qIndex, $answerOptionValue, $points)
 
 removeAllExistingSolutions ()
 
 removeExistingSolutions ($activeId, $pass)
 
 resetUsersAnswer ($activeId, $pass)
 
 removeResultRecord ($activeId, $pass)
 
 fetchValuePairsFromIndexedValues (array $indexedValues)
 
 fetchIndexedValuesFromValuePairs (array $valuePairs)
 
 areObligationsToBeConsidered ()
 
 setObligationsToBeConsidered ($obligationsToBeConsidered)
 
 updateTimestamp ()
 
 getTestPresentationConfig ()
 Get the test question configuration (initialised once) More...
 
 savePartial ()
 
 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 ($expression)
 Get all available operations for a specific question. More...
 
 getExpressionTypes ()
 Get all available expression types for a specific question. More...
 
 getUserQuestionResult ($active_id, $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...
 

Data Fields

 $gaps
 
 $gap_combinations
 
 $gap_combinations_exists
 
 $start_tag
 
 $end_tag
 
 $textgap_rating
 
 $identical_scoring
 
 $fixedTextLength
 
 $cloze_text
 
 $feedbackOBJ
 
- Data Fields inherited from assQuestion
const IMG_MIME_TYPE_JPG = 'image/jpeg'
 
const IMG_MIME_TYPE_PNG = 'image/png'
 
const IMG_MIME_TYPE_GIF = 'image/gif'
 
const ADDITIONAL_CONTENT_EDITING_MODE_DEFAULT = 'default'
 constant for additional content editing mode "default" More...
 
const ADDITIONAL_CONTENT_EDITING_MODE_PAGE_OBJECT = 'pageobject'
 constant for additional content editing mode "pageobject" More...
 
 $feedbackOBJ = null
 
 $prevent_rte_usage = false
 
 $selfassessmenteditingmode = false
 
 $defaultnroftries = 0
 
 $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 ($gap, $key)
 Save all items belonging to one cloze gap to the db. More...
 
 saveClozeTextGapRecordToDb ($next_id, $key, $item, $gap)
 Saves a gap-item record. More...
 
 saveClozeSelectGapRecordToDb ($next_id, $key, $item, $gap)
 Saves a gap-item record. More...
 
 saveClozeNumericGapRecordToDb ($next_id, $key, $item, $gap)
 Saves a gap-item record. More...
 
 isValidNumericSubmitValue ($submittedValue)
 
 lmMigrateQuestionTypeSpecificContent (ilAssSelfAssessmentMigrator $migrator)
 
 calculateReachedPointsForSolution ($user_result, &$detailed=null)
 
- Protected Member Functions inherited from assQuestion
 getQuestionAction ()
 
 isNonEmptyItemListPostSubmission ($postSubmissionFieldname)
 
 ensureCurrentTestPass ($active_id, $pass)
 
 lookupCurrentTestPass ($active_id, $pass)
 
 lookupTestId ($active_id)
 
 log ($active_id, $langVar)
 
 savePreviewData (ilAssQuestionPreviewSession $previewSession)
 
 deletePageOfQuestion ($question_id)
 Deletes the page object of a question with a given ID. More...
 
 onDuplicate ($originalParentId, $originalQuestionId, $duplicateParentId, $duplicateQuestionId)
 Will be called when a question is duplicated (inside a question pool or for insertion in a test) More...
 
 beforeSyncWithOriginal ($origQuestionId, $dupQuestionId, $origParentObjId, $dupParentObjId)
 
 afterSyncWithOriginal ($origQuestionId, $dupQuestionId, $origParentObjId, $dupParentObjId)
 
 onCopy ($sourceParentId, $sourceQuestionId, $targetParentId, $targetQuestionId)
 Will be called when a question is copied (into another question pool) More...
 
 duplicateSuggestedSolutionFiles ($parent_id, $question_id)
 Duplicates the files of a suggested solution if the question is duplicated. More...
 
 syncSuggestedSolutionFiles ($original_id)
 Syncs the files of a suggested solution if the question is synced. More...
 
 copySuggestedSolutionFiles ($source_questionpool_id, $source_question_id)
 
 ensureNonNegativePoints ($points)
 
 getRTETextWithMediaObjects ()
 Collects all text in the question which could contain media objects which were created with the Rich Text Editor. More...
 
 getSelfAssessmentFormatter ()
 
 lmMigrateQuestionTypeGenericContent (ilAssSelfAssessmentMigrator $migrator)
 
 lmMigrateQuestionTypeSpecificContent (ilAssSelfAssessmentMigrator $migrator)
 
 duplicateQuestionHints ($originalQuestionId, $duplicateQuestionId)
 
 duplicateSkillAssignments ($srcParentId, $srcQuestionId, $trgParentId, $trgQuestionId)
 
 buildQuestionDataQuery ()
 
 getCurrentSolutionResultSet ($active_id, $pass, $authorized=true)
 Get a restulset for the current user solution for a this question by active_id and pass. More...
 
 removeSolutionRecordById ($solutionId)
 
 getSolutionRecordById ($solutionId)
 
 deleteDummySolutionRecord ($activeId, $passIndex)
 
 isDummySolutionRecord ($solutionRecord)
 
 deleteSolutionRecordByValues ($activeId, $passIndex, $authorized, $matchValues)
 
 duplicateIntermediateSolutionAuthorized ($activeId, $passIndex)
 
 forceExistingIntermediateSolution ($activeId, $passIndex, $considerDummyRecordCreation)
 
 buildTestPresentationConfig ()
 build basic test question configuration instance More...
 

Protected Attributes

 $feedbackMode = ilAssClozeTestFeedback::FB_MODE_GAP_QUESTION
 
- Protected Attributes inherited from assQuestion
 $id
 
 $title
 
 $comment
 
 $owner
 
 $author
 
 $question
 
 $points
 
 $est_working_time
 
 $shuffle
 
 $test_id
 
 $obj_id
 
 $ilias
 
 $tpl
 
 $lng
 
 $db
 
 $outputType = OUTPUT_JAVASCRIPT
 
 $suggested_solutions
 
 $original_id
 
 $page
 
 $external_id = ''
 
 $questionChangeListeners = array()
 
 $processLocker
 
 $step = null
 
 $lastChange
 
 $shuffler
 
 $testQuestionConfig
 

Additional Inherited Members

- Static Public Member Functions inherited from assQuestion
static setForcePassResultUpdateEnabled ($forcePassResultsUpdateEnabled)
 
static isForcePassResultUpdateEnabled ()
 
static isAllowedImageMimeType ($mimeType)
 
static fetchMimeTypeIdentifier ($contentTypeString)
 
static getAllowedFileExtensionsForMimeType ($mimeType)
 
static isAllowedImageFileExtension ($mimeType, $fileExtension)
 
static getAllowedImageMaterialFileExtensions ()
 
static _getMaximumPoints ($question_id)
 Returns the maximum points, a learner can reach answering the question. More...
 
static _getQuestionInfo ($question_id)
 Returns question information from the database. More...
 
static _getSuggestedSolutionCount ($question_id)
 Returns the number of suggested solutions associated with a question. More...
 
static _getSuggestedSolutionOutput ($question_id)
 Returns the output of the suggested solution. More...
 
static _getReachedPoints ($active_id, $question_id, $pass=null)
 Returns the points, a learner has reached answering the question. More...
 
static _updateTestResultCache ($active_id, ilAssQuestionProcessLocker $processLocker=null)
 @TODO Move this to a proper place. More...
 
static logAction ($logtext="", $active_id="", $question_id="")
 Logs an action into the Test&Assessment log. More...
 
static getQuestionTypeFromDb ($question_id)
 get question type for question id More...
 
static _getTotalRightAnswers ($a_q_id)
 get number of answers for question id (static) note: do not use $this inside this method More...
 
static _getTitle ($a_q_id)
 Returns the title of a question. More...
 
static _getQuestionText ($a_q_id)
 Returns question text. More...
 
static isFileAvailable ($file)
 
static _getQuestionType ($question_id)
 Returns the question type of a question with a given id. More...
 
static _getQuestionTitle ($question_id)
 Returns the question title of a question with a given id. More...
 
static saveOriginalId ($questionId, $originalId)
 
static resetOriginalId ($questionId)
 
static _getInternalLinkHref ($target="")
 
static _getOriginalId ($question_id)
 Returns the original id of a question. More...
 
static originalQuestionExists ($questionId)
 
static _instanciateQuestion ($question_id)
 Creates an instance of a question with a given question id. More...
 
static _instantiateQuestion ($question_id)
 
static _getSolutionMaxPass ($question_id, $active_id)
 Returns the maximum pass a users question solution. More...
 
static _isWriteable ($question_id, $user_id)
 Returns true if the question is writeable by a certain user. More...
 
static _isUsedInRandomTest ($question_id="")
 Checks whether the question is used in a random test or not. More...
 
static _isWorkedThrough ($active_id, $question_id, $pass=null)
 Returns true if the question was worked through in the given pass Worked through means that the user entered at least one value. More...
 
static _areAnswered ($a_user_id, $a_question_ids)
 Checks if an array of question ids is answered by an user or not. More...
 
static _setReachedPoints ($active_id, $question_id, $points, $maxpoints, $pass, $manualscoring, $obligationsEnabled)
 Sets the points, a learner has reached answering the question Additionally objective results are updated. More...
 
static _needsManualScoring ($question_id)
 
static _includeClass ($question_type, $gui=0)
 Include the php class file for a given question type. More...
 
static getGuiClassNameByQuestionType ($questionType)
 
static getObjectClassNameByQuestionType ($questionType)
 
static getFeedbackClassNameByQuestionType ($questionType)
 
static isCoreQuestionType ($questionType)
 
static includeCoreClass ($questionType, $withGuiClass)
 
static includePluginClass ($questionType, $withGuiClass)
 
static _getQuestionTypeName ($type_tag)
 Return the translation for a given question type tag. More...
 
static & _instanciateQuestionGUI ($question_id)
 Creates an instance of a question gui with a given question id. More...
 
static instantiateQuestionGUI ($a_question_id)
 Creates an instance of a question gui with a given question id. More...
 
static _questionExistsInTest ($question_id, $test_id)
 
static lookupParentObjId ($questionId)
 @global ilDBInterface $ilDB More...
 
static lookupOriginalParentObjId ($originalQuestionId)
 returns the parent object id for given original question id (should be a qpl id, but theoretically it can be a tst id, too) More...
 
static isObligationPossible ($questionId)
 returns boolean wether it is possible to set this question type as obligatory or not considering the current question configuration More...
 
static implodeKeyValues ($keyValues)
 
static explodeKeyValues ($keyValues)
 
static setResultGateway ($resultGateway)
 
static getResultGateway ()
 
static sumTimesInISO8601FormatH_i_s_Extended ($time1, $time2)
 
static convertISO8601FormatH_i_s_ExtendedToSeconds ($time)
 
static missingResultRecordExists ($activeId, $pass, $questionIds)
 
static getQuestionsMissingResultRecord ($activeId, $pass, $questionIds)
 
static lookupResultRecordExist ($activeId, $questionId, $pass)
 
- Static Protected Member Functions inherited from assQuestion
static getNumExistingSolutionRecords ($activeId, $pass, $questionId)
 returns the number of existing solution records for the given test active / pass and given question id More...
 
static getKeyValuesImplosionSeparator ()
 
- Static Protected Attributes inherited from assQuestion
static $allowedFileExtensionsByMimeType
 
static $allowedCharsetsByMimeType
 
static $allowedImageMaterialFileExtensionsByMimeType
 
static $forcePassResultsUpdateEnabled = 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 24 of file class.assClozeTest.php.

Constructor & Destructor Documentation

◆ __construct()

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

assClozeTest constructor

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

Parameters
string$titleA title string to describe the question
string$commentA comment string to describe the question
string$authorA string containing the name of the questions author
integer$ownerA numerical ID to identify the owner/creator
string$question
Returns
\assClozeTest

Reimplemented from assQuestion.

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

123 {
124 parent::__construct($title, $comment, $author, $owner, $question);
125 $this->start_tag = "[gap]";
126 $this->end_tag = "[/gap]";
127 $this->gaps = array();
128 $this->setQuestion($question); // @TODO: Should this be $question?? See setter for why this is not trivial.
129 $this->fixedTextLength = "";
130 $this->identical_scoring = 1;
131 $this->gap_combinations_exists = false;
132 $this->gap_combinations = array();
133 }
setQuestion($question="")
Sets the question string of the question object.

References assQuestion\$author, assQuestion\$comment, assQuestion\$owner, assQuestion\$question, assQuestion\$title, and assQuestion\setQuestion().

+ Here is the call graph for this function:

Member Function Documentation

◆ addAnswerOptionValue()

assClozeTest::addAnswerOptionValue (   $qIndex,
  $answerOptionValue,
  $points 
)

Reimplemented from assQuestion.

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

1992 {
1993 $gap = $this->getGap($qIndex); /* @var assClozeGap $gap */
1994
1995 $item = new assAnswerCloze($answerOptionValue, $points);
1996 $item->setOrder($gap->getItemCount());
1997
1998 $gap->addItem($item);
1999 }
Class for cloze question numeric answers.
getGap($gap_index=0)
Returns the gap at a given index.

References assQuestion\$points, and getGap().

+ 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 726 of file class.assClozeTest.php.

727 {
728 if (array_key_exists($gap_index, $this->gaps)) {
729 if ($this->gaps[$gap_index]->getType() == CLOZE_NUMERIC) {
730 // only allow notation with "." for real numbers
731 $answer = str_replace(",", ".", $answer);
732 }
733 $this->gaps[$gap_index]->addItem(new assAnswerCloze($answer, 0, $order));
734 }
735 }
const CLOZE_NUMERIC

References CLOZE_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 807 of file class.assClozeTest.php.

808 {
809 $this->gaps[$index] = $gap;
810 }
$index
Definition: metadata.php:60

References $index.

◆ 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 786 of file class.assClozeTest.php.

787 {
788 if (array_key_exists($gap_index, $this->gaps)) {
789 include_once "./Modules/TestQuestionPool/classes/class.assAnswerCloze.php";
790 $answer = new assAnswerCloze(
791 "",
792 0,
793 $this->gaps[$gap_index]->getItemCount()
794 );
795 $this->gaps[$gap_index]->addItem($answer);
796 }
797 }

◆ calculateCombinationResult()

assClozeTest::calculateCombinationResult (   $user_result)

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

1776 {
1777 $points = 0;
1778
1779 $assClozeGapCombinationObj = new assClozeGapCombination();
1780
1781 if ($assClozeGapCombinationObj->combinationExistsForQid($this->getId())) {
1782 $combinations_for_question = $assClozeGapCombinationObj->getCleanCombinationArray($this->getId());
1783 $gap_answers = array();
1784 $gap_used_in_combination = array();
1785 foreach ($user_result as $user_result_build_list) {
1786 if (is_array($user_result_build_list)) {
1787 $gap_answers[$user_result_build_list['gap_id']] = $user_result_build_list['value'];
1788 }
1789 }
1790
1791 foreach ($combinations_for_question as $combination) {
1792 foreach ($combination as $row_key => $row_answers) {
1793 $combination_fulfilled = true;
1794 $points_for_combination = $row_answers['points'];
1795 foreach ($row_answers as $gap_key => $combination_gap_answer) {
1796 if ($gap_key !== 'points') {
1797 $gap_used_in_combination[$gap_key] = $gap_key;
1798 }
1799 if ($combination_fulfilled && array_key_exists($gap_key, $gap_answers)) {
1800 switch ($combination_gap_answer['type']) {
1801 case CLOZE_TEXT:
1802 $is_text_gap_correct = $this->getTextgapPoints($gap_answers[$gap_key], $combination_gap_answer['answer'], 1);
1803 if ($is_text_gap_correct != 1) {
1804 $combination_fulfilled = false;
1805 }
1806 break;
1807 case CLOZE_SELECT:
1808 $answer = $this->gaps[$gap_key]->getItem($gap_answers[$gap_key]);
1809 $answertext = $answer->getAnswertext();
1810 if ($answertext != $combination_gap_answer['answer']) {
1811 $combination_fulfilled = false;
1812 }
1813 break;
1814 case CLOZE_NUMERIC:
1815 $answer = $this->gaps[$gap_key]->getItem(0);
1816 if ($combination_gap_answer['answer'] != 'out_of_bound') {
1817 $is_numeric_gap_correct = $this->getNumericgapPoints($answer->getAnswertext(), $gap_answers[$gap_key], 1, $answer->getLowerBound(), $answer->getUpperBound());
1818 if ($is_numeric_gap_correct != 1) {
1819 $combination_fulfilled = false;
1820 }
1821 } else {
1822 $wrong_is_the_new_right = $this->getNumericgapPoints($answer->getAnswertext(), $gap_answers[$gap_key], 1, $answer->getLowerBound(), $answer->getUpperBound());
1823 if ($wrong_is_the_new_right == 1) {
1824 $combination_fulfilled = false;
1825 }
1826 }
1827 break;
1828 }
1829 } else {
1830 if ($gap_key !== 'points') {
1831 $combination_fulfilled = false;
1832 }
1833 }
1834 }
1835 if ($combination_fulfilled) {
1836 $points += $points_for_combination;
1837 }
1838 }
1839 }
1840 }
1841 return array($points, $gap_used_in_combination);
1842 }
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...
getId()
Gets the id of the assQuestion object.
const CLOZE_SELECT
const CLOZE_TEXT
Cloze question constants.

References assQuestion\$points, CLOZE_NUMERIC, CLOZE_SELECT, CLOZE_TEXT, assQuestion\getId(), getNumericgapPoints(), and getTextgapPoints().

Referenced by calculateReachedPointsForSolution().

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

◆ calculateReachedPoints()

assClozeTest::calculateReachedPoints (   $active_id,
  $pass = null,
  $authorized = true,
  $returndetails = false 
)

Returns the points, a learner has reached answering the question.

The points are calculated from the given answers.

@access public

Parameters
integer$active_id
integer$pass
boolean$returndetails(deprecated !!)
Returns
integer/array $points/$details (array $details is deprecated !!)

Reimplemented from assQuestion.

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

1232 {
1233 global $DIC;
1234 $ilDB = $DIC['ilDB'];
1235
1236 if (is_null($pass)) {
1237 $pass = $this->getSolutionMaxPass($active_id);
1238 }
1239
1240 $result = $this->getCurrentSolutionResultSet($active_id, $pass, $authorized);
1241 $user_result = array();
1242 while ($data = $ilDB->fetchAssoc($result)) {
1243 if (strcmp($data["value2"], "") != 0) {
1244 $user_result[$data["value1"]] = array(
1245 "gap_id" => $data["value1"],
1246 "value" => $data["value2"]
1247 );
1248 }
1249 }
1250
1251 ksort($user_result); // this is required when identical scoring for same solutions is disabled
1252
1253 if ($returndetails) {
1254 $detailed = array();
1255 $this->calculateReachedPointsForSolution($user_result, $detailed);
1256 return $detailed;
1257 }
1258
1259 return $this->calculateReachedPointsForSolution($user_result);
1260 }
$result
calculateReachedPointsForSolution($user_result, &$detailed=null)
getCurrentSolutionResultSet($active_id, $pass, $authorized=true)
Get a restulset for the current user solution for a this question by active_id and pass.
getSolutionMaxPass($active_id)
Returns the maximum pass a users question solution.
global $DIC
Definition: saml.php:7
global $ilDB
$data
Definition: bench.php:6

References $data, $DIC, $ilDB, $pass, $result, calculateReachedPointsForSolution(), assQuestion\getCurrentSolutionResultSet(), and assQuestion\getSolutionMaxPass().

+ Here is the call graph for this function:

◆ calculateReachedPointsForSolution()

assClozeTest::calculateReachedPointsForSolution (   $user_result,
$detailed = null 
)
protected
Parameters
$user_result
$detailed
Returns
array

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

1849 {
1850 if ($detailed === null) {
1851 $detailed = array();
1852 }
1853
1854 $assClozeGapCombinationObj = new assClozeGapCombination();
1855 $combinations[1] = array();
1856 if ($assClozeGapCombinationObj->combinationExistsForQid($this->getId())) {
1857 $combinations = $this->calculateCombinationResult($user_result);
1858 $points = $combinations[0];
1859 }
1860 $counter = 0;
1861 $solution_values_text = array(); // for identical scoring checks
1862 $solution_values_select = array(); // for identical scoring checks
1863 $solution_values_numeric = array(); // for identical scoring checks
1864 foreach ($user_result as $gap_id => $value) {
1865 if (is_string($value)) {
1866 $value = array("value" => $value);
1867 }
1868
1869 if (array_key_exists($gap_id, $this->gaps) && !array_key_exists($gap_id, $combinations[1])) {
1870 switch ($this->gaps[$gap_id]->getType()) {
1871 case CLOZE_TEXT:
1872 $gappoints = 0;
1873 for ($order = 0; $order < $this->gaps[$gap_id]->getItemCount(); $order++) {
1874 $answer = $this->gaps[$gap_id]->getItem($order);
1875 $gotpoints = $this->getTextgapPoints($answer->getAnswertext(), $value["value"], $answer->getPoints());
1876 if ($gotpoints > $gappoints) {
1877 $gappoints = $gotpoints;
1878 }
1879 }
1880 if (!$this->getIdenticalScoring()) {
1881 // check if the same solution text was already entered
1882 if ((in_array($value["value"], $solution_values_text)) && ($gappoints > 0)) {
1883 $gappoints = 0;
1884 }
1885 }
1886 $points += $gappoints;
1887 $detailed[$gap_id] = array("points" => $gappoints, "best" => ($this->getMaximumGapPoints($gap_id) == $gappoints) ? true : false, "positive" => ($gappoints > 0) ? true : false);
1888 array_push($solution_values_text, $value["value"]);
1889 break;
1890 case CLOZE_NUMERIC:
1891 $gappoints = 0;
1892 for ($order = 0; $order < $this->gaps[$gap_id]->getItemCount(); $order++) {
1893 $answer = $this->gaps[$gap_id]->getItem($order);
1894 $gotpoints = $this->getNumericgapPoints($answer->getAnswertext(), $value["value"], $answer->getPoints(), $answer->getLowerBound(), $answer->getUpperBound());
1895 if ($gotpoints > $gappoints) {
1896 $gappoints = $gotpoints;
1897 }
1898 }
1899 if (!$this->getIdenticalScoring()) {
1900 // check if the same solution value was already entered
1901 include_once "./Services/Math/classes/class.EvalMath.php";
1902 $eval = new EvalMath();
1903 $eval->suppress_errors = true;
1904 $found_value = false;
1905 foreach ($solution_values_numeric as $solval) {
1906 if ($eval->e($solval) == $eval->e($value["value"])) {
1907 $found_value = true;
1908 }
1909 }
1910 if ($found_value && ($gappoints > 0)) {
1911 $gappoints = 0;
1912 }
1913 }
1914 $points += $gappoints;
1915 $detailed[$gap_id] = array("points" => $gappoints, "best" => ($this->getMaximumGapPoints($gap_id) == $gappoints) ? true : false, "positive" => ($gappoints > 0) ? true : false);
1916 array_push($solution_values_numeric, $value["value"]);
1917 break;
1918 case CLOZE_SELECT:
1919 if ($value["value"] >= 0) {
1920 for ($order = 0; $order < $this->gaps[$gap_id]->getItemCount(); $order++) {
1921 $answer = $this->gaps[$gap_id]->getItem($order);
1922 if ($value["value"] == $answer->getOrder()) {
1923 $answerpoints = $answer->getPoints();
1924 if (!$this->getIdenticalScoring()) {
1925 // check if the same solution value was already entered
1926 if ((in_array($answer->getAnswertext(), $solution_values_select)) && ($answerpoints > 0)) {
1927 $answerpoints = 0;
1928 }
1929 }
1930 $points += $answerpoints;
1931 $detailed[$gap_id] = array("points" => $answerpoints, "best" => ($this->getMaximumGapPoints($gap_id) == $answerpoints) ? true : false, "positive" => ($answerpoints > 0) ? true : false);
1932 array_push($solution_values_select, $answer->getAnswertext());
1933 }
1934 }
1935 }
1936 break;
1937 }
1938 }
1939 }
1940
1941 return $points;
1942 }
getMaximumGapPoints($gap_index)
Returns the maximum points for a gap.
calculateCombinationResult($user_result)
getIdenticalScoring()
Returns the identical scoring status of the question.

References assQuestion\$points, calculateCombinationResult(), CLOZE_NUMERIC, CLOZE_SELECT, CLOZE_TEXT, getIdenticalScoring(), getMaximumGapPoints(), getNumericgapPoints(), and getTextgapPoints().

Referenced by calculateReachedPoints(), and calculateReachedPointsFromPreviewSession().

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

◆ calculateReachedPointsFromPreviewSession()

assClozeTest::calculateReachedPointsFromPreviewSession ( ilAssQuestionPreviewSession  $previewSession)

Reimplemented from assQuestion.

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

1945 {
1946 $userSolution = array();
1947
1948 foreach ($previewSession->getParticipantsSolution() as $key => $val) {
1949 // fau: fixEmptyGapPreview - add the gap_id as array index
1950 $userSolution[$key] = array('gap_id' => $key, 'value' => $val);
1951 // fau.
1952 }
1953
1954 $reachedPoints = $this->calculateReachedPointsForSolution($userSolution);
1955 $reachedPoints = $this->deductHintPointsFromReachedPoints($previewSession, $reachedPoints);
1956
1957 return $this->ensureNonNegativePoints($reachedPoints);
1958 }
deductHintPointsFromReachedPoints(ilAssQuestionPreviewSession $previewSession, $reachedPoints)
ensureNonNegativePoints($points)
$key
Definition: croninfo.php:18

References $key, calculateReachedPointsForSolution(), assQuestion\deductHintPointsFromReachedPoints(), assQuestion\ensureNonNegativePoints(), and ilAssQuestionPreviewSession\getParticipantsSolution().

+ Here is the call graph for this function:

◆ checkForValidFormula()

assClozeTest::checkForValidFormula (   $value)
Parameters
$value
Returns
int

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

1218 {
1219 return preg_match("/^-?(\\d*)(,|\\.|\\/){0,1}(\\d*)$/", $value, $matches);
1220 }

◆ 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 159 of file class.assClozeTest.php.

160 {
161 // fau: fixGapReplace - mask dollars for replacement
162 $text = str_replace('$','GAPMASKEDDOLLAR', $text);$text = preg_replace("/\[gap[^\]]*?\]/", "[gap]", $text);
163 $text = preg_replace("/<gap([^>]*?)>/", "[gap]", $text);
164 $text = str_replace("</gap>", "[/gap]", $text);$text = str_replace('GAPMASKEDDOLLAR', '$', $text);
165// fau.
166 return $text;
167 }
$text
Definition: errorreport.php:18

References $text.

Referenced by loadFromDb(), and setClozeText().

+ Here is the caller graph for this function:

◆ clearGapAnswers()

assClozeTest::clearGapAnswers ( )

Removes all answers from the gaps.

@access public

See also
$gaps

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

694 {
695 foreach ($this->gaps as $gap_index => $gap) {
696 $this->gaps[$gap_index]->clearItems();
697 }
698 }

◆ copyGapCombination()

assClozeTest::copyGapCombination (   $orgID,
  $newID 
)

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

1030 {
1031 $assClozeGapCombinationObj = new assClozeGapCombination();
1032 $array = $assClozeGapCombinationObj->loadFromDb($orgID);
1033 $assClozeGapCombinationObj->importGapCombinationToDb($newID, $array);
1034 }

Referenced by copyObject(), createNewOriginalFromThisDuplicate(), and duplicate().

+ Here is the caller graph for this function:

◆ copyObject()

assClozeTest::copyObject (   $target_questionpool_id,
  $title = "" 
)

Copies an assClozeTest object.

@access public

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

956 {
957 if ($this->getId() <= 0) {
958 // The question has not been saved. It cannot be duplicated
959 return;
960 }
961
962 $thisId = $this->getId();
963 $thisObjId = $this->getObjId();
964
965 $clone = $this;
966 include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
968 $clone->id = -1;
969 $clone->setObjId($target_questionpool_id);
970 if ($title) {
971 $clone->setTitle($title);
972 }
973
974 $clone->saveToDb();
975
976 if ($this->gap_combinations_exists) {
977 $this->copyGapCombination($original_id, $clone->getId());
978 $clone->saveToDb();
979 }
980
981 // copy question page content
982 $clone->copyPageOfQuestion($original_id);
983 // copy XHTML media objects
984 $clone->copyXHTMLMediaObjectsOfQuestion($original_id);
985
986 $clone->onCopy($thisObjId, $thisId, $clone->getObjId(), $clone->getId());
987
988 return $clone->getId();
989 }
copyGapCombination($orgID, $newID)
static _getOriginalId($question_id)
Returns the original id of a question.
getObjId()
Get the object id of the container object.

References assQuestion\$original_id, assQuestion\$title, assQuestion\_getOriginalId(), copyGapCombination(), assQuestion\getId(), and assQuestion\getObjId().

+ 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 638 of file class.assClozeTest.php.

639 {
640 include_once "./Modules/TestQuestionPool/classes/class.assClozeGap.php";
641 include_once "./Modules/TestQuestionPool/classes/class.assAnswerCloze.php";
642 $search_pattern = "|\[gap\](.*?)\[/gap\]|i";
643 preg_match_all($search_pattern, $this->getClozeText(), $found);
644 $this->gaps = array();
645 if (count($found[0])) {
646 foreach ($found[1] as $gap_index => $answers) {
647 // create text gaps by default
648 $gap = new assClozeGap(CLOZE_TEXT);
649 $textparams = preg_split("/(?<!\\\\),/", $answers);
650 foreach ($textparams as $key => $value) {
651 $answer = new assAnswerCloze($value, 0, $key);
652 $gap->addItem($answer);
653 }
654 $this->gaps[$gap_index] = $gap;
655 }
656 }
657 }
Class for cloze question gaps.
getClozeText()
Returns the cloze text.

References $key, CLOZE_TEXT, and getClozeText().

Referenced by setClozeText().

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

◆ createNewOriginalFromThisDuplicate()

assClozeTest::createNewOriginalFromThisDuplicate (   $targetParentId,
  $targetQuestionTitle = "" 
)

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

992 {
993 if ($this->id <= 0) {
994 // The question has not been saved. It cannot be duplicated
995 return;
996 }
997
998 include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
999
1000 $sourceQuestionId = $this->id;
1001 $sourceParentId = $this->getObjId();
1002
1003 // duplicate the question in database
1004 $clone = $this;
1005 $clone->id = -1;
1006
1007 $clone->setObjId($targetParentId);
1008
1009 if ($targetQuestionTitle) {
1010 $clone->setTitle($targetQuestionTitle);
1011 }
1012
1013 $clone->saveToDb();
1014
1015 if ($this->gap_combinations_exists) {
1016 $this->copyGapCombination($sourceQuestionId, $clone->getId());
1017 $clone->saveToDb();
1018 }
1019 // copy question page content
1020 $clone->copyPageOfQuestion($sourceQuestionId);
1021 // copy XHTML media objects
1022 $clone->copyXHTMLMediaObjectsOfQuestion($sourceQuestionId);
1023
1024 $clone->onCopy($sourceParentId, $sourceQuestionId, $clone->getObjId(), $clone->getId());
1025
1026 return $clone->id;
1027 }

References assQuestion\$id, copyGapCombination(), and assQuestion\getObjId().

+ 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 1066 of file class.assClozeTest.php.

1067 {
1068 if (array_key_exists($gap_index, $this->gaps)) {
1069 if ($this->gaps[$gap_index]->getItemCount() == 1) {
1070 // this is the last answer text => remove the gap
1071 $this->deleteGap($gap_index);
1072 } else {
1073 // remove the answer text
1074 $this->gaps[$gap_index]->deleteItem($answer_index);
1075 $this->updateClozeTextFromGaps();
1076 }
1077 }
1078 }
updateClozeTextFromGaps()
Updates the gap parameters in the cloze text from the form input.
deleteGap($gap_index)
Deletes a gap with a given index.

References deleteGap(), and updateClozeTextFromGaps().

+ Here is the call graph for this function:

◆ 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 1088 of file class.assClozeTest.php.

1089 {
1090 if (array_key_exists($gap_index, $this->gaps)) {
1091 $output = $this->getClozeText();
1092 foreach ($this->getGaps() as $replace_gap_index => $gap) {
1093 $answers = array();
1094 foreach ($gap->getItemsRaw() as $item) {
1095 array_push($answers, str_replace(",", "\\,", $item->getAnswerText()));
1096 }
1097 if ($replace_gap_index == $gap_index) {
1098 // fau: fixGapReplace - use replace function
1099 $output = $this->replaceFirstGap($output, '');
1100// fau.
1101 } else {
1102 // fau: fixGapReplace - use replace function
1103 $output = $this->replaceFirstGap($output, "[_gap]" . join(",", $answers) . "[/_gap]");
1104// fau.
1105 }
1106 }
1107 $output = str_replace("_gap]", "gap]", $output);
1108 $this->cloze_text = $output;
1109 unset($this->gaps[$gap_index]);
1110 $this->gaps = array_values($this->gaps);
1111 }
1112 }
getGaps()
Returns the array of gaps.
replaceFirstGap($gaptext, $content)
Replace the first gap in a string without treating backreferences.

References Sabre\VObject\$output, getClozeText(), getGaps(), and replaceFirstGap().

Referenced by deleteAnswerText().

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

◆ duplicate()

assClozeTest::duplicate (   $for_test = true,
  $title = "",
  $author = "",
  $owner = "",
  $testObjId = null 
)

Duplicates an assClozeTest.

@access public

Reimplemented from assQuestion.

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

900 {
901 if ($this->id <= 0) {
902 // The question has not been saved. It cannot be duplicated
903 return;
904 }
905 // duplicate the question in database
906 $this_id = $this->getId();
907 $thisObjId = $this->getObjId();
908
909 $clone = $this;
910 include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
912 $clone->id = -1;
913
914 if ((int) $testObjId > 0) {
915 $clone->setObjId($testObjId);
916 }
917
918 if ($title) {
919 $clone->setTitle($title);
920 }
921 if ($author) {
922 $clone->setAuthor($author);
923 }
924 if ($owner) {
925 $clone->setOwner($owner);
926 }
927 if ($for_test) {
928 $clone->saveToDb($original_id);
929 } else {
930 $clone->saveToDb();
931 }
932 if ($this->gap_combinations_exists) {
933 $this->copyGapCombination($this_id, $clone->getId());
934 }
935 if ($for_test) {
936 $clone->saveToDb($original_id);
937 } else {
938 $clone->saveToDb();
939 }
940 // copy question page content
941 $clone->copyPageOfQuestion($this_id);
942 // copy XHTML media objects
943 $clone->copyXHTMLMediaObjectsOfQuestion($this_id);
944
945 $clone->onDuplicate($thisObjId, $this_id, $clone->getObjId(), $clone->getId());
946
947 return $clone->getId();
948 }

References assQuestion\$author, assQuestion\$original_id, assQuestion\$owner, assQuestion\$title, assQuestion\_getOriginalId(), copyGapCombination(), assQuestion\getId(), and assQuestion\getObjId().

+ Here is the call graph for this function:

◆ fetchAnswerValueForGap()

assClozeTest::fetchAnswerValueForGap (   $userSolution,
  $gapIndex 
)

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

1961 {
1962 $answerValue = '';
1963
1964 foreach ($userSolution as $value1 => $value2) {
1965 if ($value1 == $gapIndex) {
1966 $answerValue = $value2;
1967 break;
1968 }
1969 }
1970
1971 return $answerValue;
1972 }

◆ fetchSolutionSubmit()

assClozeTest::fetchSolutionSubmit (   $submit)

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

1294 {
1295 $solutionSubmit = array();
1296
1297 foreach ($submit as $key => $value) {
1298 if (preg_match("/^gap_(\d+)/", $key, $matches)) {
1299 $value = ilUtil::stripSlashes($value, false);
1300 if (strlen($value)) {
1301 $gap = $this->getGap($matches[1]);
1302 if (is_object($gap)) {
1303 if (!(($gap->getType() == CLOZE_SELECT) && ($value == -1))) {
1304 if ($gap->getType() == CLOZE_NUMERIC && !is_numeric(str_replace(",", ".", $value))) {
1305 $value = null;
1306 } else if ($gap->getType() == CLOZE_NUMERIC) {
1307 $value = str_replace(",", ".", $value);
1308 }
1309 $solutionSubmit[trim($matches[1])] = $value;
1310 }
1311 }
1312 }
1313 }
1314 }
1315
1316 return $solutionSubmit;
1317 }
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled

References $key, CLOZE_NUMERIC, CLOZE_SELECT, getGap(), and ilUtil\stripSlashes().

Referenced by getSolutionSubmit().

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

◆ flushGaps()

assClozeTest::flushGaps ( )

Deletes all gaps without changing the cloze text.

@access public

See also
$gaps

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

530 {
531 $this->gaps = array();
532 }

◆ 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 1479 of file class.assClozeTest.php.

1480 {
1481 return "qpl_qst_cloze";
1482 }

Referenced by loadFromDb(), and saveAdditionalQuestionDataToDb().

+ Here is the caller graph for this function:

◆ getAnswerTableName()

assClozeTest::getAnswerTableName ( )

Returns the name of the answer table in the database.

Returns
string The answer table name @access public

Reimplemented from assQuestion.

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

1491 {
1492 return array("qpl_a_cloze",'qpl_a_cloze_combi_res');
1493 }

◆ 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

Implements iQuestionCondition.

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

1767 {
1768 if ($index !== null) {
1769 return $this->getGap($index);
1770 } else {
1771 return $this->getGaps();
1772 }
1773 }

References $index, getGap(), and getGaps().

+ Here is the call graph for this function:

◆ getClozeText()

assClozeTest::getClozeText ( )

Returns the cloze text.

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

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

564 {
565 return $this->cloze_text;
566 }

References $cloze_text.

Referenced by createGapsFromQuestiontext(), deleteGap(), getRTETextWithMediaObjects(), isComplete(), lmMigrateQuestionTypeSpecificContent(), saveAdditionalQuestionDataToDb(), toJSON(), and updateClozeTextFromGaps().

+ Here is the caller 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 599 of file class.assClozeTest.php.

600 {
601 return $this->end_tag;
602 }

References $end_tag.

◆ getExpressionTypes()

◆ getFeedbackMode()

assClozeTest::getFeedbackMode ( )
Returns
string

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

620 {
621 return $this->feedbackMode;
622 }

References $feedbackMode.

Referenced by saveAdditionalQuestionDataToDb().

+ Here is the caller graph for this function:

◆ 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 1512 of file class.assClozeTest.php.

1513 {
1515 }

References $fixedTextLength.

Referenced by saveAdditionalQuestionDataToDb().

+ Here is the caller graph for this function:

◆ getGap()

assClozeTest::getGap (   $gap_index = 0)

Returns the gap at a given index.

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

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

746 {
747 if (array_key_exists($gap_index, $this->gaps)) {
748 return $this->gaps[$gap_index];
749 } else {
750 return null;
751 }
752 }

Referenced by addAnswerOptionValue(), fetchSolutionSubmit(), getAvailableAnswerOptions(), getSolutionSubmitValidation(), isAddableAnswerOptionValue(), saveWorkingData(), and validateSolutionSubmit().

+ Here is the caller graph for this function:

◆ getGapCombinations()

assClozeTest::getGapCombinations ( )

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

1555 {
1557 }

References $gap_combinations.

◆ getGapCombinationsExists()

assClozeTest::getGapCombinationsExists ( )

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

1550 {
1552 }

References $gap_combinations_exists.

◆ getGapCount()

assClozeTest::getGapCount ( )

Returns the number of gaps.

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

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

708 {
709 if (is_array($this->gaps)) {
710 return count($this->gaps);
711 } else {
712 return 0;
713 }
714 }

◆ getGaps()

assClozeTest::getGaps ( )

Returns the array of gaps.

Returns
array Array containing the gap objects of the cloze question gaps @access public

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

518 {
519 return $this->gaps;
520 }

References $gaps.

Referenced by deleteGap(), getAvailableAnswerOptions(), isComplete(), setExportDetailsXLS(), toJSON(), and updateClozeTextFromGaps().

+ 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 User interface

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

1457 {
1458 return ($this->identical_scoring) ? 1 : 0;
1459 }

Referenced by calculateReachedPointsForSolution(), and saveAdditionalQuestionDataToDb().

+ Here is the caller graph for this function:

◆ 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 1525 of file class.assClozeTest.php.

1526 {
1527 $points = 0;
1528 $gap_max_points = 0;
1529 if (array_key_exists($gap_index, $this->gaps)) {
1530 $gap = &$this->gaps[$gap_index];
1531 foreach ($gap->getItems($this->getShuffler()) as $answer) {
1532 if ($answer->getPoints() > $gap_max_points) {
1533 $gap_max_points = $answer->getPoints();
1534 }
1535 }
1536 $points += $gap_max_points;
1537 }
1538 return $points;
1539 }

References assQuestion\$points.

Referenced by calculateReachedPointsForSolution().

+ Here is the caller 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 852 of file class.assClozeTest.php.

853 {
854 $assClozeGapCombinationObj = new assClozeGapCombination();
855 $points = 0;
856 $gaps_used_in_combination = array();
857 if ($assClozeGapCombinationObj->combinationExistsForQid($this->getId())) {
858 $points = $assClozeGapCombinationObj->getMaxPointsForCombination($this->getId());
859 $gaps_used_in_combination = $assClozeGapCombinationObj->getGapsWhichAreUsedInCombination($this->getId());
860 }
861 foreach ($this->gaps as $gap_index => $gap) {
862 if (!array_key_exists($gap_index, $gaps_used_in_combination)) {
863 if ($gap->getType() == CLOZE_TEXT) {
864 $gap_max_points = 0;
865 foreach ($gap->getItems($this->getShuffler()) as $item) {
866 if ($item->getPoints() > $gap_max_points) {
867 $gap_max_points = $item->getPoints();
868 }
869 }
870 $points += $gap_max_points;
871 } elseif ($gap->getType() == CLOZE_SELECT) {
872 $srpoints = 0;
873 foreach ($gap->getItems($this->getShuffler()) as $item) {
874 if ($item->getPoints() > $srpoints) {
875 $srpoints = $item->getPoints();
876 }
877 }
878 $points += $srpoints;
879 } elseif ($gap->getType() == CLOZE_NUMERIC) {
880 $numpoints = 0;
881 foreach ($gap->getItems($this->getShuffler()) as $item) {
882 if ($item->getPoints() > $numpoints) {
883 $numpoints = $item->getPoints();
884 }
885 }
886 $points += $numpoints;
887 }
888 }
889 }
890
891 return $points;
892 }

References assQuestion\$points, CLOZE_NUMERIC, CLOZE_SELECT, CLOZE_TEXT, and assQuestion\getId().

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
integer$max_pointsThe maximum number of points for the solution @access public

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

1178 {
1179 // fau: fixGapFormula - check entered value by evalMath
1180 // if( ! $this->checkForValidFormula($a_entered) )
1181 // {
1182 // return 0;
1183 // }
1184
1185 include_once "./Services/Math/classes/class.EvalMath.php";
1186 $eval = new EvalMath();
1187 $eval->suppress_errors = true;
1188 $result = 0;
1189
1190 if ($eval->e($a_entered) === false) {
1191 return 0;
1192 } elseif (($eval->e($lowerBound) !== false) && ($eval->e($upperBound) !== false)) {
1193 // fau.
1194 if (($eval->e($a_entered) >= $eval->e($lowerBound)) && ($eval->e($a_entered) <= $eval->e($upperBound))) {
1195 $result = $max_points;
1196 }
1197 } elseif ($eval->e($lowerBound) !== false) {
1198 if (($eval->e($a_entered) >= $eval->e($lowerBound)) && ($eval->e($a_entered) <= $eval->e($a_original))) {
1199 $result = $max_points;
1200 }
1201 } elseif ($eval->e($upperBound) !== false) {
1202 if (($eval->e($a_entered) >= $eval->e($a_original)) && ($eval->e($a_entered) <= $eval->e($upperBound))) {
1203 $result = $max_points;
1204 }
1205 } else {
1206 if ($eval->e($a_entered) == $eval->e($a_original)) {
1207 $result = $max_points;
1208 }
1209 }
1210 return $result;
1211 }

References $result.

Referenced by calculateCombinationResult(), and calculateReachedPointsForSolution().

+ Here is the caller graph for this function:

◆ getOperators()

assClozeTest::getOperators (   $expression)

Get all available operations for a specific question.

Parameters
string$expression

Implements iQuestionCondition.

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

1680 {
1681 require_once "./Modules/TestQuestionPool/classes/class.ilOperatorsExpressionMapping.php";
1683 }

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 1407 of file class.assClozeTest.php.

1408 {
1409 return "assClozeTest";
1410 }

Referenced by toJSON().

+ Here is the caller graph for this function:

◆ 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 1545 of file class.assClozeTest.php.

1546 {
1547 return parent::getRTETextWithMediaObjects() . $this->getClozeText();
1548 }

References getClozeText().

+ Here is the call graph for this function:

◆ getSolutionSubmit()

assClozeTest::getSolutionSubmit ( )

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

1345 {
1346 return $this->fetchSolutionSubmit($_POST);
1347 }
$_POST["username"]
fetchSolutionSubmit($submit)

References $_POST, and fetchSolutionSubmit().

Referenced by saveWorkingData().

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

◆ getSolutionSubmitValidation()

assClozeTest::getSolutionSubmitValidation ( )

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

1320 {
1321 $submit = $_POST;
1322 $solutionSubmit = array();
1323
1324 foreach ($submit as $key => $value) {
1325 if (preg_match("/^gap_(\d+)/", $key, $matches)) {
1326 $value = ilUtil::stripSlashes($value, false);
1327 if (strlen($value)) {
1328 $gap = $this->getGap($matches[1]);
1329 if (is_object($gap)) {
1330 if (!(($gap->getType() == CLOZE_SELECT) && ($value == -1))) {
1331 if ($gap->getType() == CLOZE_NUMERIC) {
1332 $value = str_replace(",", ".", $value);
1333 }
1334 $solutionSubmit[trim($matches[1])] = $value;
1335 }
1336 }
1337 }
1338 }
1339 }
1340
1341 return $solutionSubmit;
1342 }

References $_POST, $key, CLOZE_NUMERIC, CLOZE_SELECT, getGap(), and ilUtil\stripSlashes().

Referenced by validateSolutionSubmit().

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

◆ 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 575 of file class.assClozeTest.php.

576 {
577 return $this->start_tag;
578 }

References $start_tag.

◆ 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 1123 of file class.assClozeTest.php.

1124 {
1125 include_once "./Services/Utilities/classes/class.ilStr.php";
1126 $result = 0;
1127 $gaprating = $this->getTextgapRating();
1128 switch ($gaprating) {
1130 if (strcmp(ilStr::strToLower($a_original), ilStr::strToLower($a_entered)) == 0) {
1131 $result = $max_points;
1132 }
1133 break;
1135 if (strcmp($a_original, $a_entered) == 0) {
1136 $result = $max_points;
1137 }
1138 break;
1140 if (levenshtein($a_original, $a_entered) <= 1) {
1141 $result = $max_points;
1142 }
1143 break;
1145 if (levenshtein($a_original, $a_entered) <= 2) {
1146 $result = $max_points;
1147 }
1148 break;
1150 if (levenshtein($a_original, $a_entered) <= 3) {
1151 $result = $max_points;
1152 }
1153 break;
1155 if (levenshtein($a_original, $a_entered) <= 4) {
1156 $result = $max_points;
1157 }
1158 break;
1160 if (levenshtein($a_original, $a_entered) <= 5) {
1161 $result = $max_points;
1162 }
1163 break;
1164 }
1165 return $result;
1166 }
getTextgapRating()
Returns the rating option for text gaps.
static strToLower($a_string)
Definition: class.ilStr.php:87
const TEXTGAP_RATING_LEVENSHTEIN5
const TEXTGAP_RATING_LEVENSHTEIN4
const TEXTGAP_RATING_LEVENSHTEIN3
const TEXTGAP_RATING_CASESENSITIVE
const TEXTGAP_RATING_LEVENSHTEIN2
const TEXTGAP_RATING_CASEINSENSITIVE
const TEXTGAP_RATING_LEVENSHTEIN1

References $result, getTextgapRating(), ilStr\strToLower(), TEXTGAP_RATING_CASEINSENSITIVE, TEXTGAP_RATING_CASESENSITIVE, TEXTGAP_RATING_LEVENSHTEIN1, TEXTGAP_RATING_LEVENSHTEIN2, TEXTGAP_RATING_LEVENSHTEIN3, TEXTGAP_RATING_LEVENSHTEIN4, and TEXTGAP_RATING_LEVENSHTEIN5.

Referenced by calculateCombinationResult(), and calculateReachedPointsForSolution().

+ Here is the call graph for this function:
+ Here is the caller 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 User interface

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

1420 {
1421 return $this->textgap_rating;
1422 }

References $textgap_rating.

Referenced by getTextgapPoints(), and saveAdditionalQuestionDataToDb().

+ Here is the caller graph for this function:

◆ isAddableAnswerOptionValue()

assClozeTest::isAddableAnswerOptionValue (   $qIndex,
  $answerOptionValue 
)

Reimplemented from assQuestion.

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

1975 {
1976 $gap = $this->getGap($qIndex);
1977
1978 if ($gap->getType() != CLOZE_TEXT) {
1979 return false;
1980 }
1981
1982 foreach ($gap->getItems(new ilArrayElementOrderKeeper()) as $item) {
1983 if ($item->getAnswertext() == $answerOptionValue) {
1984 return false;
1985 }
1986 }
1987
1988 return true;
1989 }

References CLOZE_TEXT, and getGap().

+ 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 140 of file class.assClozeTest.php.

141 {
142 if (strlen($this->getTitle())
143 && $this->getAuthor()
144 && $this->getClozeText()
145 && count($this->getGaps())
146 && $this->getMaximumPoints() > 0) {
147 return true;
148 }
149 return false;
150 }
getMaximumPoints()
Returns the maximum points, a learner can reach answering the question.
getTitle()
Gets the title string of the assQuestion object.
getAuthor()
Gets the authors name of the assQuestion object.

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 1262 of file class.assClozeTest.php.

1263 {
1264 if (is_numeric($submittedValue)) {
1265 return true;
1266 }
1267
1268 if (preg_match('/^[-+]{0,1}\d+\/\d+$/', $submittedValue)) {
1269 return true;
1270 }
1271
1272 return false;
1273 }

Referenced by validateSolutionSubmit().

+ Here is the caller graph for this function:

◆ lmMigrateQuestionTypeSpecificContent()

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

Reimplemented from assQuestion.

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

1612 {
1613 // DO NOT USE SETTER FOR CLOZE TEXT -> SETTER DOES RECREATE GAP OBJECTS without having gap type info ^^
1614 //$this->setClozeText( $migrator->migrateToLmContent($this->getClozeText()) );
1615 $this->cloze_text = $migrator->migrateToLmContent($this->getClozeText());
1616 // DO NOT USE SETTER FOR CLOZE TEXT -> SETTER DOES RECREATE GAP OBJECTS without having gap type info ^^
1617 }

References getClozeText(), and ilAssSelfAssessmentMigrator\migrateToLmContent().

+ Here is the call graph for this function:

◆ loadFromDb()

assClozeTest::loadFromDb (   $question_id)

Loads a assClozeTest object from a database.

Parameters
integer$question_idA unique key which defines the cloze test in the database

Reimplemented from assQuestion.

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

192 {
193 global $DIC;
194 $ilDB = $DIC['ilDB'];
195 $result = $ilDB->queryF(
196 "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",
197 array("integer"),
198 array($question_id)
199 );
200 if ($result->numRows() == 1) {
201 $data = $ilDB->fetchAssoc($result);
202 $this->setId($question_id);
203 $this->setNrOfTries($data['nr_of_tries']);
204 $this->setObjId($data["obj_fi"]);
205 $this->setTitle($data["title"]);
206 $this->setComment($data["description"]);
207 $this->setOriginalId($data["original_id"]);
208 $this->setAuthor($data["author"]);
209 $this->setPoints($data["points"]);
210 $this->setOwner($data["owner"]);
211 $this->setQuestion($this->cleanQuestiontext($data["question_text"]));
212 $this->setClozeText($data['cloze_text']);
213 $this->setFixedTextLength($data["fixed_textlen"]);
214 $this->setIdenticalScoring(($data['tstamp'] == 0) ? true : $data["identical_scoring"]);
215 $this->setFeedbackMode($data['feedback_mode'] === null ? ilAssClozeTestFeedback::FB_MODE_GAP_QUESTION : $data['feedback_mode']);
216 // replacement of old syntax with new syntax
217 include_once("./Services/RTE/classes/class.ilRTE.php");
218 $this->question = ilRTE::_replaceMediaObjectImageSrc($this->question, 1);
219 $this->cloze_text = ilRTE::_replaceMediaObjectImageSrc($this->cloze_text, 1);
220 $this->setTextgapRating($data["textgap_rating"]);
221 $this->setEstimatedWorkingTime(substr($data["working_time"], 0, 2), substr($data["working_time"], 3, 2), substr($data["working_time"], 6, 2));
222
223 try {
224 $this->setAdditionalContentEditingMode($data['add_cont_edit_mode']);
225 } catch (ilTestQuestionPoolException $e) {
226 }
227
228 // open the cloze gaps with all answers
229 include_once "./Modules/TestQuestionPool/classes/class.assAnswerCloze.php";
230 include_once "./Modules/TestQuestionPool/classes/class.assClozeGap.php";
231 $result = $ilDB->queryF(
232 "SELECT * FROM qpl_a_cloze WHERE question_fi = %s ORDER BY gap_id, aorder ASC",
233 array("integer"),
234 array($question_id)
235 );
236 if ($result->numRows() > 0) {
237 $this->gaps = array();
238 while ($data = $ilDB->fetchAssoc($result)) {
239 switch ($data["cloze_type"]) {
240 case CLOZE_TEXT:
241 if (!array_key_exists($data["gap_id"], $this->gaps)) {
242 $this->gaps[$data["gap_id"]] = new assClozeGap(CLOZE_TEXT);
243 }
244 $answer = new assAnswerCloze(
245 $data["answertext"],
246 $data["points"],
247 $data["aorder"]
248 );
249 $this->gaps[$data["gap_id"]]->setGapSize($data['gap_size']);
250
251 $this->gaps[$data["gap_id"]]->addItem($answer);
252 break;
253 case CLOZE_SELECT:
254 if (!array_key_exists($data["gap_id"], $this->gaps)) {
255 $this->gaps[$data["gap_id"]] = new assClozeGap(CLOZE_SELECT);
256 $this->gaps[$data["gap_id"]]->setShuffle($data["shuffle"]);
257 }
258 $answer = new assAnswerCloze(
259 $data["answertext"],
260 $data["points"],
261 $data["aorder"]
262 );
263 $this->gaps[$data["gap_id"]]->addItem($answer);
264 break;
265 case CLOZE_NUMERIC:
266 if (!array_key_exists($data["gap_id"], $this->gaps)) {
267 $this->gaps[$data["gap_id"]] = new assClozeGap(CLOZE_NUMERIC);
268 }
269 $answer = new assAnswerCloze(
270 $data["answertext"],
271 $data["points"],
272 $data["aorder"]
273 );
274 $this->gaps[$data["gap_id"]]->setGapSize($data['gap_size']);
275 $answer->setLowerBound($data["lowerlimit"]);
276 $answer->setUpperBound($data["upperlimit"]);
277 $this->gaps[$data["gap_id"]]->addItem($answer);
278 break;
279 }
280 }
281 }
282 }
283 $assClozeGapCombinationObj = new assClozeGapCombination();
284 $check_for_gap_combinations = $assClozeGapCombinationObj->loadFromDb($question_id);
285 if (count($check_for_gap_combinations) != 0) {
286 $this->setGapCombinationsExists(true);
287 $this->setGapCombinations($check_for_gap_combinations);
288 }
289 parent::loadFromDb($question_id);
290 }
setFeedbackMode($feedbackMode)
setTextgapRating($a_textgap_rating)
Sets the rating option for text gaps.
getAdditionalTableName()
Returns the name of the additional question data table in the database.
setIdenticalScoring($a_identical_scoring)
Sets the identical scoring option for cloze questions.
setGapCombinationsExists($value)
setFixedTextLength($a_text_len)
Sets a fixed text length for all text fields in the cloze question.
setClozeText($cloze_text="")
Evaluates the text gap solutions from the cloze text.
cleanQuestiontext($text)
Cleans cloze question text to remove attributes or tags from older ILIAS versions.
setId($id=-1)
Sets the id of the assQuestion object.
setOriginalId($original_id)
setObjId($obj_id=0)
Set the object id of the container object.
setTitle($title="")
Sets the title string of the assQuestion object.
setOwner($owner="")
Sets the creator/owner ID of the assQuestion object.
setEstimatedWorkingTime($hour=0, $min=0, $sec=0)
Sets the estimated working time of a question from given hour, minute and second.
setAuthor($author="")
Sets the authors name of the assQuestion object.
setPoints($a_points)
Sets the maximum available points for the question.
setComment($comment="")
Sets the comment string of the assQuestion object.
setNrOfTries($a_nr_of_tries)
setAdditionalContentEditingMode($additinalContentEditingMode)
setter for additional content editing mode for this question
const FB_MODE_GAP_QUESTION
constants for different feedback modes (per gap or per gap-answers/options)
static _replaceMediaObjectImageSrc($a_text, $a_direction=0, $nic=IL_INST_ID)
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...

References $data, $DIC, $ilDB, $result, ilRTE\_replaceMediaObjectImageSrc(), cleanQuestiontext(), CLOZE_NUMERIC, CLOZE_SELECT, CLOZE_TEXT, ilAssClozeTestFeedback\FB_MODE_GAP_QUESTION, getAdditionalTableName(), assQuestion\setAdditionalContentEditingMode(), assQuestion\setAuthor(), setClozeText(), assQuestion\setComment(), assQuestion\setEstimatedWorkingTime(), setFeedbackMode(), setFixedTextLength(), setGapCombinations(), setGapCombinationsExists(), assQuestion\setId(), setIdenticalScoring(), assQuestion\setNrOfTries(), assQuestion\setObjId(), assQuestion\setOriginalId(), assQuestion\setOwner(), assQuestion\setPoints(), assQuestion\setQuestion(), setTextgapRating(), and assQuestion\setTitle().

+ Here is the call graph for this function:

◆ replaceFirstGap()

assClozeTest::replaceFirstGap (   $gaptext,
  $content 
)

Replace the first gap in a string without treating backreferences.

Parameters
string$gaptexttext with gap tags
string$contentcontent for the first gap
Returns
string

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

177 {
178 $content = str_replace('$','GAPMASKEDDOLLAR', $content);
179 $output = preg_replace("/\[gap\].*?\[\/gap\]/", $content, $gaptext, 1);
180 $output = str_replace('GAPMASKEDDOLLAR', '$', $output);
181
182 return $output;
183 }

References Sabre\VObject\$output.

Referenced by deleteGap(), and updateClozeTextFromGaps().

+ Here is the caller graph for this function:

◆ saveAdditionalQuestionDataToDb()

assClozeTest::saveAdditionalQuestionDataToDb ( )

Saves the data for the additional data table.

This method uses the ugly DELETE-INSERT. Here, this does no harm.

Implements ilObjQuestionScoringAdjustable.

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

337 {
338 global $DIC; /* @var ILIAS\DI\Container $DIC */
339
340
341 $DIC->database()->manipulateF(
342 "DELETE FROM " . $this->getAdditionalTableName() . " WHERE question_fi = %s",
343 array( "integer" ),
344 array( $this->getId() )
345 );
346
347 $DIC->database()->insert($this->getAdditionalTableName(), array(
348 'question_fi' => array('integer', $this->getId()),
349 'textgap_rating' => array('text', $this->getTextgapRating()),
350 'identical_scoring' => array('text', $this->getIdenticalScoring()),
351 'fixed_textlen' => array('integer', $this->getFixedTextLength() ? $this->getFixedTextLength() : null),
352 'cloze_text' => array('text', ilRTE::_replaceMediaObjectImageSrc($this->getClozeText(), 0)),
353 'feedback_mode' => array('text', $this->getFeedbackMode())
354 ));
355 }
getFixedTextLength()
Gets the fixed text length for all text fields in the cloze question.

References $DIC, ilRTE\_replaceMediaObjectImageSrc(), getAdditionalTableName(), getClozeText(), getFeedbackMode(), getFixedTextLength(), assQuestion\getId(), getIdenticalScoring(), and getTextgapRating().

Referenced by saveToDb().

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

◆ saveAnswerSpecificDataToDb()

assClozeTest::saveAnswerSpecificDataToDb ( )

Save all gaps to the database.

Implements ilObjAnswerScoringAdjustable.

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

316 {
317 global $DIC;
318 $ilDB = $DIC['ilDB'];
319
320 $ilDB->manipulateF(
321 "DELETE FROM qpl_a_cloze WHERE question_fi = %s",
322 array( "integer" ),
323 array( $this->getId() )
324 );
325
326 foreach ($this->gaps as $key => $gap) {
327 $this->saveClozeGapItemsToDb($gap, $key);
328 }
329 }
saveClozeGapItemsToDb($gap, $key)
Save all items belonging to one cloze gap to the db.

References $DIC, $ilDB, $key, assQuestion\getId(), and saveClozeGapItemsToDb().

Referenced by saveToDb().

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

◆ saveClozeGapItemsToDb()

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

Save all items belonging to one cloze gap to the db.

Parameters
$gap
$key

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

364 {
365 global $DIC;
366 $ilDB = $DIC['ilDB'];
367 foreach ($gap->getItems($this->getShuffler()) as $item) {
368 $query = "";
369 $next_id = $ilDB->nextId('qpl_a_cloze');
370 switch ($gap->getType()) {
371 case CLOZE_TEXT:
372 $this->saveClozeTextGapRecordToDb($next_id, $key, $item, $gap);
373 break;
374 case CLOZE_SELECT:
375 $this->saveClozeSelectGapRecordToDb($next_id, $key, $item, $gap);
376 break;
377 case CLOZE_NUMERIC:
378 $this->saveClozeNumericGapRecordToDb($next_id, $key, $item, $gap);
379 break;
380 }
381 }
382 }
saveClozeTextGapRecordToDb($next_id, $key, $item, $gap)
Saves a gap-item record.
saveClozeSelectGapRecordToDb($next_id, $key, $item, $gap)
Saves a gap-item record.
saveClozeNumericGapRecordToDb($next_id, $key, $item, $gap)
Saves a gap-item record.
$query

References $DIC, $ilDB, $key, $query, CLOZE_NUMERIC, CLOZE_SELECT, CLOZE_TEXT, saveClozeNumericGapRecordToDb(), saveClozeSelectGapRecordToDb(), and saveClozeTextGapRecordToDb().

Referenced by saveAnswerSpecificDataToDb().

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

◆ saveClozeNumericGapRecordToDb()

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

Saves a gap-item record.

Parameters
$next_idint Next Id for the record.
$keyint Gap Id
$itemgap Gap item data object.
$gapgap Gap data object.

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

467 {
468 global $DIC;
469 $ilDB = $DIC['ilDB'];
470
471 include_once "./Services/Math/classes/class.EvalMath.php";
472 $eval = new EvalMath();
473 $eval->suppress_errors = true;
474 $ilDB->manipulateF(
475 "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)",
476 array(
477 "integer",
478 "integer",
479 "integer",
480 "text",
481 "float",
482 "integer",
483 "text",
484 "text",
485 "text",
486 "integer"
487 ),
488 array(
489 $next_id,
490 $this->getId(),
491 $key,
492 strlen($item->getAnswertext()) ? $item->getAnswertext() : "",
493 $item->getPoints(),
494 $item->getOrder(),
495 $gap->getType(),
496 ($eval->e($item->getLowerBound() !== false) && strlen(
497 $item->getLowerBound()
498 ) > 0) ? $item->getLowerBound() : $item->getAnswertext(),
499 ($eval->e($item->getUpperBound() !== false) && strlen(
500 $item->getUpperBound()
501 ) > 0) ? $item->getUpperBound() : $item->getAnswertext(),
502 (int) $gap->getGapSize()
503 )
504 );
505 }

References $DIC, $ilDB, $key, and assQuestion\getId().

Referenced by saveClozeGapItemsToDb().

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

◆ saveClozeSelectGapRecordToDb()

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

Saves a gap-item record.

Parameters
$next_idint Next Id for the record.
$keyint Gap Id
$itemgap Gap item data object.
$gapgap Gap data object.

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

430 {
431 global $DIC;
432 $ilDB = $DIC['ilDB'];
433 $ilDB->manipulateF(
434 "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)",
435 array(
436 "integer",
437 "integer",
438 "integer",
439 "text",
440 "float",
441 "integer",
442 "text",
443 "text"
444 ),
445 array(
446 $next_id,
447 $this->getId(),
448 $key,
449 strlen($item->getAnswertext()) ? $item->getAnswertext() : "",
450 $item->getPoints(),
451 $item->getOrder(),
452 $gap->getType(),
453 ($gap->getShuffle()) ? "1" : "0"
454 )
455 );
456 }

References $DIC, $ilDB, $key, and assQuestion\getId().

Referenced by saveClozeGapItemsToDb().

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

◆ saveClozeTextGapRecordToDb()

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

Saves a gap-item record.

Parameters
$next_idint Next Id for the record.
$keyint Gap Id
$itemgap Gap item data object.
$gapgap Gap data object.

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

393 {
394 global $DIC;
395 $ilDB = $DIC['ilDB'];
396 $ilDB->manipulateF(
397 "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)",
398 array(
399 "integer",
400 "integer",
401 "integer",
402 "text",
403 "float",
404 "integer",
405 "text",
406 "integer"
407 ),
408 array(
409 $next_id,
410 $this->getId(),
411 $key,
412 strlen($item->getAnswertext()) ? $item->getAnswertext() : "",
413 $item->getPoints(),
414 $item->getOrder(),
415 $gap->getType(),
416 (int) $gap->getGapSize()
417 )
418 );
419 }

References $DIC, $ilDB, $key, and assQuestion\getId().

Referenced by saveClozeGapItemsToDb().

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

◆ savePartial()

assClozeTest::savePartial ( )

Reimplemented from assQuestion.

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

2002 {
2003 return true;
2004 }

◆ saveToDb()

assClozeTest::saveToDb (   $original_id = "")

Saves a assClozeTest object to a database.

Parameters
int | string$original_idID of the original question
Returns
mixed|void

@access public

Reimplemented from assQuestion.

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

304 {
308
309 parent::saveToDb($original_id);
310 }
saveAnswerSpecificDataToDb()
Save all gaps to the database.
saveAdditionalQuestionDataToDb()
Saves the data for the additional data table.
saveQuestionDataToDb($original_id="")

References assQuestion\$original_id, saveAdditionalQuestionDataToDb(), saveAnswerSpecificDataToDb(), and assQuestion\saveQuestionDataToDb().

+ Here is the call graph for this function:

◆ saveWorkingData()

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

Saves the learners input of the question to the database.

@access public

Parameters
integer$active_idActive id of the user
integer$passTest pass
Returns
boolean $status

Reimplemented from assQuestion.

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

1358 {
1359 global $DIC;
1360 $ilDB = $DIC['ilDB'];
1361 $ilUser = $DIC['ilUser'];
1362 if (is_null($pass)) {
1363 include_once "./Modules/Test/classes/class.ilObjTest.php";
1364 $pass = ilObjTest::_getPass($active_id);
1365 }
1366
1367 $entered_values = 0;
1368
1369 $this->getProcessLocker()->executeUserSolutionUpdateLockOperation(function () use (&$entered_values, $active_id, $pass, $authorized) {
1370 $this->removeCurrentSolution($active_id, $pass, $authorized);
1371
1372 foreach ($this->getSolutionSubmit() as $val1 => $val2) {
1373 $value = trim(ilUtil::stripSlashes($val2, false));
1374 if (strlen($value)) {
1375 $gap = $this->getGap(trim(ilUtil::stripSlashes($val1)));
1376 if (is_object($gap)) {
1377 if (!(($gap->getType() == CLOZE_SELECT) && ($value == -1))) {
1378 $this->saveCurrentSolution($active_id, $pass, $val1, $value, $authorized);
1379 $entered_values++;
1380 }
1381 }
1382 }
1383 }
1384 });
1385
1386 if ($entered_values) {
1387 include_once("./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1389 assQuestion::logAction($this->lng->txtlng("assessment", "log_user_entered_values", ilObjAssessmentFolder::_getLogLanguage()), $active_id, $this->getId());
1390 }
1391 } else {
1392 include_once("./Modules/Test/classes/class.ilObjAssessmentFolder.php");
1394 assQuestion::logAction($this->lng->txtlng("assessment", "log_user_not_entered_values", ilObjAssessmentFolder::_getLogLanguage()), $active_id, $this->getId());
1395 }
1396 }
1397
1398 return true;
1399 }
saveCurrentSolution($active_id, $pass, $value1, $value2, $authorized=true, $tstamp=null)
static logAction($logtext="", $active_id="", $question_id="")
Logs an action into the Test&Assessment log.
removeCurrentSolution($active_id, $pass, $authorized=true)
static _getLogLanguage()
retrieve the log language for assessment logging
static _enabledAssessmentLogging()
check wether assessment logging is enabled or not
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.
$ilUser
Definition: imgupload.php:18

References $DIC, $ilDB, $ilUser, $pass, ilObjAssessmentFolder\_enabledAssessmentLogging(), ilObjAssessmentFolder\_getLogLanguage(), ilObjTest\_getPass(), CLOZE_SELECT, getGap(), assQuestion\getProcessLocker(), getSolutionSubmit(), assQuestion\logAction(), assQuestion\removeCurrentSolution(), assQuestion\saveCurrentSolution(), and ilUtil\stripSlashes().

+ Here is the call graph for this function:

◆ setClozeText()

assClozeTest::setClozeText (   $cloze_text = "")

Evaluates the text gap solutions from the cloze text.

A single or multiple text gap solutions could be entered using the following syntax in the cloze text: solution1 [, solution2, ..., solutionN] enclosed in the text gap selector gap[]

Parameters
string$cloze_textThe cloze text with all gaps and gap gaps @access public
See also
$cloze_text

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

544 {
545 $this->gaps = array();
547 $this->cloze_text = $cloze_text;
549 }
createGapsFromQuestiontext()
Create gap entries by parsing the question text.

References $cloze_text, cleanQuestiontext(), and createGapsFromQuestiontext().

Referenced by loadFromDb().

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

◆ setClozeTextValue()

assClozeTest::setClozeTextValue (   $cloze_text = "")

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

552 {
553 $this->cloze_text = $cloze_text;
554 }

References $cloze_text.

◆ 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 611 of file class.assClozeTest.php.

612 {
613 $this->end_tag = $end_tag;
614 }

References $end_tag.

◆ setExportDetailsXLS()

assClozeTest::setExportDetailsXLS (   $worksheet,
  $startrow,
  $active_id,
  $pass 
)

{Creates an Excel worksheet for the detailed cumulated results of this question.

Parameters
object$worksheetReference to the parent excel worksheet
object$startrowStartrow of the output in the excel worksheet
object$active_idActive id of the participant
object$passTest pass
Returns
object
}

Reimplemented from assQuestion.

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

1573 {
1574 parent::setExportDetailsXLS($worksheet, $startrow, $active_id, $pass);
1575
1576 $solution = $this->getSolutionValues($active_id, $pass);
1577 $i = 1;
1578 foreach ($this->getGaps() as $gap_index => $gap) {
1579 $worksheet->setCell($startrow + $i, 0, $this->lng->txt("gap") . " $i");
1580 $worksheet->setBold($worksheet->getColumnCoord(0) . ($startrow + $i));
1581 $checked = false;
1582 foreach ($solution as $solutionvalue) {
1583 if ($gap_index == $solutionvalue["value1"]) {
1584 $string_escaping_org_value = $worksheet->getStringEscaping();
1585 try {
1586 $worksheet->setStringEscaping(false);
1587
1588 switch ($gap->getType()) {
1589 case CLOZE_SELECT:
1590 $worksheet->setCell($startrow + $i, 1, $gap->getItem($solutionvalue["value2"])->getAnswertext());
1591 break;
1592 case CLOZE_NUMERIC:
1593 case CLOZE_TEXT:
1594 $worksheet->setCell($startrow + $i, 1, $solutionvalue["value2"]);
1595 break;
1596 }
1597 } finally {
1598 $worksheet->setStringEscaping($string_escaping_org_value);
1599 }
1600 }
1601 }
1602 $i++;
1603 }
1604
1605 return $startrow + $i + 1;
1606 }
getSolutionValues($active_id, $pass=null, $authorized=true)
Loads solutions of a given user from the database an returns it.
$i
Definition: disco.tpl.php:19

References $i, $pass, CLOZE_NUMERIC, CLOZE_SELECT, CLOZE_TEXT, getGaps(), and assQuestion\getSolutionValues().

+ Here is the call graph for this function:

◆ setFeedbackMode()

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

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

628 {
629 $this->feedbackMode = $feedbackMode;
630 }

References $feedbackMode.

Referenced by loadFromDb().

+ Here is the caller graph for this function:

◆ setFixedTextLength()

assClozeTest::setFixedTextLength (   $a_text_len)

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 1501 of file class.assClozeTest.php.

1502 {
1503 $this->fixedTextLength = $a_text_len;
1504 }

Referenced by loadFromDb().

+ Here is the caller graph for this function:

◆ 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 822 of file class.assClozeTest.php.

823 {
824 if (array_key_exists($gap_index, $this->gaps)) {
825 $this->gaps[$gap_index]->setItemLowerBound($order, $bound);
826 }
827 }

◆ 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 771 of file class.assClozeTest.php.

772 {
773 if (array_key_exists($gap_index, $this->gaps)) {
774 $this->gaps[$gap_index]->setItemPoints($order, $points);
775 }
776 }

References assQuestion\$points.

◆ 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 839 of file class.assClozeTest.php.

840 {
841 if (array_key_exists($gap_index, $this->gaps)) {
842 $this->gaps[$gap_index]->setItemUpperBound($order, $bound);
843 }
844 }

◆ setGapCombinations()

assClozeTest::setGapCombinations (   $value)

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

1565 {
1566 $this->gap_combinations = $value;
1567 }

Referenced by loadFromDb().

+ Here is the caller graph for this function:

◆ setGapCombinationsExists()

assClozeTest::setGapCombinationsExists (   $value)

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

1560 {
1561 $this->gap_combinations_exists = $value;
1562 }

Referenced by loadFromDb().

+ Here is the caller graph for this function:

◆ 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 680 of file class.assClozeTest.php.

681 {
682 if (array_key_exists($gap_index, $this->gaps)) {
683 $this->gaps[$gap_index]->setShuffle($shuffle);
684 }
685 }

References assQuestion\$shuffle.

◆ setGapSize()

assClozeTest::setGapSize (   $gap_index,
  $order,
  $size 
)

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

755 {
756 if (array_key_exists($gap_index, $this->gaps)) {
757 $this->gaps[$gap_index]->setGapSize($size);
758 }
759 }
$size
Definition: RandomTest.php:84

References $size.

◆ setGapType()

assClozeTest::setGapType (   $gap_index,
  $gap_type 
)

Set the type of a gap with a given index.

@access private

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

665 {
666 if (array_key_exists($gap_index, $this->gaps)) {
667 $this->gaps[$gap_index]->setType($gap_type);
668 }
669 }

◆ setIdenticalScoring()

assClozeTest::setIdenticalScoring (   $a_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 User interface

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

1469 {
1470 $this->identical_scoring = ($a_identical_scoring) ? 1 : 0;
1471 }

Referenced by loadFromDb().

+ Here is the caller graph for this function:

◆ 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 587 of file class.assClozeTest.php.

588 {
589 $this->start_tag = $start_tag;
590 }

References $start_tag.

◆ 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 User interface

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

1432 {
1433 switch ($a_textgap_rating) {
1441 $this->textgap_rating = $a_textgap_rating;
1442 break;
1443 default:
1444 $this->textgap_rating = TEXTGAP_RATING_CASEINSENSITIVE;
1445 break;
1446 }
1447 }

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

Referenced by loadFromDb().

+ Here is the caller graph for this function:

◆ toJSON()

assClozeTest::toJSON ( )

Returns a JSON representation of the question.

Reimplemented from assQuestion.

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

1623 {
1624 include_once("./Services/RTE/classes/class.ilRTE.php");
1625 $result = array();
1626 $result['id'] = (int) $this->getId();
1627 $result['type'] = (string) $this->getQuestionType();
1628 $result['title'] = (string) $this->getTitle();
1629 $result['question'] = $this->formatSAQuestion($this->getQuestion());
1630 $result['clozetext'] = $this->formatSAQuestion($this->getClozeText());
1631 $result['nr_of_tries'] = (int) $this->getNrOfTries();
1632 $result['shuffle'] = (bool) $this->getShuffle();
1633 $result['feedback'] = array(
1634 'onenotcorrect' => $this->formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(), false)),
1635 'allcorrect' => $this->formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(), true))
1636 );
1637
1638 $gaps = array();
1639 foreach ($this->getGaps() as $key => $gap) {
1640 $items = array();
1641 foreach ($gap->getItems($this->getShuffler()) as $item) {
1642 $jitem = array();
1643 $jitem['points'] = $item->getPoints();
1644 $jitem['value'] = $this->formatSAQuestion($item->getAnswertext());
1645 $jitem['order'] = $item->getOrder();
1646 if ($gap->getType() == CLOZE_NUMERIC) {
1647 $jitem['lowerbound'] = $item->getLowerBound();
1648 $jitem['upperbound'] = $item->getUpperBound();
1649 } else {
1650 $jitem['value'] = trim($jitem['value']);
1651 }
1652 array_push($items, $jitem);
1653 }
1654
1655 if ($gap->getGapSize() && ($gap->getType() == CLOZE_TEXT || $gap->getType() == CLOZE_NUMERIC)) {
1656 $jgap['size'] = $gap->getGapSize();
1657 }
1658
1659 $jgap['shuffle'] = $gap->getShuffle();
1660 $jgap['type'] = $gap->getType();
1661 $jgap['item'] = $items;
1662
1663 array_push($gaps, $jgap);
1664 }
1665 $result['gaps'] = $gaps;
1666 $mobs = ilObjMediaObject::_getMobsOfObject("qpl:html", $this->getId());
1667 $result['mobs'] = $mobs;
1668 return json_encode($result);
1669 }
getQuestionType()
Returns the question type of the question.
formatSAQuestion($a_q)
Format self assessment question.
getShuffle()
Gets the shuffle flag.
getQuestion()
Gets the question string of the question object.
static _getMobsOfObject($a_type, $a_id, $a_usage_hist_nr=0, $a_lang="-")
get mobs of object
$mobs

References $gaps, $key, $mobs, $result, ilObjMediaObject\_getMobsOfObject(), CLOZE_NUMERIC, CLOZE_TEXT, assQuestion\formatSAQuestion(), getClozeText(), getGaps(), assQuestion\getId(), assQuestion\getNrOfTries(), assQuestion\getQuestion(), getQuestionType(), assQuestion\getShuffle(), and assQuestion\getTitle().

+ 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 1041 of file class.assClozeTest.php.

1042 {
1043 $output = $this->getClozeText();
1044 foreach ($this->getGaps() as $gap_index => $gap) {
1045 $answers = array();
1046 foreach ($gap->getItemsRaw() as $item) {
1047 array_push($answers, str_replace(",", "\\,", $item->getAnswerText()));
1048 }
1049 // fau: fixGapReplace - use replace function
1050 $output = $this->replaceFirstGap($output, "[_gap]" . $this->prepareTextareaOutput(join(",", $answers), true) . "[/_gap]");
1051// fau.
1052 }
1053 $output = str_replace("_gap]", "gap]", $output);
1054 $this->cloze_text = $output;
1055 }
prepareTextareaOutput($txt_output, $prepare_for_latex_output=false, $omitNl2BrWhenTextArea=false)
Prepares a string for a text area output in tests.

References Sabre\VObject\$output, getClozeText(), getGaps(), assQuestion\prepareTextareaOutput(), and replaceFirstGap().

Referenced by deleteAnswerText().

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

◆ validateSolutionSubmit()

assClozeTest::validateSolutionSubmit ( )

Reimplemented from assQuestion.

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

1276 {
1277 foreach ($this->getSolutionSubmitValidation() as $gapIndex => $value) {
1278 $gap = $this->getGap($gapIndex);
1279
1280 if ($gap->getType() != CLOZE_NUMERIC) {
1281 continue;
1282 }
1283
1284 if (strlen($value) && !$this->isValidNumericSubmitValue($value)) {
1285 ilUtil::sendFailure($this->lng->txt("err_no_numeric_value"), true);
1286 return false;
1287 }
1288 }
1289
1290 return true;
1291 }
isValidNumericSubmitValue($submittedValue)
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.

References CLOZE_NUMERIC, getGap(), getSolutionSubmitValidation(), isValidNumericSubmitValue(), and ilUtil\sendFailure().

+ Here is the call graph for this function:

Field Documentation

◆ $cloze_text

assClozeTest::$cloze_text

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

Referenced by getClozeText(), setClozeText(), and setClozeTextValue().

◆ $end_tag

assClozeTest::$end_tag

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

Referenced by getEndTag(), and setEndTag().

◆ $feedbackMode

assClozeTest::$feedbackMode = ilAssClozeTestFeedback::FB_MODE_GAP_QUESTION
protected

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

Referenced by getFeedbackMode(), and setFeedbackMode().

◆ $feedbackOBJ

assClozeTest::$feedbackOBJ

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

◆ $fixedTextLength

assClozeTest::$fixedTextLength

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

Referenced by getFixedTextLength().

◆ $gap_combinations

assClozeTest::$gap_combinations

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

Referenced by getGapCombinations().

◆ $gap_combinations_exists

assClozeTest::$gap_combinations_exists

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

Referenced by getGapCombinationsExists().

◆ $gaps

assClozeTest::$gaps

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

Referenced by getGaps(), and toJSON().

◆ $identical_scoring

assClozeTest::$identical_scoring

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

◆ $start_tag

assClozeTest::$start_tag

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

Referenced by getStartTag(), and setStartTag().

◆ $textgap_rating

assClozeTest::$textgap_rating

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

Referenced by getTextgapRating().


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