ILIAS  release_7 Revision v7.30-3-g800a261c036
class.ilTestScoring.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
24{
26 protected $test;
27
30
32
36 protected $questionId = 0;
37
38 public function __construct(ilObjTest $test)
39 {
40 $this->test = $test;
41 $this->preserve_manual_scores = false;
42
43 $this->recalculatedPasses = array();
44 }
45
50 {
51 $this->preserve_manual_scores = $preserve_manual_scores;
52 }
53
57 public function getPreserveManualScores()
58 {
60 }
61
65 public function getQuestionId()
66 {
67 return $this->questionId;
68 }
69
73 public function setQuestionId(int $questionId)
74 {
75 $this->questionId = $questionId;
76 }
77
78 public function recalculateSolutions()
79 {
80 $participants = $this->test->getCompleteEvaluationData(false)->getParticipants();
81 if (is_array($participants)) {
82 require_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
83 foreach ($participants as $active_id => $userdata) {
84 if (is_object($userdata) && is_array($userdata->getPasses())) {
85 $this->recalculatePasses($userdata, $active_id);
86 }
88 }
89 }
90 }
91
98 public function recalculateSolution($active_id, $pass)
99 {
100 $user_data = $this
101 ->test
102 ->getCompleteEvaluationData(false)
103 ->getParticipant($active_id)
104 ->getPass($pass);
105
106 $this->recalculatePass($user_data, $active_id, $pass);
108 }
109
114 public function recalculatePasses($userdata, $active_id)
115 {
116 $passes = $userdata->getPasses();
117 foreach ($passes as $pass => $passdata) {
118 if (is_object($passdata)) {
119 $this->recalculatePass($passdata, $active_id, $pass);
120 $this->addRecalculatedPassByActive($active_id, $pass);
121 }
122 }
123 }
124
130 public function recalculatePass($passdata, $active_id, $pass)
131 {
132 $questions = $passdata->getAnsweredQuestions();
133 if (is_array($questions)) {
134 foreach ($questions as $questiondata) {
135 if ($this->getQuestionId() && $this->getQuestionId() != $questiondata['id']) {
136 continue;
137 }
138
139 $question_gui = $this->test->createQuestionGUI("", $questiondata['id']);
140 $this->recalculateQuestionScore($question_gui, $active_id, $pass, $questiondata);
141 }
142 }
143 }
144
151 public function recalculateQuestionScore($question_gui, $active_id, $pass, $questiondata)
152 {
154 if (is_object($question_gui)) {
155 $reached = $question_gui->object->calculateReachedPoints($active_id, $pass);
156 $actual_reached = $question_gui->object->adjustReachedPointsByScoringOptions($reached, $active_id, $pass);
157
158 if ($this->preserve_manual_scores == true && $questiondata['manual'] == '1') {
159 // Do we need processing here?
160 } else {
162
164 $active_id,
165 $questiondata['id'],
166 $actual_reached,
167 $question_gui->object->getMaximumPoints(),
168 $pass,
169 false,
170 true
171 );
172
174 }
175 }
176 }
177
181 public function calculateBestSolutionForTest()
182 {
183 $solution = '';
184 foreach ($this->test->getAllQuestions() as $question) {
186 $question_gui = $this->test->createQuestionGUI("", $question['question_id']);
187 $solution .= $question_gui->getSolutionOutput(0, null, true, true, false, false, true, false);
188 }
189
190 return $solution;
191 }
192
194 {
195 $this->recalculatedPasses = array();
196 }
197
199 {
201 }
202
203 public function addRecalculatedPassByActive($activeId, $pass)
204 {
205 if (!is_array($this->recalculatedPasses[$activeId])) {
206 $this->recalculatedPasses[$activeId] = array();
207 }
208
209 $this->recalculatedPasses[$activeId][] = $pass;
210 }
211
213 {
214 global $DIC; /* @var ILIAS\DI\Container $DIC */
215
216 $query = "DELETE FROM tst_test_result WHERE question_fi = %s";
217 $DIC->database()->manipulateF($query, array('integer'), array($questionId));
218 }
219
220 public function updatePassAndTestResults($activeIds)
221 {
222 global $DIC; /* @var ILIAS\DI\Container $DIC */
223
224 foreach ($activeIds as $activeId) {
225 $passSelector = new ilTestPassesSelector($DIC->database(), $this->test);
226 $passSelector->setActiveId($activeId);
227
228 foreach ($passSelector->getExistingPasses() as $pass) {
229 assQuestion::_updateTestPassResults($activeId, $pass, $this->test->areObligationsEnabled());
230 }
231
233 }
234 }
235
239 public function getNumManualScorings()
240 {
241 global $DIC; /* @var ILIAS\DI\Container $DIC */
242
243 $query = "
244 SELECT COUNT(*) num_manual_scorings
245 FROM tst_test_result tres
246
247 INNER JOIN tst_active tact
248 ON tact.active_id = tres.active_fi
249 AND tact.test_fi = %s
250
251 WHERE tres.manual = 1
252 ";
253
254 $types = array('integer');
255 $values = array($this->test->getTestId());
256
257 if ($this->getQuestionId()) {
258 $query .= "
259 AND tres.question_fi = %s
260 ";
261
262 $types[] = 'integer';
263 $values[] = $this->getQuestionId();
264 }
265
266 $res = $DIC->database()->queryF($query, $types, $values);
267
268 while ($row = $DIC->database()->fetchAssoc($res)) {
269 return (int) $row['num_manual_scorings'];
270 }
271
272 return 0;
273 }
274}
An exception for terminatinating execution or to throw for unit testing.
static setForcePassResultUpdateEnabled($forcePassResultsUpdateEnabled)
static _updateTestResultCache($active_id, ilAssQuestionProcessLocker $processLocker=null)
@TODO Move this to a proper place.
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 upda...
Class ilTestScoring.
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: goto.php:24
$query
foreach($_POST as $key=> $value) $res