ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
All Data Structures Namespaces Files Functions Variables Modules Pages
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 }
static _updateTestResultCache($active_id, ilAssQuestionProcessLocker $processLocker=null)
Move this to a proper place.
recalculatePass($passdata, $active_id, $pass)
foreach($_POST as $key=> $value) $res
static setForcePassResultUpdateEnabled($forcePassResultsUpdateEnabled)
addRecalculatedPassByActive($activeId, $pass)
__construct(ilObjTest $test)
setPreserveManualScores($preserve_manual_scores)
$query
updatePassAndTestResults($activeIds)
Class ilTestScoring.
removeAllQuestionResults($questionId)
$DIC
Definition: xapitoken.php:46
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...
recalculatePasses($userdata, $active_id)
recalculateSolution($active_id, $pass)
Updates passed status of the Test.
setQuestionId(int $questionId)