ILIAS  release_8 Revision v8.24
class.ilTestScoring.php
Go to the documentation of this file.
1<?php
2
39{
41 protected $test;
42
45
47
51 protected $questionId = 0;
52
53 public function __construct(ilObjTest $test)
54 {
55 $this->test = $test;
56 $this->preserve_manual_scores = false;
57
58 $this->recalculatedPasses = array();
59 }
60
65 {
66 $this->preserve_manual_scores = $preserve_manual_scores;
67 }
68
72 public function getPreserveManualScores(): bool
73 {
75 }
76
80 public function getQuestionId(): int
81 {
82 return $this->questionId;
83 }
84
88 public function setQuestionId(int $questionId)
89 {
90 $this->questionId = $questionId;
91 }
92
93 public function recalculateSolutions()
94 {
95 $participants = $this->test->getCompleteEvaluationData(false)->getParticipants();
96 if (is_array($participants)) {
97 require_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
98 foreach ($participants as $active_id => $userdata) {
99 if (is_object($userdata) && is_array($userdata->getPasses())) {
100 $this->recalculatePasses($userdata, $active_id);
101 }
103 }
104 }
105 }
106
113 public function recalculateSolution($active_id, $pass)
114 {
115 $user_data = $this
116 ->test
117 ->getCompleteEvaluationData(false)
118 ->getParticipant($active_id)
119 ->getPass($pass);
120
121 $this->recalculatePass($user_data, $active_id, $pass);
123 }
124
129 public function recalculatePasses($userdata, $active_id)
130 {
131 $passes = $userdata->getPasses();
132 foreach ($passes as $pass => $passdata) {
133 if (is_object($passdata)) {
134 $this->recalculatePass($passdata, $active_id, $pass);
135 $this->addRecalculatedPassByActive($active_id, $pass);
136 }
137 }
138 }
139
145 public function recalculatePass($passdata, $active_id, $pass)
146 {
147 $questions = $passdata->getAnsweredQuestions();
148 if (is_array($questions)) {
149 foreach ($questions as $questiondata) {
150 if ($this->getQuestionId() && $this->getQuestionId() != $questiondata['id']) {
151 continue;
152 }
153
154 $question_gui = $this->test->createQuestionGUI("", $questiondata['id']);
155 $this->recalculateQuestionScore($question_gui, $active_id, $pass, $questiondata);
156 }
157 }
158 }
159
166 public function recalculateQuestionScore($question_gui, $active_id, $pass, $questiondata)
167 {
169 if (is_object($question_gui)) {
170 $reached = $question_gui->object->calculateReachedPoints($active_id, $pass);
171 $actual_reached = $question_gui->object->adjustReachedPointsByScoringOptions($reached, $active_id, $pass);
172
173 if ($this->preserve_manual_scores == true && $questiondata['manual'] == '1') {
174 // Do we need processing here?
175 } else {
177
179 $active_id,
180 $questiondata['id'],
181 $actual_reached,
182 $question_gui->object->getMaximumPoints(),
183 $pass,
184 false,
185 true
186 );
187
189 }
190 }
191 }
192
196 public function calculateBestSolutionForTest(): string
197 {
198 $solution = '';
199 foreach ($this->test->getAllQuestions() as $question) {
201 $question_gui = $this->test->createQuestionGUI("", $question['question_id']);
202 $solution .= '<h1>' . $question_gui->object->getTitleForHTMLOutput() . '</h1>';
203 $solution .= $question_gui->getSolutionOutput(0, null, true, true, false, false, true, false);
204 }
205
206 return $solution;
207 }
208
210 {
211 $this->recalculatedPasses = array();
212 }
213
214 public function getRecalculatedPassesByActives(): array
215 {
217 }
218
219 public function addRecalculatedPassByActive($activeId, $pass)
220 {
221 if (!array_key_exists($activeId, $this->recalculatedPasses)
222 || !is_array($this->recalculatedPasses[$activeId])
223 ) {
224 $this->recalculatedPasses[$activeId] = array();
225 }
226
227 $this->recalculatedPasses[$activeId][] = $pass;
228 }
229
231 {
232 global $DIC; /* @var ILIAS\DI\Container $DIC */
233
234 $query = "DELETE FROM tst_test_result WHERE question_fi = %s";
235 $DIC->database()->manipulateF($query, array('integer'), array($questionId));
236 }
237
238 public function updatePassAndTestResults($activeIds)
239 {
240 global $DIC; /* @var ILIAS\DI\Container $DIC */
241
242 foreach ($activeIds as $activeId) {
243 $passSelector = new ilTestPassesSelector($DIC->database(), $this->test);
244 $passSelector->setActiveId($activeId);
245
246 foreach ($passSelector->getExistingPasses() as $pass) {
247 assQuestion::_updateTestPassResults($activeId, $pass, $this->test->areObligationsEnabled());
248 }
249
251 }
252 }
253
257 public function getNumManualScorings(): int
258 {
259 global $DIC; /* @var ILIAS\DI\Container $DIC */
260
261 $query = "
262 SELECT COUNT(*) num_manual_scorings
263 FROM tst_test_result tres
264
265 INNER JOIN tst_active tact
266 ON tact.active_id = tres.active_fi
267 AND tact.test_fi = %s
268
269 WHERE tres.manual = 1
270 ";
271
272 $types = array('integer');
273 $values = array($this->test->getTestId());
274
275 if ($this->getQuestionId()) {
276 $query .= "
277 AND tres.question_fi = %s
278 ";
279
280 $types[] = 'integer';
281 $values[] = $this->getQuestionId();
282 }
283
284 $res = $DIC->database()->queryF($query, $types, $values);
285
286 while ($row = $DIC->database()->fetchAssoc($res)) {
287 return (int) $row['num_manual_scorings'];
288 }
289
290 return 0;
291 }
292}
static setForcePassResultUpdateEnabled(bool $forcePassResultsUpdateEnabled)
static _updateTestResultCache(int $active_id, ilAssQuestionProcessLocker $processLocker=null)
@TODO Move this to a proper place.
static _setReachedPoints(int $active_id, int $question_id, float $points, float $maxpoints, int $pass, bool $manualscoring, bool $obligationsEnabled)
Sets the points, a learner has reached answering the question Additionally objective results are upda...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
addRecalculatedPassByActive($activeId, $pass)
recalculateSolution($active_id, $pass)
Updates passed status of the Test.
setPreserveManualScores($preserve_manual_scores)
updatePassAndTestResults($activeIds)
recalculatePasses($userdata, $active_id)
setQuestionId(int $questionId)
recalculatePass($passdata, $active_id, $pass)
removeAllQuestionResults($questionId)
__construct(ilObjTest $test)
global $DIC
Definition: feed.php:28
$res
Definition: ltiservices.php:69
$query