ILIAS  release_8 Revision v8.23
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 }
$res
Definition: ltiservices.php:69
static _updateTestResultCache(int $active_id, ilAssQuestionProcessLocker $processLocker=null)
Move this to a proper place.
recalculatePass($passdata, $active_id, $pass)
global $DIC
Definition: feed.php:28
addRecalculatedPassByActive($activeId, $pass)
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...
__construct(ilObjTest $test)
setPreserveManualScores($preserve_manual_scores)
$query
updatePassAndTestResults($activeIds)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
removeAllQuestionResults($questionId)
recalculatePasses($userdata, $active_id)
recalculateSolution($active_id, $pass)
Updates passed status of the Test.
setQuestionId(int $questionId)
static setForcePassResultUpdateEnabled(bool $forcePassResultsUpdateEnabled)