ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
assFormulaQuestion Class Reference

Class for single choice questions assFormulaQuestion is a class for single choice questions. More...

+ Inheritance diagram for assFormulaQuestion:
+ Collaboration diagram for assFormulaQuestion:

Public Member Functions

 __construct (string $title="", string $comment="", string $author="", int $owner=-1, string $question="")
 
 clearVariables ()
 
 getVariables ()
 
 getVariable (string $variable)
 
 addVariable (assFormulaQuestionVariable $variable)
 
 clearResults ()
 
 getResults ()
 
 getResult (string $result)
 
 addResult (assFormulaQuestionResult $result)
 
 addResultUnits (?assFormulaQuestionResult $result, ?array $unit_ids)
 
 addResultUnit (?assFormulaQuestionResult $result, ?assFormulaQuestionUnit $unit)
 
 getResultUnits (assFormulaQuestionResult $result)
 
 getAllResultUnits ()
 
 hasResultUnit (assFormulaQuestionResult $result, int $unit_id)
 
 parseQuestionText ()
 
 checkForDuplicateVariables ()
 
 checkForDuplicateResults ()
 
 fetchAllResults ($questionText)
 
 fetchAllVariables (string $question_text)
 
 hasRequiredVariableSolutionValues (array $userSolution)
 
 getVariableSolutionValuesForPass (int $active_id, int $pass)
 
 getInitialVariableSolutionValues ()
 
 saveCurrentSolution (int $active_id, int $pass, $value1, $value2, bool $authorized=true, $tstamp=0)
 
 substituteVariables (array $userdata, bool $graphicalOutput=false, bool $forsolution=false, bool $result_output=false, array $correctness_icons=[])
 
 canUseAdvancedRating ($result)
 Check if advanced rating can be used for a result. More...
 
 isComplete ()
 Returns true, if the question is complete for use. More...
 
 saveToDb (?int $original_id=null)
 
 loadFromDb (int $question_id)
 
 getMaximumPoints ()
 Returns the maximum points, a learner can reach answering the question. More...
 
 calculateReachedPoints (int $active_id, ?int $pass=null, bool $authorized_solution=true)
 
 calculateReachedPointsFromPreviewSession (ilAssQuestionPreviewSession $previewSession)
 
 saveWorkingData (int $active_id, ?int $pass=null, bool $authorized=true)
 
 lookupForExistingSolutions (int $active_id, int $pass)
 
 removeExistingSolutions (int $active_id, int $pass)
 
 getQuestionType ()
 
 getAdditionalTableName ()
 
 getAnswerTableName ()
 
 deleteAnswers (int $question_id)
 
 getRTETextWithMediaObjects ()
 
 getBestSolution (array $solutions)
 
 setId (int $id=-1)
 
 setUnitrepository (\ilUnitConfigurationRepository $unitrepository)
 
 getUnitrepository ()
 
 validateSolutionSubmit ()
 
 getOperators (string $expression)
 Get all available operations for a specific question. More...
 
 getExpressionTypes ()
 Get all available expression types for a specific question. More...
 
 getUserQuestionResult (int $active_id, int $pass)
 Get the user solution for a question by active_id and the test pass. More...
 
 getAvailableAnswerOptions ($index=null)
 If index is null, the function returns an array with all anwser options Else it returns the specific answer option. More...
 
 toLog (AdditionalInformationGenerator $additional_info)
 MUST return an array of the question settings that can be stored in the log. More...
 
 solutionValuesToText (array $solution_values)
 MUST convert the given solution values into text. More...
 
 getCorrectSolutionForTextOutput (int $active_id, int $pass)
 
 getVariablesAsTextArray (int $active_id, int $pass)
 
- Public Member Functions inherited from assQuestion
 getQuestionType ()
 
 isComplete ()
 
 saveWorkingData (int $active_id, ?int $pass=null, bool $authorized=true)
 
 calculateReachedPoints (int $active_id, ?int $pass=null, bool $authorized_solution=true)
 
 getAdditionalTableName ()
 
 getAnswerTableName ()
 
 toLog (AdditionalInformationGenerator $additional_info)
 MUST return an array of the question settings that can be stored in the log. More...
 
 getCurrentUser ()
 
 getShuffler ()
 
 setShuffler (Transformation $shuffler)
 
 setProcessLocker (ilAssQuestionProcessLocker $processLocker)
 
 getProcessLocker ()
 
 fromXML (string $importdirectory, int $user_id, ilQTIItem $item, int $questionpool_id, ?int $tst_id, ?ilObject &$tst_object, int &$question_counter, array $import_mapping)
 
 toXML (bool $a_include_header=true, bool $a_include_binary=true, bool $a_shuffle=false, bool $test_output=false, bool $force_image_references=false)
 Returns a QTI xml representation of the question. More...
 
 setTitle (string $title="")
 
 setId (int $id=-1)
 
 setTestId (int $id=-1)
 
 setComment (string $comment="")
 
 setShuffle (?bool $shuffle=true)
 
 setAuthor (string $author="")
 
 setOwner (int $owner=-1)
 
 getTitle ()
 
 getTitleForHTMLOutput ()
 
 getTitleFilenameCompliant ()
 
 getId ()
 
 getShuffle ()
 
 getTestId ()
 
 getComment ()
 
 getDescriptionForHTMLOutput ()
 
 getThumbSize ()
 
 setThumbSize (int $a_size)
 
 getMinimumThumbSize ()
 
 getMaximumThumbSize ()
 
 getAuthor ()
 
 getAuthorForHTMLOutput ()
 
 getOwner ()
 
 getObjId ()
 
 setObjId (int $obj_id=0)
 
 getLifecycle ()
 
 setLifecycle (ilAssQuestionLifecycle $lifecycle)
 
 setExternalId (?string $external_id)
 
 getExternalId ()
 
 getSuggestedSolutionOutput ()
 
 getSuggestedSolutions ()
 
 getReachedPoints (int $active_id, int $pass)
 
 getMaximumPoints ()
 
 getAdjustedReachedPoints (int $active_id, int $pass, bool $authorized_solution=true)
 
 calculateResultsFromSolution (int $active_id, int $pass)
 Calculates the question results from a previously saved question solution. More...
 
 persistWorkingState (int $active_id, $pass, bool $authorized=true)
 persists the working state for current testactive and testpass More...
 
 persistPreviewState (ilAssQuestionPreviewSession $preview_session)
 persists the preview state for current user and question More...
 
 validateSolutionSubmit ()
 
 getSuggestedSolutionPath ()
 
 getImagePath ($question_id=null, $object_id=null)
 Returns the image path for web accessable images of a question. More...
 
 getSuggestedSolutionPathWeb ()
 
 getImagePathWeb ()
 Returns the web image path for web accessable images of a question. More...
 
 getTestOutputSolutions (int $activeId, int $pass)
 
 getUserSolutionPreferingIntermediate (int $active_id, ?int $pass=null)
 
 getSolutionValues (int $active_id, ?int $pass=null, bool $authorized=true)
 Loads solutions of a given user from the database an returns it. More...
 
 deleteAnswers (int $question_id)
 
 deleteAdditionalTableData (int $question_id)
 
 delete (int $question_id)
 
 getTotalAnswers ()
 
 cloneXHTMLMediaObjectsOfQuestion (int $source_question_id)
 
 createPageObject ()
 
 clonePageOfQuestion (int $a_q_id)
 
 getPageOfQuestion ()
 
 setOriginalId (?int $original_id)
 
 getOriginalId ()
 
 fixSvgToPng (string $imageFilenameContainingString)
 
 fixUnavailableSkinImageSources (string $html)
 
 loadFromDb (int $question_id)
 
 createNewQuestion (bool $a_create_page=true)
 Creates a new question without an owner when a new question is created This assures that an ID is given to the question if a file upload or something else occurs. More...
 
 saveQuestionDataToDb (?int $original_id=null)
 
 duplicate (bool $for_test=true, string $title='', string $author='', int $owner=-1, $test_obj_id=null)
 
 copyObject (int $target_parent_id, string $title='')
 
 createNewOriginalFromThisDuplicate (int $target_parent_id, string $target_question_title='')
 
 saveToDb (?int $original_id=null)
 
 deleteSuggestedSolutions ()
 
 getSuggestedSolution (int $subquestion_index=0)
 
 resolveInternalLink (string $internal_link)
 
 resolveSuggestedSolutionLinks ()
 
 getInternalLinkHref (string $target)
 
 syncWithOriginal ()
 
 getPoints ()
 
 setPoints (float $points)
 
 getSolutionMaxPass (int $active_id)
 
 isWriteable ()
 
 calculateReachedPointsFromPreviewSession (ilAssQuestionPreviewSession $preview_session)
 
 isPreviewSolutionCorrect (ilAssQuestionPreviewSession $preview_session)
 
 adjustReachedPointsByScoringOptions (float $points, int $active_id)
 Adjust the given reached points by checks for all special scoring options in the test container. More...
 
 buildHashedImageFilename (string $plain_image_filename, bool $unique=false)
 
 getQuestion ()
 
 getQuestionForHTMLOutput ()
 
 setQuestion (string $question="")
 
 getQuestionTypeID ()
 
 cleanupMediaObjectUsage ()
 
 getInstances ()
 
 getActiveUserData (int $active_id)
 Returns the user id and the test id for a given active id. More...
 
 hasSpecificFeedback ()
 
 getNrOfTries ()
 
 setNrOfTries (int $a_nr_of_tries)
 
 setExportImagePath (string $path)
 
 formatSAQuestion ($a_q)
 
 setPreventRteUsage (bool $prevent_rte_usage)
 
 getPreventRteUsage ()
 
 migrateContentForLearningModule (ilAssSelfAssessmentMigrator $migrator)
 
 setSelfAssessmentEditingMode (bool $selfassessmenteditingmode)
 
 getSelfAssessmentEditingMode ()
 
 setDefaultNrOfTries (int $defaultnroftries)
 
 getDefaultNrOfTries ()
 
 syncSkillAssignments (int $srcParentId, int $srcQuestionId, int $trgParentId, int $trgQuestionId)
 
 isAnswered (int $active_id, int $pass)
 
 getAdditionalContentEditingMode ()
 
 setAdditionalContentEditingMode (?string $additionalContentEditingMode)
 
 isAdditionalContentEditingModePageObject ()
 
 isValidAdditionalContentEditingMode (string $additionalContentEditingMode)
 
 getValidAdditionalContentEditingModes ()
 
 getHtmlUserSolutionPurifier ()
 
 getHtmlQuestionContentPurifier ()
 
 setLastChange (int $lastChange)
 
 getLastChange ()
 
 removeIntermediateSolution (int $active_id, int $pass)
 
 removeCurrentSolution (int $active_id, int $pass, bool $authorized=true)
 
 saveCurrentSolution (int $active_id, int $pass, $value1, $value2, bool $authorized=true, $tstamp=0)
 
 updateCurrentSolution (int $solutionId, $value1, $value2, bool $authorized=true)
 
 updateCurrentSolutionsAuthorization (int $activeId, int $pass, bool $authorized, bool $keepTime=false)
 
 setStep ($step)
 
 getStep ()
 
 toJSON ()
 
 intermediateSolutionExists (int $active_id, int $pass)
 
 authorizedSolutionExists (int $active_id, ?int $pass)
 
 authorizedOrIntermediateSolutionExists (int $active_id, int $pass)
 
 lookupForExistingSolutions (int $activeId, int $pass)
 Lookup if an authorized or intermediate solution exists. More...
 
 isAddableAnswerOptionValue (int $qIndex, string $answerOptionValue)
 
 addAnswerOptionValue (int $qIndex, string $answerOptionValue, float $points)
 
 removeAllExistingSolutions ()
 
 removeExistingSolutions (int $activeId, int $pass)
 
 resetUsersAnswer (int $activeId, int $pass)
 
 removeResultRecord (int $activeId, int $pass)
 
 fetchValuePairsFromIndexedValues (array $indexedValues)
 
 fetchIndexedValuesFromValuePairs (array $value_pairs)
 
 updateTimestamp ()
 
 getTestPresentationConfig ()
 
 hasWritableOriginalInQuestionPool ()
 
 answerToParticipantInteraction (AdditionalInformationGenerator $additional_info, int $test_ref_id, int $active_id, int $pass, string $source_ip, TestParticipantInteractionTypes $interaction_type)
 
 toQuestionAdministrationInteraction (AdditionalInformationGenerator $additional_info, int $test_ref_id, TestQuestionAdministrationInteractionTypes $interaction_type)
 
 getSolutionForTextOutput (int $active_id, int $pass)
 
 getCorrectSolutionForTextOutput (int $active_id, int $pass)
 
 getVariablesAsTextArray (int $active_id, int $pass)
 
 validateSolutionSubmit ()
 
 toLog (AdditionalInformationGenerator $additional_info)
 
 answerToParticipantInteraction (AdditionalInformationGenerator $additional_info, int $test_id, int $active_id, int $pass, string $source_ip, TestParticipantInteractionTypes $interaction_type)
 
 toQuestionAdministrationInteraction (AdditionalInformationGenerator $additional_info, int $test_id, TestQuestionAdministrationInteractionTypes $interaction_type)
 
- Public Member Functions inherited from iQuestionCondition
 getOperators (string $expression)
 Get all available operations for a specific question. More...
 
 getExpressionTypes ()
 Get all available expression types for a specific question. More...
 
 getUserQuestionResult (int $active_id, int $pass)
 Get the user solution for a question by active_id and the test pass. More...
 
 getAvailableAnswerOptions (?int $index=null)
 If index is null, the function returns an array with all anwser options else it returns the specific answer option. More...
 

Protected Member Functions

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

Protected Attributes

PassPresentedVariablesRepo $pass_presented_variables_repo
 
- Protected Attributes inherited from assQuestion
const HAS_SPECIFIC_FEEDBACK = true
 
GeneralQuestionPropertiesRepository $questionrepository
 
RequestDataCollector $questionpool_request
 
QuestionFiles $question_files
 
ilAssQuestionProcessLocker $processLocker
 
ilTestQuestionConfig $testQuestionConfig
 
SuggestedSolutionsDatabaseRepository $suggestedsolution_repo
 
ILIAS $ilias
 
ilGlobalPageTemplate $tpl
 
ilLanguage $lng
 
ilDBInterface $db
 
ilObjUser $current_user
 
SkillUsageService $skillUsageService
 
HTTPServices $http
 
Refinery $refinery
 
Transformation $shuffler
 
LoggingServices $log
 
Container $dic
 
ilAssQuestionLifecycle $lifecycle
 
ilAssQuestionPage $page
 
TestResultRepository $test_result_repository
 
int $id
 
string $title
 
string $comment
 
int $owner
 
string $author
 
int $thumb_size
 
string $question
 
float $points = 0.0
 
bool $shuffle = true
 
int $test_id
 
int $obj_id = 0
 
int $original_id = null
 
int $lastChange = null
 
string $external_id = null
 
int $step = null
 
array $suggested_solutions
 

Private Member Functions

 buildVariablesForLog (array $variables, string $none_tag)
 
 buildResultsForLog (array $results, string $none_tag)
 

Private Attributes

array $variables
 
array $results
 
array $resultunits
 
ilUnitConfigurationRepository $unitrepository
 

Additional Inherited Members

- Static Public Member Functions inherited from assQuestion
static setForcePassResultUpdateEnabled (bool $force_pass_results_update_enabled)
 
static isForcePassResultUpdateEnabled ()
 
static _getSuggestedSolutionOutput (int $question_id)
 
static _getReachedPoints (int $active_id, int $question_id, int $pass)
 
static isFileAvailable (string $file)
 
static saveOriginalId (int $questionId, int $originalId)
 
static resetOriginalId (int $questionId)
 
static instantiateQuestion (int $question_id)
 
static _getSolutionMaxPass (int $question_id, int $active_id)
 Returns the maximum pass a users question solution. More...
 
static getFeedbackClassNameByQuestionType (string $questionType)
 
static _questionExistsInTest (int $question_id, int $test_id)
 
static lookupParentObjId (int $question_id)
 
static implodeKeyValues (array $keyValues)
 
static explodeKeyValues (string $keyValues)
 
static convertISO8601FormatH_i_s_ExtendedToSeconds (string $time)
 
static extendedTrim (string $value)
 Trim non-printable characters from the beginning and end of a string. More...
 
- Data Fields inherited from assQuestion
const ADDITIONAL_CONTENT_EDITING_MODE_RTE = 'default'
 
const ADDITIONAL_CONTENT_EDITING_MODE_IPE = 'pageobject'
 
const TRIM_PATTERN = '/^[\p{C}\p{Z}]+|[\p{C}\p{Z}]+$/u'
 
ilAssQuestionFeedback $feedbackOBJ
 
bool $prevent_rte_usage = false
 
bool $selfassessmenteditingmode = false
 
int $defaultnroftries = 0
 
string $questionActionCmd = 'handleQuestionAction'
 
const KEY_VALUES_IMPLOSION_SEPARATOR = ':'
 
- Data Fields inherited from iQuestionCondition
const StringResultExpression = '~TEXT~'
 
const PercentageResultExpression = '%n%'
 
const NumericResultExpression = '#n#'
 
const MatchingResultExpression = ';n:m;'
 
const OrderingResultExpression = '$n,m,o,p$'
 
const NumberOfResultExpression = '+n+'
 
const ExclusiveResultExpression = '*n,m,o,p*'
 
const EmptyAnswerExpression = "?"
 
- Static Protected Member Functions inherited from assQuestion
static getNumExistingSolutionRecords (int $activeId, int $pass, int $questionId)
 
- Static Protected Attributes inherited from assQuestion
static $force_pass_results_update_enabled = false
 
static $imageSourceFixReplaceMap
 

Detailed Description

Class for single choice questions assFormulaQuestion is a class for single choice questions.

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
Version
Id
class.assFormulaQuestion.php 1236 2010-02-15 15:44:16Z hschottm

\

Definition at line 31 of file class.assFormulaQuestion.php.

Constructor & Destructor Documentation

◆ __construct()

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

Definition at line 39 of file class.assFormulaQuestion.php.

45 {
47 $this->variables = [];
48 $this->results = [];
49 $this->resultunits = [];
50 $this->unitrepository = new ilUnitConfigurationRepository(0);
51 $this->pass_presented_variables_repo = new PassPresentedVariablesRepo($this->db);
52 }
Stores random-generated parts of questions in order to present the user with a fixed question during ...
Class ilUnitConfigurationRepository.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc

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

+ Here is the call graph for this function:

Member Function Documentation

◆ addResult()

assFormulaQuestion::addResult ( assFormulaQuestionResult  $result)

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

95 : void
96 {
97 $this->results[$result->getResult()] = $result;
98 }

References assFormulaQuestionResult\getResult().

+ Here is the call graph for this function:

◆ addResultUnit()

assFormulaQuestion::addResultUnit ( ?assFormulaQuestionResult  $result,
?assFormulaQuestionUnit  $unit 
)

Definition at line 115 of file class.assFormulaQuestion.php.

118 : void {
119 if ($result === null || $unit === null) {
120 return;
121 }
122
123 if (!array_key_exists($result->getResult(), $this->resultunits) ||
124 !is_array($this->resultunits[$result->getResult()])) {
125 $this->resultunits[$result->getResult()] = [];
126 }
127 $this->resultunits[$result->getResult()][$unit->getId()] = $unit;
128 }

◆ addResultUnits()

assFormulaQuestion::addResultUnits ( ?assFormulaQuestionResult  $result,
?array  $unit_ids 
)

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

103 : void {
104 $this->resultunits[$result->getResult()] = [];
105 if ($result === null || $unit_ids === null) {
106 return;
107 }
108 foreach ($unit_ids as $id) {
109 if (is_numeric($id) && ($id > 0)) {
110 $this->resultunits[$result->getResult()][$id] = $this->getUnitrepository()->getUnit($id);
111 }
112 }
113 }

◆ addVariable()

assFormulaQuestion::addVariable ( assFormulaQuestionVariable  $variable)

Definition at line 72 of file class.assFormulaQuestion.php.

72 : void
73 {
74 $this->variables[$variable->getVariable()] = $variable;
75 }

References assFormulaQuestionVariable\getVariable().

+ Here is the call graph for this function:

◆ buildResultsForLog()

assFormulaQuestion::buildResultsForLog ( array  $results,
string  $none_tag 
)
private
Parameters
array<assFormulaQuestionResult>$variables

Definition at line 1320 of file class.assFormulaQuestion.php.

1320 : array
1321 {
1322 return array_reduce(
1323 $results,
1324 function (array $c, assFormulaQuestionResult $r) use ($none_tag): array {
1325 $c[$r->getResult()] = [
1326 AdditionalInformationGenerator::KEY_QUESTION_FORMULA_RESULT_TYPE => $r->getResultType(),
1327 AdditionalInformationGenerator::KEY_QUESTION_FORMULA_FORMULA => $r->getFormula(),
1328 AdditionalInformationGenerator::KEY_QUESTION_REACHABLE_POINTS => $r->getPoints(),
1329 AdditionalInformationGenerator::KEY_QUESTION_LOWER_LIMIT => $r->getRangeMinTxt(),
1330 AdditionalInformationGenerator::KEY_QUESTION_UPPER_LIMIT => $r->getRangeMaxTxt(),
1331 AdditionalInformationGenerator::KEY_QUESTION_FORMULA_TOLERANCE => $r->getTolerance(),
1332 AdditionalInformationGenerator::KEY_QUESTION_FORMULA_PRECISION => $r->getPrecision(),
1333 AdditionalInformationGenerator::KEY_QUESTION_FORMULA_UNIT => $r->getUnit() ?? $none_tag
1334 ];
1335 return $c;
1336 },
1337 []
1338 );
1339 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$c
Definition: deliver.php:25

References $c, $results, assFormulaQuestionResult\getFormula(), assFormulaQuestionResult\getPoints(), assFormulaQuestionResult\getPrecision(), assFormulaQuestionResult\getRangeMaxTxt(), assFormulaQuestionResult\getRangeMinTxt(), assFormulaQuestionResult\getResult(), assFormulaQuestionResult\getResultType(), assFormulaQuestionResult\getTolerance(), and assFormulaQuestionResult\getUnit().

+ Here is the call graph for this function:

◆ buildVariablesForLog()

assFormulaQuestion::buildVariablesForLog ( array  $variables,
string  $none_tag 
)
private
Parameters
array<assFormulaQuestionVariable>$variables

Definition at line 1298 of file class.assFormulaQuestion.php.

1298 : array
1299 {
1300 return array_reduce(
1301 $variables,
1302 function (array $c, assFormulaQuestionVariable $v) use ($none_tag): array {
1303 $c[$v->getVariable()] = [
1304 AdditionalInformationGenerator::KEY_QUESTION_LOWER_LIMIT => $v->getRangeMinTxt(),
1305 AdditionalInformationGenerator::KEY_QUESTION_UPPER_LIMIT => $v->getRangeMaxTxt(),
1306 AdditionalInformationGenerator::KEY_QUESTION_FORMULA_PRECISION => $v->getPrecision(),
1307 AdditionalInformationGenerator::KEY_QUESTION_FORMULA_INTPRECISION => $v->getIntprecision(),
1308 AdditionalInformationGenerator::KEY_QUESTION_FORMULA_UNIT => $v->getUnit() ?? $none_tag
1309 ];
1310 return $c;
1311 },
1312 []
1313 );
1314 }

References $c, assFormulaQuestionVariable\getIntprecision(), assFormulaQuestionVariable\getPrecision(), assFormulaQuestionVariable\getRangeMaxTxt(), assFormulaQuestionVariable\getRangeMinTxt(), assFormulaQuestionVariable\getUnit(), and assFormulaQuestionVariable\getVariable().

+ Here is the call graph for this function:

◆ calculateReachedPoints()

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

Reimplemented from assQuestion.

Definition at line 794 of file class.assFormulaQuestion.php.

798 : float {
799 if ($pass === null) {
800 $pass = $this->getSolutionMaxPass($active_id);
801 }
802 $solutions = $this->getSolutionValues($active_id, $pass, $authorized_solution);
803 $user_solution = [];
804 foreach ($solutions as $solution_value) {
805 if (preg_match('/^(\$v\d+)$/', $solution_value['value1'], $matches)) {
806 $user_solution[$matches[1]] = $solution_value['value2'];
807 $var_obj = $this->getVariable($solution_value['value1']);
808 $var_obj->setValue($solution_value['value2']);
809 continue;
810 }
811
812 if (preg_match('/^(\$r\d+)$/', $solution_value['value1'], $matches)) {
813 if (!array_key_exists($matches[1], $user_solution)) {
814 $user_solution[$matches[1]] = [];
815 }
816 $user_solution[$matches[1]]['value'] = $solution_value['value2'];
817 continue;
818 }
819
820 if (preg_match('/^(\$r\d+)_unit$/', $solution_value['value1'], $matches)) {
821 if (!array_key_exists($matches[1], $user_solution)) {
822 $user_solution[$matches[1]] = [];
823 }
824 $user_solution[$matches[1]]['unit'] = $this->unitrepository->getUnit(
825 $this->refinery->kindlyTo()->int()->transform($solution_value['value2']),
826 );
827 }
828 }
829
830 $points = 0;
831 foreach ($this->getResults() as $result) {
832 $points += $result->getReachedPoints(
833 $this->getVariables(),
834 $this->getResults(),
835 $user_solution[$result->getResult()]['value'] ?? '',
836 $user_solution[$result->getResult()]['unit'] ?? null,
837 $this->unitrepository->getUnits()
838 );
839 }
840
841 return (float) $points;
842 }
getVariable(string $variable)
getSolutionValues(int $active_id, ?int $pass=null, bool $authorized=true)
Loads solutions of a given user from the database an returns it.
getSolutionMaxPass(int $active_id)

◆ calculateReachedPointsFromPreviewSession()

assFormulaQuestion::calculateReachedPointsFromPreviewSession ( ilAssQuestionPreviewSession  $previewSession)

Reimplemented from assQuestion.

Definition at line 844 of file class.assFormulaQuestion.php.

845 {
846 $user_solution = $previewSession->getParticipantsSolution();
847
848 $points = 0;
849 foreach ($this->getResults() as $result) {
850 $unit_id = $user_solution[$result->getResult() . '_unit'] ?? null;
851 $points += $result->getReachedPoints(
852 $this->getVariables(),
853 $this->getResults(),
854 $user_solution[$result->getResult()] ?? '',
855 $unit_id !== null ? $this->unitrepository->getUnit($unit_id) : null,
856 $this->unitrepository->getUnits()
857 );
858 }
859 return $this->ensureNonNegativePoints($points);
860 }
ensureNonNegativePoints(float $points)

References ilAssQuestionPreviewSession\getParticipantsSolution().

+ Here is the call graph for this function:

◆ canUseAdvancedRating()

assFormulaQuestion::canUseAdvancedRating (   $result)

Check if advanced rating can be used for a result.

This is only possible if there is exactly one possible correct unit for the result, otherwise it is impossible to determine wheather the unit is correct or the value.

Returns
boolean True if advanced rating could be used, false otherwise

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

540 : bool
541 {
542 $result_units = $this->getResultUnits($result);
543 $resultunit = $result->getUnit();
544 $similar_units = 0;
545 foreach ($result_units as $unit) {
546 if (is_object($resultunit)) {
547 if ($resultunit->getId() != $unit->getId()) {
548 if ($resultunit->getBaseUnit() && $unit->getBaseUnit()) {
549 if ($resultunit->getBaseUnit() == $unit->getBaseUnit()) {
550 return false;
551 }
552 }
553 if ($resultunit->getBaseUnit()) {
554 if ($resultunit->getBaseUnit() == $unit->getId()) {
555 return false;
556 }
557 }
558 if ($unit->getBaseUnit()) {
559 if ($unit->getBaseUnit() == $resultunit->getId()) {
560 return false;
561 }
562 }
563 }
564 }
565 }
566 return true;
567 }
getResultUnits(assFormulaQuestionResult $result)

References assFormulaQuestionResult\getUnit().

+ Here is the call graph for this function:

◆ checkForDuplicateResults()

assFormulaQuestion::checkForDuplicateResults ( )

Definition at line 193 of file class.assFormulaQuestion.php.

193 : bool
194 {
195 if (preg_match_all('/(\$r\d+)/im', $this->getQuestion(), $rmatches)) {
196 if ((count(array_unique($rmatches[1]))) != count($rmatches[1])) {
197 return false;
198 }
199 }
200 return true;
201 }

◆ checkForDuplicateVariables()

assFormulaQuestion::checkForDuplicateVariables ( )

Definition at line 183 of file class.assFormulaQuestion.php.

183 : bool
184 {
185 if (preg_match_all('/(\$v\d+)/im', $this->getQuestion(), $matches)) {
186 if ((count(array_unique($matches[1]))) != count($matches[1])) {
187 return false;
188 }
189 }
190 return true;
191 }

◆ clearResults()

assFormulaQuestion::clearResults ( )

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

77 : void
78 {
79 $this->results = [];
80 }

◆ clearVariables()

assFormulaQuestion::clearVariables ( )

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

54 : void
55 {
56 $this->variables = [];
57 }

◆ cloneQuestionTypeSpecificProperties()

assFormulaQuestion::cloneQuestionTypeSpecificProperties ( \assQuestion  $target)
protected

Definition at line 774 of file class.assFormulaQuestion.php.

776 : \assQuestion {
777 $this->unitrepository->cloneUnits($this->getId(), $target->getId());
778 return $target;
779 }

◆ deleteAnswers()

assFormulaQuestion::deleteAnswers ( int  $question_id)

Reimplemented from assQuestion.

Definition at line 1038 of file class.assFormulaQuestion.php.

1038 : void
1039 {
1040 $affectedRows = $this->db->manipulateF(
1041 "DELETE FROM il_qpl_qst_fq_var WHERE question_fi = %s",
1042 ['integer'],
1043 [$question_id]
1044 );
1045
1046 $affectedRows = $this->db->manipulateF(
1047 "DELETE FROM il_qpl_qst_fq_res WHERE question_fi = %s",
1048 ['integer'],
1049 [$question_id]
1050 );
1051
1052 $affectedRows = $this->db->manipulateF(
1053 "DELETE FROM il_qpl_qst_fq_res_unit WHERE question_fi = %s",
1054 ['integer'],
1055 [$question_id]
1056 );
1057
1058 $affectedRows = $this->db->manipulateF(
1059 "DELETE FROM il_qpl_qst_fq_ucat WHERE question_fi = %s",
1060 ['integer'],
1061 [$question_id]
1062 );
1063
1064 $affectedRows = $this->db->manipulateF(
1065 "DELETE FROM il_qpl_qst_fq_unit WHERE question_fi = %s",
1066 ['integer'],
1067 [$question_id]
1068 );
1069 }

◆ fetchAllResults()

assFormulaQuestion::fetchAllResults (   $questionText)
Parameters
string$questionText
Returns
assFormulaQuestionResult[] $resObjects

Definition at line 207 of file class.assFormulaQuestion.php.

207 : array
208 {
209 $resObjects = [];
210 $matches = null;
211
212 if (preg_match_all('/(\$r\d+)/im', $questionText, $matches)) {
213 foreach ($matches[1] as $resultKey) {
214 $resObjects[] = $this->getResult($resultKey);
215 }
216 }
217
218 return $resObjects;
219 }

◆ fetchAllVariables()

assFormulaQuestion::fetchAllVariables ( string  $question_text)
Returns
list<assFormulaQuestionVariable>

Definition at line 224 of file class.assFormulaQuestion.php.

224 : array
225 {
226 $var_objects = [];
227 $matches = null;
228
229 if (preg_match_all('/(\$v\d+)/im', $question_text, $matches)) {
230 $var_objects = array_reduce(
231 $matches[1],
232 function (array $c, string $v): array {
233 $vo = $this->getVariable($v);
234 if ($vo !== null) {
235 $c[] = $vo;
236 }
237 return $c;
238 },
239 []
240 );
241 }
242
243 return $var_objects;
244 }

References $c.

◆ generateResultInputHTML()

assFormulaQuestion::generateResultInputHTML ( string  $result_key,
string  $result_value,
bool  $forsolution 
)
protected

Definition at line 520 of file class.assFormulaQuestion.php.

520 : string
521 {
522 if ($forsolution) {
523 return '<span class="ilc_qinput_TextInput solutionbox">'
525 . '</span>';
526 }
527 $input = '<input class="ilc_qinput_TextInput" type="text"';
528 $input .= 'spellcheck="false" autocomplete="off" autocorrect="off" autocapitalize="off"';
529 $input .= 'name="result_' . $result_key . '"';
530 $input .= ' value="' . $result_value . '"/>';
531 return $input;
532 }
static prepareFormOutput($a_str, bool $a_strip=false)

References ilLegacyFormElementsUtil\prepareFormOutput().

+ Here is the call graph for this function:

◆ getAdditionalTableName()

assFormulaQuestion::getAdditionalTableName ( )

Reimplemented from assQuestion.

Definition at line 1028 of file class.assFormulaQuestion.php.

1028 : string
1029 {
1030 return "";
1031 }

◆ getAllResultUnits()

assFormulaQuestion::getAllResultUnits ( )

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

147 : array
148 {
149 return $this->resultunits;
150 }

◆ getAnswerTableName()

assFormulaQuestion::getAnswerTableName ( )

Reimplemented from assQuestion.

Definition at line 1033 of file class.assFormulaQuestion.php.

1033 : string
1034 {
1035 return "";
1036 }

◆ getAvailableAnswerOptions()

assFormulaQuestion::getAvailableAnswerOptions (   $index = null)

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

Parameters
null | int$index
Returns
array|ASS_AnswerSimple

Definition at line 1264 of file class.assFormulaQuestion.php.

1265 {
1266 if ($index !== null) {
1267 return $this->getResult('$r' . ($index + 1));
1268 } else {
1269 return $this->getResults();
1270 }
1271 }

◆ getBestSolution()

assFormulaQuestion::getBestSolution ( array  $solutions)

Definition at line 1077 of file class.assFormulaQuestion.php.

1077 : array
1078 {
1079 $user_solution = [];
1080
1081 foreach ($solutions as $solution_value) {
1082 if (preg_match('/^(\$v\d+)$/', $solution_value['value1'], $matches)) {
1083 $user_solution[$matches[1]] = $solution_value['value2'];
1084 $varObj = $this->getVariable($matches[1]);
1085 $varObj->setValue($solution_value['value2']);
1086 } elseif (preg_match('/^(\$r\d+)$/', $solution_value['value1'], $matches)) {
1087 if (!array_key_exists($matches[1], $user_solution)) {
1088 $user_solution[$matches[1]] = [];
1089 }
1090 $user_solution[$matches[1]]['value'] = $solution_value['value2'];
1091 } elseif (preg_match('/^(\$r\d+)_unit$/', $solution_value['value1'], $matches)) {
1092 if (!array_key_exists($matches[1], $user_solution)) {
1093 $user_solution[$matches[1]] = [];
1094 }
1095 $user_solution[$matches[1]]['unit'] = $solution_value['value2'];
1096 }
1097 }
1098 foreach ($this->getResults() as $result) {
1099 $resVal = $result->calculateFormula($this->getVariables(), $this->getResults(), $this->getId(), false);
1100
1101 if (is_object($result->getUnit())) {
1102 $user_solution[$result->getResult()]['unit'] = $result->getUnit()->getId();
1103 $user_solution[$result->getResult()]['value'] = $resVal;
1104 } elseif ($result->getUnit() === null) {
1105 $unit_factor = 1;
1106 // there is no fix result_unit, any "available unit" is accepted
1107
1108 $available_units = $result->getAvailableResultUnits(parent::getId());
1109 $result_name = $result->getResult();
1110
1111 $check_unit = false;
1112 if (array_key_exists($result_name, $available_units) &&
1113 $available_units[$result_name] !== null) {
1114 $check_unit = in_array($user_solution[$result_name]['unit'] ?? null, $available_units[$result_name]);
1115 }
1116
1117 if ($check_unit == true) {
1118 //get unit-factor
1119 $unit_factor = assFormulaQuestionUnit::lookupUnitFactor($user_solution[$result_name]['unit']);
1120 }
1121
1122 try {
1123 $user_solution[$result->getResult()]['value'] = ilMath::_div($resVal, $unit_factor, 55);
1124 } catch (ilMathDivisionByZeroException $ex) {
1125 $user_solution[$result->getResult()]['value'] = 0;
1126 }
1127 }
1128 if ($result->getResultType() == assFormulaQuestionResult::RESULT_CO_FRAC
1129 || $result->getResultType() == assFormulaQuestionResult::RESULT_FRAC) {
1131 if (is_array($value)) {
1132 $user_solution[$result->getResult()]['value'] = $value[0];
1133 $user_solution[$result->getResult()]['frac_helper'] = $value[1];
1134 } else {
1135 $user_solution[$result->getResult()]['value'] = $value;
1136 $user_solution[$result->getResult()]['frac_helper'] = null;
1137 }
1138 } else {
1139 $user_solution[$result->getResult()]['value'] = round((float) $user_solution[$result->getResult()]['value'], $result->getPrecision());
1140 }
1141 }
1142 return $user_solution;
1143 }
static convertDecimalToCoprimeFraction($decimal_value, $tolerance=1.e-9)
static lookupUnitFactor(int $a_unit_id)
static _div($left_operand, $right_operand, int $scale=50)

References ilMath\_div(), assFormulaQuestionResult\convertDecimalToCoprimeFraction(), ILIAS\Survey\Mode\getId(), assFormulaQuestionUnit\lookupUnitFactor(), assFormulaQuestionResult\RESULT_CO_FRAC, and assFormulaQuestionResult\RESULT_FRAC.

+ Here is the call graph for this function:

◆ getCorrectSolutionForTextOutput()

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

Reimplemented from assQuestion.

Definition at line 1396 of file class.assFormulaQuestion.php.

1396 : array
1397 {
1398 $best_solution = $this->getBestSolution($this->getSolutionValues($active_id, $pass));
1399 return array_map(
1400 function (string $v) use ($best_solution): string {
1401 $solution = "{$v} = {$best_solution[$v]['value']}";
1402 if (isset($best_solution['unit'])) {
1403 $solution .= "{$this->unitrepository->getUnit($best_solution['unit'])->getUnit()}";
1404 }
1405 return $solution;
1406 },
1407 array_keys($best_solution)
1408 );
1409 }
getBestSolution(array $solutions)

◆ getExpressionTypes()

assFormulaQuestion::getExpressionTypes ( )

◆ getInitialVariableSolutionValues()

assFormulaQuestion::getInitialVariableSolutionValues ( )

Definition at line 287 of file class.assFormulaQuestion.php.

287 : array
288 {
289 foreach ($this->fetchAllResults($this->getQuestion()) as $resObj) {
290 $resObj->findValidRandomVariables($this->getVariables(), $this->getResults());
291 }
292
293 $variableSolutionValues = [];
294
295 foreach ($this->fetchAllVariables($this->getQuestion()) as $varObj) {
296 $variableSolutionValues[$varObj->getVariable()] = $varObj->getValue();
297 }
298
299 return $variableSolutionValues;
300 }
fetchAllVariables(string $question_text)

◆ getMaximumPoints()

assFormulaQuestion::getMaximumPoints ( )

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

See also
$points

Reimplemented from assQuestion.

Definition at line 785 of file class.assFormulaQuestion.php.

785 : float
786 {
787 $points = 0;
788 foreach ($this->results as $result) {
789 $points += $result->getPoints();
790 }
791 return $points;
792 }

◆ getOperators()

assFormulaQuestion::getOperators ( string  $expression)

Get all available operations for a specific question.

Parameters
$expression

Implements iQuestionCondition.

Definition at line 1207 of file class.assFormulaQuestion.php.

1207 : array
1208 {
1210 }
static getOperatorsByExpression(string $expression)

References ilOperatorsExpressionMapping\getOperatorsByExpression().

+ Here is the call graph for this function:

◆ getQuestionType()

assFormulaQuestion::getQuestionType ( )

Reimplemented from assQuestion.

Definition at line 1023 of file class.assFormulaQuestion.php.

1023 : string
1024 {
1025 return "assFormulaQuestion";
1026 }

◆ getResult()

assFormulaQuestion::getResult ( string  $result)

Definition at line 87 of file class.assFormulaQuestion.php.

88 {
89 if (array_key_exists($result, $this->results)) {
90 return $this->results[$result];
91 }
92 return null;
93 }

◆ getResults()

assFormulaQuestion::getResults ( )

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

82 : array
83 {
84 return $this->results;
85 }

References $results.

◆ getResultUnits()

assFormulaQuestion::getResultUnits ( assFormulaQuestionResult  $result)

Definition at line 130 of file class.assFormulaQuestion.php.

130 : array
131 {
132 if (!isset($this->resultunits[$result->getResult()])) {
133 return [];
134 }
135
136 $result_units = $this->resultunits[$result->getResult()];
137
138 usort(
139 $result_units,
141 $a->getSequence() <=> $b->getSequence()
142 );
143
144 return $result_units;
145 }
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples

References Vendor\Package\$a, Vendor\Package\$b, and assFormulaQuestionResult\getResult().

+ Here is the call graph for this function:

◆ getRTETextWithMediaObjects()

assFormulaQuestion::getRTETextWithMediaObjects ( )

Reimplemented from assQuestion.

Definition at line 1071 of file class.assFormulaQuestion.php.

1071 : string
1072 {
1073 $text = parent::getRTETextWithMediaObjects();
1074 return $text;
1075 }

◆ getSolutionSubmit()

assFormulaQuestion::getSolutionSubmit ( )
protected
Returns
array<string>

Definition at line 1164 of file class.assFormulaQuestion.php.

1164 : array
1165 {
1166 $solutionSubmit = [];
1167
1168 $post = $this->dic->http()->wrapper()->post();
1169
1170 foreach ($this->getResults() as $index => $a) {
1171 $key = "result_$index";
1172 if ($post->has($key)) {
1173 $value = $post->retrieve(
1174 $key,
1175 $this->dic->refinery()->kindlyTo()->string()
1176 );
1177
1178 $solutionSubmit[$key] = $value;
1179 }
1180 if ($post->has($key . "_unit")) {
1181 $value = $post->retrieve(
1182 $key . "_unit",
1183 $this->dic->refinery()->kindlyTo()->string()
1184 );
1185 $solutionSubmit[$key . "_unit"] = $value;
1186 }
1187 }
1188 return $solutionSubmit;
1189 }
$post
Definition: ltitoken.php:46

References Vendor\Package\$a, and $post.

◆ getUnitrepository()

assFormulaQuestion::getUnitrepository ( )

Definition at line 1156 of file class.assFormulaQuestion.php.

1157 {
1158 return $this->unitrepository;
1159 }
ilUnitConfigurationRepository $unitrepository

◆ getUserQuestionResult()

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

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

Implements iQuestionCondition.

Definition at line 1221 of file class.assFormulaQuestion.php.

1225 $result = new ilUserQuestionResult($this, $active_id, $pass);
1226
1227 $maxStep = $this->lookupMaxStep($active_id, $pass);
1228 if ($maxStep > 0) {
1229 $data = $this->db->queryF(
1230 "SELECT value1, value2 FROM tst_solutions WHERE active_fi = %s AND pass = %s AND question_fi = %s AND step = %s",
1231 ['integer', 'integer', 'integer','integer'],
1232 [$active_id, $pass, $this->getId(), $maxStep]
1233 );
1234 } else {
1235 $data = $this->db->queryF(
1236 "SELECT value1, value2 FROM tst_solutions WHERE active_fi = %s AND pass = %s AND question_fi = %s",
1237 ['integer', 'integer', 'integer'],
1238 [$active_id, $pass, $this->getId()]
1239 );
1240 }
1241
1242 while ($row = $this->db->fetchAssoc($data)) {
1243 if (strstr($row['value1'], '$r') && $row['value2'] != null) {
1244 $result->addKeyValue(str_replace('$r', "", $row['value1']), $row['value2']);
1245 }
1246 }
1247
1248 $points = $this->calculateReachedPoints($active_id, $pass);
1249 $max_points = $this->getMaximumPoints();
1250
1251 $result->setReachedPercentage(($points / $max_points) * 100);
1252
1253 return $result;
1254 }
calculateReachedPoints(int $active_id, ?int $pass=null, bool $authorized_solution=true)
getMaximumPoints()
Returns the maximum points, a learner can reach answering the question.
lookupMaxStep(int $active_id, int $pass)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...

◆ getVariable()

assFormulaQuestion::getVariable ( string  $variable)

Definition at line 64 of file class.assFormulaQuestion.php.

65 {
66 if (array_key_exists($variable, $this->variables)) {
67 return $this->variables[$variable];
68 }
69 return null;
70 }

◆ getVariables()

assFormulaQuestion::getVariables ( )

Definition at line 59 of file class.assFormulaQuestion.php.

59 : array
60 {
61 return $this->variables;
62 }

References $variables.

◆ getVariablesAsTextArray()

assFormulaQuestion::getVariablesAsTextArray ( int  $active_id,
int  $pass 
)

Reimplemented from assQuestion.

Definition at line 1411 of file class.assFormulaQuestion.php.

1411 : array
1412 {
1413 $variables = $this->getVariableSolutionValuesForPass($active_id, $pass);
1414 return array_map(
1415 function (string $v) use ($variables): string {
1416 $variable = "{$v} = {$variables[$v]}";
1417 if ($this->getVariable($v)->getUnit() !== null) {
1418 $variable .= $this->getVariable($v)->getUnit()->getUnit();
1419 }
1420 return $variable;
1421 },
1422 array_keys($variables)
1423 );
1424 }
getVariableSolutionValuesForPass(int $active_id, int $pass)

◆ getVariableSolutionValuesForPass()

assFormulaQuestion::getVariableSolutionValuesForPass ( int  $active_id,
int  $pass 
)

Definition at line 265 of file class.assFormulaQuestion.php.

268 : array {
269 $question_id = $this->getId();
270 $values = $this->pass_presented_variables_repo->getFor(
271 $question_id,
272 $active_id,
273 $pass
274 );
275 if (is_null($values)) {
276 $values = $this->getInitialVariableSolutionValues();
277 $this->pass_presented_variables_repo->store(
278 $question_id,
279 $active_id,
280 $pass,
281 $values
282 );
283 }
284 return $values;
285 }

◆ hasRequiredVariableSolutionValues()

assFormulaQuestion::hasRequiredVariableSolutionValues ( array  $userSolution)
Parameters
array$userSolution
Returns
bool

Definition at line 250 of file class.assFormulaQuestion.php.

250 : bool
251 {
252 foreach ($this->fetchAllVariables($this->getQuestion()) as $varObj) {
253 if (!isset($userSolution[$varObj->getVariable()])) {
254 return false;
255 }
256
257 if ($userSolution[$varObj->getVariable()] === '') {
258 return false;
259 }
260 }
261
262 return true;
263 }

◆ hasResultUnit()

assFormulaQuestion::hasResultUnit ( assFormulaQuestionResult  $result,
int  $unit_id 
)

Definition at line 152 of file class.assFormulaQuestion.php.

155 : bool {
156 if (array_key_exists($result->getResult(), $this->resultunits)
157 && array_key_exists($unit_id, $this->resultunits[$result->getResult()])) {
158 return true;
159 }
160
161 return false;
162 }

◆ isComplete()

assFormulaQuestion::isComplete ( )

Returns true, if the question is complete for use.

Returns
boolean True, if the single choice question is complete for use, otherwise false

Reimplemented from assQuestion.

Definition at line 573 of file class.assFormulaQuestion.php.

573 : bool
574 {
575 if (($this->title) and ($this->author) and ($this->question) and ($this->getMaximumPoints() > 0)) {
576 return true;
577 } else {
578 return false;
579 }
580 }

◆ isValidSolutionResultValue()

assFormulaQuestion::isValidSolutionResultValue ( string  $submittedValue)
protected

Definition at line 862 of file class.assFormulaQuestion.php.

862 : bool
863 {
864 $submittedValue = str_replace(',', '.', $submittedValue);
865
866 if (is_numeric($submittedValue)) {
867 return true;
868 }
869
870 if (preg_match('/^[-+]?\d+\/\d+$/', $submittedValue)) {
871 return true;
872 }
873
874 return false;
875 }

◆ loadFromDb()

assFormulaQuestion::loadFromDb ( int  $question_id)

Reimplemented from assQuestion.

Definition at line 678 of file class.assFormulaQuestion.php.

678 : void
679 {
680 $result = $this->db->queryF(
681 "SELECT qpl_questions.* FROM qpl_questions WHERE question_id = %s",
682 ['integer'],
683 [$question_id]
684 );
685 if ($result->numRows() == 1) {
686 $data = $this->db->fetchAssoc($result);
687 $this->setId($question_id);
688 $this->setTitle((string) $data["title"]);
689 $this->setComment((string) $data["description"]);
690 $this->setPoints($data['points']);
691 $this->setOriginalId($data["original_id"]);
692 $this->setObjId($data["obj_fi"]);
693 $this->setAuthor($data["author"]);
694 $this->setOwner($data["owner"]);
695
696 try {
700 }
701
702 try {
703 $this->setAdditionalContentEditingMode($data['add_cont_edit_mode']);
705 }
706
707 $this->unitrepository = new ilUnitConfigurationRepository($question_id);
708
709 $this->setQuestion(ilRTE::_replaceMediaObjectImageSrc((string) $data["question_text"], 1));
710
711 // load variables
712 $result = $this->db->queryF(
713 "SELECT * FROM il_qpl_qst_fq_var WHERE question_fi = %s",
714 ['integer'],
715 [$question_id]
716 );
717 if ($result->numRows() > 0) {
718 while ($data = $this->db->fetchAssoc($result)) {
719 $varObj = new assFormulaQuestionVariable(
720 $data['variable'],
721 $data['range_min_txt'],
722 $data['range_max_txt'],
723 $this->getUnitrepository()->getUnit($data['unit_fi']),
724 $data['varprecision'],
725 $data['intprecision']
726 );
727 $this->addVariable($varObj);
728 }
729 }
730 // load results
731 $result = $this->db->queryF(
732 "SELECT * FROM il_qpl_qst_fq_res WHERE question_fi = %s",
733 ['integer'],
734 [$question_id]
735 );
736 if ($result->numRows() > 0) {
737 while ($data = $this->db->fetchAssoc($result)) {
738 $resObj = new assFormulaQuestionResult(
739 $data['result'],
740 $data['range_min_txt'],
741 $data['range_max_txt'],
742 $data['tolerance'],
743 $this->getUnitrepository()->getUnit($data['unit_fi']),
744 $data['formula'],
745 $data['points'],
746 $data['resprecision'],
747 $data['rating_simple'] === 1,
748 $data['rating_sign'],
749 $data['rating_value'],
750 $data['rating_unit']
751 );
752 $resObj->setResultType($data['result_type']);
753 $this->addResult($resObj);
754 }
755 }
756
757 // load result units
758 $result = $this->db->queryF(
759 "SELECT * FROM il_qpl_qst_fq_res_unit WHERE question_fi = %s",
760 ['integer'],
761 [$question_id]
762 );
763 if ($result->numRows() > 0) {
764 while ($data = $this->db->fetchAssoc($result)) {
765 $unit = $this->getUnitrepository()->getUnit($data["unit_fi"]);
766 $resObj = $this->getResult($data["result"]);
767 $this->addResultUnit($resObj, $unit);
768 }
769 }
770 }
771 parent::loadFromDb($question_id);
772 }
addVariable(assFormulaQuestionVariable $variable)
addResult(assFormulaQuestionResult $result)
addResultUnit(?assFormulaQuestionResult $result, ?assFormulaQuestionUnit $unit)
setOriginalId(?int $original_id)
setAdditionalContentEditingMode(?string $additionalContentEditingMode)
setQuestion(string $question="")
setAuthor(string $author="")
setComment(string $comment="")
setObjId(int $obj_id=0)
setOwner(int $owner=-1)
setLifecycle(ilAssQuestionLifecycle $lifecycle)
setTitle(string $title="")
setPoints(float $points)
static _replaceMediaObjectImageSrc(string $a_text, int $a_direction=0, string $nic='')
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...

References $data, Vendor\Package\$e, ilRTE\_replaceMediaObjectImageSrc(), ilAssQuestionLifecycle\getDraftInstance(), ilAssQuestionLifecycle\getInstance(), and assFormulaQuestionResult\getUnit().

+ Here is the call graph for this function:

◆ lookupForExistingSolutions()

assFormulaQuestion::lookupForExistingSolutions ( int  $active_id,
int  $pass 
)
Returns
array<'authorized' => bool, 'intermediate' => bool>

Reimplemented from assQuestion.

Definition at line 951 of file class.assFormulaQuestion.php.

951 : array
952 {
953 $return = [
954 'authorized' => false,
955 'intermediate' => false
956 ];
957
958 $query = "
959 SELECT authorized, COUNT(*) cnt
960 FROM tst_solutions
961 WHERE active_fi = " . $this->db->quote($active_id, 'integer') . "
962 AND question_fi = " . $this->db->quote($this->getId(), 'integer') . "
963 AND pass = " . $this->db->quote($pass, 'integer') . "
964 AND value1 like '\$r%'
965 AND value2 is not null
966 AND value2 <> ''
967 ";
968
969 if ($this->getStep() !== null) {
970 $query .= " AND step = " . $this->db->quote((int) $this->getStep(), 'integer') . " ";
971 }
972
973 $query .= "
974 GROUP BY authorized
975 ";
976
977 $result = $this->db->query($query);
978
979 while ($row = $this->db->fetchAssoc($result)) {
980 if ($row['authorized']) {
981 $return['authorized'] = $row['cnt'] > 0;
982 } else {
983 $return['intermediate'] = $row['cnt'] > 0;
984 }
985 }
986 return $return;
987 }

References ILIAS\Survey\Mode\getId().

+ Here is the call graph for this function:

◆ parseQuestionText()

assFormulaQuestion::parseQuestionText ( )

Definition at line 164 of file class.assFormulaQuestion.php.

164 : void
165 {
166 $this->clearResults();
167 $this->clearVariables();
168 if (preg_match_all('/(\$v\d+)/im', $this->getQuestion(), $matches)) {
169 foreach ($matches[1] as $variable) {
170 $varObj = new assFormulaQuestionVariable($variable, '0.0', '0.0', null, 0);
171 $this->addVariable($varObj);
172 }
173 }
174
175 if (preg_match_all('/(\$r\d+)/im', $this->getQuestion(), $rmatches)) {
176 foreach ($rmatches[1] as $result) {
177 $resObj = new assFormulaQuestionResult($result, null, null, 0, null, null, 1, 1, true);
178 $this->addResult($resObj);
179 }
180 }
181 }

◆ removeExistingSolutions()

assFormulaQuestion::removeExistingSolutions ( int  $active_id,
int  $pass 
)

Reimplemented from assQuestion.

Definition at line 989 of file class.assFormulaQuestion.php.

989 : int
990 {
991 $query = "
992 DELETE FROM tst_solutions
993 WHERE active_fi = " . $this->db->quote($active_id, 'integer') . "
994 AND question_fi = " . $this->db->quote($this->getId(), 'integer') . "
995 AND pass = " . $this->db->quote($pass, 'integer') . "
996 AND value1 like '\$r%'
997 ";
998
999 if ($this->getStep() !== null) {
1000 $query .= " AND step = " . $this->db->quote((int) $this->getStep(), 'integer') . " ";
1001 }
1002
1003 return $this->db->manipulate($query);
1004 }

References ILIAS\Survey\Mode\getId().

+ Here is the call graph for this function:

◆ saveCurrentSolution()

assFormulaQuestion::saveCurrentSolution ( int  $active_id,
int  $pass,
  $value1,
  $value2,
bool  $authorized = true,
  $tstamp = 0 
)

Reimplemented from assQuestion.

Definition at line 302 of file class.assFormulaQuestion.php.

302 : int
303 {
304 $init_solution_vars = $this->getVariableSolutionValuesForPass($active_id, $pass);
305 foreach ($init_solution_vars as $val1 => $val2) {
306 $this->db->manipulateF(
307 "DELETE FROM tst_solutions WHERE active_fi = %s AND question_fi = %s AND pass = %s AND value1 = %s",
308 ['integer', 'integer','integer', 'text'],
309 [$active_id, $this->getId(), $pass, $val1]
310 );
311 parent::saveCurrentSolution($active_id, $pass, $val1, $val2, $authorized);
312 }
313 return parent::saveCurrentSolution($active_id, $pass, $value1, $value2, $authorized, $tstamp);
314 }

References ILIAS\Survey\Mode\getId().

+ Here is the call graph for this function:

◆ savePreviewData()

assFormulaQuestion::savePreviewData ( ilAssQuestionPreviewSession  $previewSession)
protected

Reimplemented from assQuestion.

Definition at line 1006 of file class.assFormulaQuestion.php.

1006 : void
1007 {
1008 $userSolution = $previewSession->getParticipantsSolution();
1009
1010 foreach ($this->getSolutionSubmit() as $key => $val) {
1011 $matches = null;
1012
1013 if (preg_match('/^result_(\$r\d+)$/', $key, $matches)) {
1014 $userSolution[$matches[1]] = $val;
1015 } elseif (preg_match('/^result_(\$r\d+)_unit$/', $key, $matches)) {
1016 $userSolution[$matches[1] . "_unit"] = $val;
1017 }
1018 }
1019
1020 $previewSession->setParticipantsSolution($userSolution);
1021 }

References ilAssQuestionPreviewSession\getParticipantsSolution(), and ilAssQuestionPreviewSession\setParticipantsSolution().

+ Here is the call graph for this function:

◆ saveToDb()

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

Reimplemented from assQuestion.

Definition at line 582 of file class.assFormulaQuestion.php.

582 : void
583 {
585 // save variables
586 $affectedRows = $this->db->manipulateF(
587 "
588 DELETE FROM il_qpl_qst_fq_var
589 WHERE question_fi = %s",
590 ['integer'],
591 [$this->getId()]
592 );
593
594 foreach ($this->variables as $variable) {
595 $next_id = $this->db->nextId('il_qpl_qst_fq_var');
596 $this->db->insert(
597 'il_qpl_qst_fq_var',
598 [
599 'variable_id' => ['integer', $next_id],
600 'question_fi' => ['integer', $this->getId()],
601 'variable' => ['text', $variable->getVariable()],
602 'range_min' => ['float', $variable->getRangeMin()],
603 'range_max' => ['float', $variable->getRangeMax()],
604 'unit_fi' => ['integer', (is_object($variable->getUnit()) ? (int) $variable->getUnit()->getId() : 0)],
605 'varprecision' => ['integer', (int) $variable->getPrecision()],
606 'intprecision' => ['integer', (int) $variable->getIntprecision()],
607 'range_min_txt' => ['text', $variable->getRangeMinTxt()],
608 'range_max_txt' => ['text', $variable->getRangeMaxTxt()]
609 ]
610 );
611 }
612 // save results
613 $affectedRows = $this->db->manipulateF(
614 "DELETE FROM il_qpl_qst_fq_res WHERE question_fi = %s",
615 ['integer'],
616 [$this->getId()]
617 );
618
619 foreach ($this->results as $result) {
620 $next_id = $this->db->nextId('il_qpl_qst_fq_res');
621 if (is_object($result->getUnit())) {
622 $tmp_result_unit = $result->getUnit()->getId();
623 } else {
624 $tmp_result_unit = null;
625 }
626
627 $formula = null;
628 if ($result->getFormula() !== null) {
629 $formula = str_replace(",", ".", $result->getFormula());
630 }
631
632 $this->db->insert("il_qpl_qst_fq_res", [
633 "result_id" => ['integer', $next_id],
634 "question_fi" => ['integer', $this->getId()],
635 "result" => ["text", $result->getResult()],
636 "range_min" => ["float", $result->getRangeMin()],
637 "range_max" => ["float", $result->getRangeMax()],
638 "tolerance" => ["float", $result->getTolerance()],
639 "unit_fi" => ['integer', (int) $tmp_result_unit],
640 "formula" => ["clob", $formula],
641 "resprecision" => ['integer', $result->getPrecision()],
642 "rating_simple" => ['integer', ($result->getRatingSimple()) ? 1 : 0],
643 "rating_sign" => ["float", ($result->getRatingSimple()) ? 0 : $result->getRatingSign()],
644 "rating_value" => ["float", ($result->getRatingSimple()) ? 0 : $result->getRatingValue()],
645 "rating_unit" => ["float", ($result->getRatingSimple()) ? 0 : $result->getRatingUnit()],
646 "points" => ["float", $result->getPoints()],
647 "result_type" => ['integer', (int) $result->getResultType()],
648 "range_min_txt" => ["text", $result->getRangeMinTxt()],
649 "range_max_txt" => ["text", $result->getRangeMaxTxt()]
650
651 ]);
652 }
653 // save result units
654 $affectedRows = $this->db->manipulateF(
655 "DELETE FROM il_qpl_qst_fq_res_unit WHERE question_fi = %s",
656 ['integer'],
657 [$this->getId()]
658 );
659 foreach ($this->results as $result) {
660 foreach ($this->getResultUnits($result) as $unit) {
661 $next_id = $this->db->nextId('il_qpl_qst_fq_res_unit');
662 $affectedRows = $this->db->manipulateF(
663 "INSERT INTO il_qpl_qst_fq_res_unit (result_unit_id, question_fi, result, unit_fi) VALUES (%s, %s, %s, %s)",
664 ['integer', 'integer', 'text', 'integer'],
665 [
666 $next_id,
667 $this->getId(),
668 $result->getResult(),
669 $unit->getId()
670 ]
671 );
672 }
673 }
674
675 parent::saveToDb();
676 }
saveQuestionDataToDb(?int $original_id=null)

References ILIAS\Survey\Mode\getId().

+ Here is the call graph for this function:

◆ saveWorkingData()

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

Reimplemented from assQuestion.

Definition at line 877 of file class.assFormulaQuestion.php.

881 : bool {
882 if (is_null($pass)) {
883 $pass = ilObjTest::_getPass($active_id);
884 }
885
886 $answer = $this->getSolutionSubmit();
887 $this->getProcessLocker()->executeUserSolutionUpdateLockOperation(
888 function () use ($answer, $active_id, $pass, $authorized) {
889 foreach ($answer as $key => $value) {
890 $matches = null;
891 if (preg_match('/^result_(\$r\d+)$/', $key, $matches) !== false) {
892 $queryResult = "SELECT solution_id FROM tst_solutions WHERE active_fi = %s AND pass = %s AND question_fi = %s AND authorized = %s AND " . $this->db->like('value1', 'clob', $matches[1]);
893
894 if ($this->getStep() !== null) {
895 $queryResult .= " AND step = " . $this->db->quote((int) $this->getStep(), 'integer') . " ";
896 }
897
898 $result = $this->db->queryF(
899 $queryResult,
900 ['integer', 'integer', 'integer', 'integer'],
901 [$active_id, $pass, $this->getId(), (int) $authorized]
902 );
903 if ($result->numRows()) {
904 while ($row = $this->db->fetchAssoc($result)) {
905 $this->db->manipulateF(
906 "DELETE FROM tst_solutions WHERE solution_id = %s AND authorized = %s",
907 ['integer', 'integer'],
908 [$row['solution_id'], (int) $authorized]
909 );
910 }
911 }
912
913 $this->saveCurrentSolution($active_id, $pass, $matches[1], str_replace(",", ".", $value), $authorized);
914 continue;
915 }
916
917 if (preg_match('/^result_(\$r\d+)_unit$/', $key, $matches) !== false) {
918 $queryResultUnit = "SELECT solution_id FROM tst_solutions WHERE active_fi = %s AND pass = %s AND question_fi = %s AND authorized = %s AND " . $this->db->like('value1', 'clob', $matches[1] . "_unit");
919
920 if ($this->getStep() !== null) {
921 $queryResultUnit .= " AND step = " . $this->db->quote((int) $this->getStep(), 'integer') . " ";
922 }
923
924 $result = $this->db->queryF(
925 $queryResultUnit,
926 ['integer', 'integer', 'integer', 'integer'],
927 [$active_id, $pass, $this->getId(), (int) $authorized]
928 );
929 if ($result->numRows()) {
930 while ($row = $this->db->fetchAssoc($result)) {
931 $this->db->manipulateF(
932 "DELETE FROM tst_solutions WHERE solution_id = %s AND authorized = %s",
933 ['integer', 'integer'],
934 [$row['solution_id'], (int) $authorized]
935 );
936 }
937 }
938
939 $this->saveCurrentSolution($active_id, $pass, $matches[1] . "_unit", $value, $authorized);
940 }
941 }
942 }
943 );
944
945 return true;
946 }
saveCurrentSolution(int $active_id, int $pass, $value1, $value2, bool $authorized=true, $tstamp=0)
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.

References ilObjTest\_getPass().

+ Here is the call graph for this function:

◆ setId()

assFormulaQuestion::setId ( int  $id = -1)

Reimplemented from assQuestion.

Definition at line 1145 of file class.assFormulaQuestion.php.

1145 : void
1146 {
1147 parent::setId($id);
1148 $this->unitrepository->setConsumerId($this->getId());
1149 }

References $id, and ILIAS\Survey\Mode\getId().

+ Here is the call graph for this function:

◆ setUnitrepository()

assFormulaQuestion::setUnitrepository ( \ilUnitConfigurationRepository  $unitrepository)

Definition at line 1151 of file class.assFormulaQuestion.php.

1151 : void
1152 {
1153 $this->unitrepository = $unitrepository;
1154 }

◆ solutionValuesToLog()

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

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

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

Reimplemented from assQuestion.

Definition at line 1341 of file class.assFormulaQuestion.php.

1344 : array {
1345 return array_reduce(
1346 $solution_values,
1347 function (array $c, array $v) use ($additional_info): array {
1348 if (str_starts_with($v['value1'], '$v')) {
1349 $var = $this->getVariable($v['value1']);
1350 if ($var === null) {
1351 $c[$v['value1']] = $additional_info->getNoneTag();
1352 return $c;
1353 }
1354 if ($var->getUnit() !== null) {
1355 $c[$v['value1']] = $v['value2'] . $var->getUnit()->getUnit();
1356 return $c;
1357 }
1358 }
1359
1360 if (strpos($v['value1'], '_unit')) {
1361 $unit = $this->getUnitrepository()->getUnit($v['value2']);
1362 $c[$v['value1']] = $unit->getUnit() ?? $additional_info->getNoneTag();
1363 return $c;
1364 }
1365
1366 $c[$v['value1']] = $v['value2'];
1367 return $c;
1368 },
1369 []
1370 );
1371 }

References $c, and ILIAS\Test\Logging\AdditionalInformationGenerator\getNoneTag().

+ Here is the call graph for this function:

◆ solutionValuesToText()

assFormulaQuestion::solutionValuesToText ( array  $solution_values)

MUST convert the given solution values into text.

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

Reimplemented from assQuestion.

Definition at line 1373 of file class.assFormulaQuestion.php.

1373 : array
1374 {
1375 ksort($solution_values);
1376 return array_reduce(
1377 $solution_values,
1378 function (array $c, array $v): array {
1379 if (!str_starts_with($v['value1'], '$r')) {
1380 return $c;
1381 }
1382 if (!strpos($v['value1'], '_unit')) {
1383 $c[$v['value1']] = "{$v['value1']} = {$v['value2']}";
1384 return $c;
1385 }
1386 $k = substr($v['value1'], 0, -5);
1387 if (array_key_exists($k, $c)) {
1388 $c[$k] .= $v['value2'];
1389 }
1390 return $c;
1391 },
1392 []
1393 );
1394 }

References $c.

◆ substituteVariables()

assFormulaQuestion::substituteVariables ( array  $userdata,
bool  $graphicalOutput = false,
bool  $forsolution = false,
bool  $result_output = false,
array  $correctness_icons = [] 
)
Parameters
int[]$selections
string[]$correctness_icons
Returns
bool|mixed|string

Definition at line 321 of file class.assFormulaQuestion.php.

322 {
323 if ((count($this->results) == 0) && (count($this->variables) == 0)) {
324 return false;
325 }
326
327 $text = $this->getQuestion();
328
329 foreach ($this->fetchAllVariables($this->getQuestion()) as $varObj) {
330 if (isset($userdata[$varObj->getVariable()]) && strlen($userdata[$varObj->getVariable()])) {
331 $varObj->setValue($userdata[$varObj->getVariable()]);
332 }
333
334 $unit = (is_object($varObj->getUnit())) ? $varObj->getUnit()->getUnit() : "";
335
336 $val = '';
337 if ($varObj->getValue() !== null) {
338 $val = (strlen($varObj->getValue()) > 8) ? strtoupper(sprintf("%e", $varObj->getValue())) : $varObj->getValue();
339 }
340
341 $text = preg_replace('/\$' . substr($varObj->getVariable(), 1) . '(?![0-9]+)/', $val . ' ' . $unit . '\1', $text);
342 }
343
344 $text = $this->purifyAndPrepareTextAreaOutput($text);
345
346 if (preg_match_all('/(\$r\d+)/im', $this->getQuestion(), $rmatches)) {
347 foreach ($rmatches[1] as $result) {
348 $resObj = $this->getResult($result);
349 $value = "";
350 $frac_helper = '';
351 $userdata[$result]['result_type'] = $resObj->getResultType();
352 $is_frac = false;
353 if (
354 $resObj->getResultType() == assFormulaQuestionResult::RESULT_FRAC ||
355 $resObj->getResultType() == assFormulaQuestionResult::RESULT_CO_FRAC
356 ) {
357 $is_frac = true;
358 }
359 if (is_array($userdata) &&
360 isset($userdata[$result]) &&
361 isset($userdata[$result]['value'])) {
362 $input = $this->generateResultInputHTML($result, (string) $userdata[$result]['value'], $forsolution);
363 } elseif ($forsolution) {
364 $value = '';
365 if (!is_array($userdata)) {
366 $value = $resObj->calculateFormula($this->getVariables(), $this->getResults(), parent::getId());
367 $value = sprintf("%." . $resObj->getPrecision() . "f", $value);
368 }
369
370 if ($is_frac) {
372 if (is_array($value)) {
373 $frac_helper = $value[1];
374 $value = $value[0];
375 }
376 }
377
378 $input = $this->generateResultInputHTML($result, $value, true);
379 } else {
380 $input = $this->generateResultInputHTML($result, '', false);
381 }
382
383 $units = "";
384 $result_units = $this->getResultUnits($resObj);
385 if (count($result_units) > 0) {
386 if ($forsolution) {
387 if (is_array($userdata)) {
388 foreach ($result_units as $unit) {
389 if (isset($userdata[$result]["unit"]) && $userdata[$result]["unit"] == $unit->getId()) {
390 $units = $unit->getUnit();
391 }
392 }
393 } else {
394 if ($resObj->getUnit()) {
395 $units = $resObj->getUnit()->getUnit();
396 }
397 }
398 } else {
399 $units = '<select name="result_' . $result . '_unit">';
400 $units .= '<option value="-1">' . $this->lng->txt("select_unit") . '</option>';
401 foreach ($result_units as $unit) {
402 $units .= '<option value="' . $unit->getId() . '"';
403 if (array_key_exists($result, $userdata) &&
404 is_array($userdata[$result]) &&
405 array_key_exists('unit', $userdata[$result])) {
406 if ($userdata[$result]["unit"] == $unit->getId()) {
407 $units .= ' selected="selected"';
408 }
409 }
410 $units .= '>' . $unit->getUnit() . '</option>';
411 }
412 $units .= '</select>';
413 }
414 } else {
415 $units = "";
416 }
417 switch ($resObj->getResultType()) {
419 $units .= ' ' . $this->lng->txt('expected_result_type') . ': ' . $this->lng->txt('result_dec');
420 break;
422 if ($frac_helper !== '') {
423 $units .= ' &asymp; ' . $frac_helper . ', ';
424 } elseif (is_array($userdata) &&
425 array_key_exists($result, $userdata) &&
426 array_key_exists('frac_helper', $userdata[$result]) &&
427 is_string($userdata[$result]["frac_helper"])) {
428 if (!str_contains($value, '/')) {
429 $units .= ' &asymp; ' . $userdata[$result]["frac_helper"] . ', ';
430 }
431 }
432 $units .= ' ' . $this->lng->txt('expected_result_type') . ': ' . $this->lng->txt('result_frac');
433 break;
435 if ($frac_helper !== '') {
436 $units .= ' &asymp; ' . $frac_helper . ', ';
437 } elseif (isset($userdata[$result]["frac_helper"]) && is_array($userdata) && $userdata[$result]["frac_helper"] !== '') {
438 if (!str_contains($value, '/')) {
439 $units .= ' &asymp; ' . $userdata[$result]["frac_helper"] . ', ';
440 }
441 }
442 $units .= ' ' . $this->lng->txt('expected_result_type') . ': ' . $this->lng->txt('result_co_frac');
443 break;
445 break;
446 }
447 $checkSign = "";
448 if ($graphicalOutput) {
449 $resunit = null;
450 $user_value = '';
451 if (is_array($userdata) && is_array($userdata[$result])) {
452 if (isset($userdata[$result]["unit"]) && $userdata[$result]["unit"] > 0) {
453 $resunit = $this->getUnitrepository()->getUnit($userdata[$result]["unit"]);
454 }
455
456 if (isset($userdata[$result]["value"])) {
457 $user_value = $userdata[$result]["value"];
458 }
459 }
460
461 $template = new ilTemplate("tpl.il_as_qpl_formulaquestion_output_solution_image.html", true, true, 'components/ILIAS/TestQuestionPool');
462
463 $correctness_icon = $correctness_icons['not_correct'];
464 if ($resObj->isCorrect($this->getVariables(), $this->getResults(), $user_value, $resunit)) {
465 $correctness_icon = $correctness_icons['correct'];
466 }
467 $template->setCurrentBlock("icon_ok");
468 $template->setVariable("ICON_OK", $correctness_icon);
469 $template->parseCurrentBlock();
470
471 $checkSign = $template->get();
472 }
473 $resultOutput = "";
474 if ($result_output) {
475 $template = new ilTemplate("tpl.il_as_qpl_formulaquestion_output_solution_result.html", true, true, 'components/ILIAS/TestQuestionPool');
476
477 if (is_array($userdata) &&
478 array_key_exists($resObj->getResult(), $userdata) &&
479 array_key_exists('value', $userdata[$resObj->getResult()])) {
480 $found = $resObj->getResultInfo(
481 $this->getVariables(),
482 $this->getResults(),
483 $userdata[$resObj->getResult()]["value"],
484 $userdata[$resObj->getResult()]["unit"] ?? null,
485 $this->getUnitrepository()->getUnits()
486 );
487 } else {
488 $found = $resObj->getResultInfo(
489 $this->getVariables(),
490 $this->getResults(),
491 $resObj->calculateFormula($this->getVariables(), $this->getResults(), parent::getId()),
492 is_object($resObj->getUnit()) ? $resObj->getUnit()->getId() : null,
493 $this->getUnitrepository()->getUnits()
494 );
495 }
496 $resulttext = "(";
497 if ($resObj->getRatingSimple()) {
498 if ($frac_helper) {
499 $resulttext .= "n/a";
500 } else {
501 $resulttext .= $found['points'] . " " . (($found['points'] == 1) ? $this->lng->txt('point') : $this->lng->txt('points'));
502 }
503 } else {
504 $resulttext .= $this->lng->txt("rated_sign") . " " . (($found['sign']) ? $found['sign'] : 0) . " " . (($found['sign'] == 1) ? $this->lng->txt('point') : $this->lng->txt('points')) . ", ";
505 $resulttext .= $this->lng->txt("rated_value") . " " . (($found['value']) ? $found['value'] : 0) . " " . (($found['value'] == 1) ? $this->lng->txt('point') : $this->lng->txt('points')) . ", ";
506 $resulttext .= $this->lng->txt("rated_unit") . " " . (($found['unit']) ? $found['unit'] : 0) . " " . (($found['unit'] == 1) ? $this->lng->txt('point') : $this->lng->txt('points'));
507 }
508
509 $resulttext .= ")";
510 $template->setVariable("RESULT_OUTPUT", $resulttext);
511
512 $resultOutput = $template->get();
513 }
514 $text = preg_replace('/\$' . substr($result, 1) . '(?![0-9]+)/', $input . ' ' . $units . ' ' . $checkSign . ' ' . $resultOutput . ' ' . '\1', $text);
515 }
516 }
517 return $text;
518 }
generateResultInputHTML(string $result_key, string $result_value, bool $forsolution)
purifyAndPrepareTextAreaOutput(string $content)
special template class to simplify handling of ITX/PEAR

References assFormulaQuestionResult\convertDecimalToCoprimeFraction(), ILIAS\Survey\Mode\getId(), ILIAS\Repository\lng(), assFormulaQuestionResult\RESULT_CO_FRAC, assFormulaQuestionResult\RESULT_DEC, assFormulaQuestionResult\RESULT_FRAC, and assFormulaQuestionResult\RESULT_NO_SELECTION.

+ Here is the call graph for this function:

◆ toLog()

assFormulaQuestion::toLog ( AdditionalInformationGenerator  $additional_info)

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

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

Reimplemented from assQuestion.

Definition at line 1273 of file class.assFormulaQuestion.php.

1273 : array
1274 {
1275 return [
1276 AdditionalInformationGenerator::KEY_QUESTION_TYPE => (string) $this->getQuestionType(),
1277 AdditionalInformationGenerator::KEY_QUESTION_TITLE => $this->getTitleForHTMLOutput(),
1278 AdditionalInformationGenerator::KEY_QUESTION_TEXT => $this->formatSAQuestion($this->getQuestion()),
1279 AdditionalInformationGenerator::KEY_QUESTION_FORMULA_VARIABLES => $this->buildVariablesForLog(
1280 $this->getVariables(),
1281 $additional_info->getNoneTag()
1282 ),
1283 AdditionalInformationGenerator::KEY_QUESTION_FORMULA_RESULTS => $this->buildResultsForLog(
1284 $this->getResults(),
1285 $additional_info->getNoneTag()
1286 ),
1287 AdditionalInformationGenerator::KEY_FEEDBACK => [
1288 AdditionalInformationGenerator::KEY_QUESTION_FEEDBACK_ON_INCOMPLETE => $this->formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(), false)),
1289 AdditionalInformationGenerator::KEY_QUESTION_FEEDBACK_ON_COMPLETE => $this->formatSAQuestion($this->feedbackOBJ->getGenericFeedbackTestPresentation($this->getId(), true))
1290 ]
1291 ];
1292 }
buildVariablesForLog(array $variables, string $none_tag)
buildResultsForLog(array $results, string $none_tag)

References ILIAS\Test\Logging\AdditionalInformationGenerator\getNoneTag().

+ Here is the call graph for this function:

◆ validateSolutionSubmit()

assFormulaQuestion::validateSolutionSubmit ( )

Reimplemented from assQuestion.

Definition at line 1191 of file class.assFormulaQuestion.php.

1191 : bool
1192 {
1193 foreach ($this->getSolutionSubmit() as $value) {
1194 if ($value && !$this->isValidSolutionResultValue($value)) {
1195 $this->tpl->setOnScreenMessage(
1196 'failure',
1197 $this->lng->txt("err_no_numeric_value"),
1198 true
1199 );
1200 return false;
1201 }
1202 }
1203
1204 return true;
1205 }
isValidSolutionResultValue(string $submittedValue)

References ILIAS\Repository\lng().

+ Here is the call graph for this function:

Field Documentation

◆ $pass_presented_variables_repo

PassPresentedVariablesRepo assFormulaQuestion::$pass_presented_variables_repo
protected

Definition at line 37 of file class.assFormulaQuestion.php.

◆ $results

array assFormulaQuestion::$results
private

Definition at line 34 of file class.assFormulaQuestion.php.

Referenced by getResults().

◆ $resultunits

array assFormulaQuestion::$resultunits
private

Definition at line 35 of file class.assFormulaQuestion.php.

◆ $unitrepository

ilUnitConfigurationRepository assFormulaQuestion::$unitrepository
private

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

◆ $variables

array assFormulaQuestion::$variables
private

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

Referenced by getVariables().


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