ILIAS  trunk Revision v12.0_alpha-1540-g00f839d5fa1
class.ilSoapTestAdministration.php
Go to the documentation of this file.
1<?php
2
21
30{
32 public function __construct(bool $use_nusoap = true)
33 {
34 $this->questionrepository = TestDIC::dic()['general_question_properties_repository'];
35 parent::__construct($use_nusoap);
36 }
37 private function hasWritePermissionForTest(int $active_id): bool
38 {
39 global $DIC;
40
41 $ilDB = $DIC['ilDB'];
42 global $DIC;
43
44 $ilAccess = $DIC['ilAccess'];
45
46 $permission_ok = false;
47 $result = $ilDB->queryF(
48 "SELECT tst_tests.obj_fi FROM tst_active, tst_tests WHERE tst_active.active_id = %s AND tst_active.test_fi = tst_tests.test_id",
49 array('integer'),
50 array($active_id)
51 );
52 $row = $ilDB->fetchAssoc($result);
53 if ($row['obj_fi']) {
54 $obj_id = $row['obj_fi'];
55 foreach ($ref_ids = ilObject::_getAllReferences($obj_id) as $ref_id) {
56 if ($ilAccess->checkAccess("write", "", $ref_id)) {
57 $permission_ok = true;
58 break;
59 }
60 }
61 }
62 return $permission_ok;
63 }
64
65 public function isAllowedCall(string $sid, int $active_id, bool $saveaction = true): bool
66 {
67 global $DIC;
68
69 $ilDB = $DIC['ilDB'];
70 global $DIC;
71
72 $ilUser = $DIC['ilUser'];
73
74 if ($this->hasWritePermissionForTest($active_id)) {
75 return true;
76 }
77
78 if ($saveaction) {
79 $owner_result = $ilDB->queryF(
80 "SELECT user_fi FROM tst_active WHERE active_id = %s",
81 array('integer'),
82 array($active_id)
83 );
84 $owner_row = $ilDB->fetchAssoc($owner_result);
85 if (!is_array($owner_row) || (int) $owner_row['user_fi'] !== $ilUser->getId()) {
86 return false;
87 }
88
89 $result = $ilDB->queryF(
90 "SELECT * FROM tst_times WHERE active_fi = %s ORDER BY started DESC",
91 array('integer'),
92 array($active_id)
93 );
94 if ($result->numRows()) {
95 $row = $ilDB->fetchAssoc($result);
96 if (preg_match("/(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})/", $row["started"], $matches)) {
97 $time = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
98 $now = time();
99 $diff = $now - $time;
100 $client = explode("::", $sid);
101 global $DIC;
102
103 $ilClientIniFile = $DIC['ilClientIniFile'];
104 $expires = $ilClientIniFile->readVariable('session', 'expire');
105 return $diff <= $expires;
106 }
107
108 return false;
109 }
110
111 return false;
112 }
113
114 $result = $ilDB->queryF(
115 "SELECT user_fi FROM tst_active WHERE active_id = %s",
116 array('integer'),
117 array($active_id)
118 );
119 $row = $ilDB->fetchAssoc($result);
120
121 return (int) $row['user_fi'] === $ilUser->getId();
122 }
123
127 public function saveQuestion(string $sid, int $active_id, int $question_id, int $pass, array $solution)
128 {
129 $this->initAuth($sid);
130 $this->initIlias();
131
132 if (!$this->checkSession($sid)) {
133 return $this->raiseError($this->getMessage(), $this->getMessageCode());
134 }
135 if (!$this->isAllowedCall($sid, $active_id)) {
136 return $this->raiseError("The required user information is only available for active users.", "");
137 }
138
139 global $DIC;
140
141 $ilDB = $DIC['ilDB'];
142 $ilUser = $DIC['ilUser'];
143
144 $processLockerFactory = new ilAssQuestionProcessLockerFactory(new ilSetting('assessment'), $ilDB, ilLoggerFactory::getLogger('tst'));
145 $processLockerFactory->setQuestionId($question_id);
146 $processLockerFactory->setUserId($ilUser->getId());
147 $processLocker = $processLockerFactory->getLocker();
148
149 $totalrows = 0;
150
151 $processLocker->executePersistWorkingStateLockOperation(function () use (
152 &$totalrows,
153 $processLocker,
154 $active_id,
155 $question_id,
156 $pass,
157 $solution
158 ) {
159 $processLocker->executeUserSolutionUpdateLockOperation(function () use (
160 &$totalrows,
161 $active_id,
162 $question_id,
163 $pass,
164 $solution
165 ) {
166 $ilDB = $GLOBALS['DIC']['ilDB'];
167 if (($active_id > 0) && ($question_id > 0) && ($pass > 0)) {
168 $affectedRows = $ilDB->manipulateF(
169 "DELETE FROM tst_solutions WHERE active_fi = %s AND question_fi = %s AND pass = %s",
170 array('integer', 'integer', 'integer'),
171 array($active_id, $question_id, $pass)
172 );
173 }
174 for ($i = 0, $iMax = count($solution); $i < $iMax; $i += 3) {
175 $next_id = $ilDB->nextId('tst_solutions');
176 $affectedRows = $ilDB->insert("tst_solutions", array(
177 "solution_id" => array("integer", $next_id),
178 "active_fi" => array("integer", $active_id),
179 "question_fi" => array("integer", $question_id),
180 "value1" => array("clob", $solution[$i]),
181 "value2" => array("clob", $solution[$i + 1]),
182 "points" => array("float", $solution[$i + 2]),
183 "pass" => array("integer", $pass),
184 "tstamp" => array("integer", time())
185 ));
186 $totalrows += $affectedRows;
187 }
188 });
189
190 if ($totalrows !== 0) {
191 $question = assQuestion::instantiateQuestion($question_id);
192 $question->setProcessLocker($processLocker);
193 $question->calculateResultsFromSolution($active_id, $pass);
194 }
195 });
196
197 if ($totalrows === 0) {
198 return $this->raiseError(
199 "Wrong solution data. ILIAS did not execute any database queries: Solution data: " . print_r(
200 $solution,
201 true
202 ),
203 'No result'
204 );
205 }
206 return true;
207 }
208
212 public function saveQuestionSolution(string $sid, int $active_id, int $question_id, int $pass, int $solution)
213 {
214 $this->initAuth($sid);
215 $this->initIlias();
216
217 if (!$this->checkSession($sid)) {
218 return $this->raiseError($this->getMessage(), $this->getMessageCode());
219 }
220 if (!$this->isAllowedCall($sid, $active_id)) {
221 return $this->raiseError("The required user information is only available for active users.", "");
222 }
223
224 $solutions = [];
225 if (preg_match("/<values>(.*?)<\/values>/is", $solution, $matches)) {
226 if (preg_match_all(
227 "/<value>(.*?)<\/value><value>(.*?)<\/value><points>(.*?)<\/points>/is",
228 $solution,
229 $matches,
230 PREG_SET_ORDER
231 )) {
232 foreach ($matches as $match) {
233 if (count($match) === 4) {
234 for ($i = 1, $iMax = count($match); $i < $iMax; $i++) {
235 $solutions[] = trim($match[$i]);
236 }
237 }
238 }
239 }
240 }
241
242 if (count($solutions) === 0) {
243 return $this->raiseError(
244 "Wrong solution data. ILIAS did not find one or more solution triplets: $solution",
245 ""
246 );
247 }
248
249 $ilDB = $GLOBALS['DIC']['ilDB'];
250 if (($active_id > 0) && ($question_id > 0) && ($pass > 0)) {
251 $affectedRows = $ilDB->manipulateF(
252 "DELETE FROM tst_solutions WHERE active_fi = %s AND question_fi = %s AND pass = %s",
253 array('integer', 'integer', 'integer'),
254 array($active_id, $question_id, $pass)
255 );
256 }
257 $totalrows = 0;
258 for ($i = 0, $iMax = count($solutions); $i < $iMax; $i += 3) {
259 $next_id = $ilDB->nextId('tst_solutions');
260 $affectedRows = $ilDB->insert("tst_solutions", array(
261 "solution_id" => array("integer", $next_id),
262 "active_fi" => array("integer", $active_id),
263 "question_fi" => array("integer", $question_id),
264 "value1" => array("clob", $solutions[$i]),
265 "value2" => array("clob", $solutions[$i + 1]),
266 "points" => array("float", $solutions[$i + 2]),
267 "pass" => array("integer", $pass),
268 "tstamp" => array("integer", time())
269 ));
270 $totalrows += $affectedRows;
271 }
272 if ($totalrows === 0) {
273 return $this->raiseError("Wrong solution data. ILIAS did not execute any database queries", '');
274 }
275
276 $question = assQuestion::instantiateQuestion($question_id);
277 $question->calculateResultsFromSolution($active_id, $pass);
278 return "TRUE";
279 }
280
284 public function getQuestionSolution(string $sid, int $active_id, int $question_id, int $pass)
285 {
286 $this->initAuth($sid);
287 $this->initIlias();
288
289 if (!$this->checkSession($sid)) {
290 return $this->raiseError($this->getMessage(), $this->getMessageCode());
291 }
292 if (!$this->isAllowedCall($sid, $active_id, false)) {
293 return $this->raiseError("The required user information is only available for active users.", "");
294 }
295 $solution = array();
296
297 global $DIC;
298
299 $ilDB = $DIC['ilDB'];
300
301 $test_obj_id = ilObjTest::_lookupTestObjIdForQuestionId($question_id);
302 $test_obj = new ilObjTest($test_obj_id, false);
303 $use_previous_answers = $test_obj->getUsePreviousAnswers();
304
305 $lastpass = 0;
306 if ($use_previous_answers) {
307 $result = $ilDB->queryF(
308 "SELECT MAX(pass) maxpass FROM tst_test_result WHERE active_fi = %s AND question_fi = %s",
309 array('integer', 'integer'),
310 array($active_id, $question_id)
311 );
312 if ($result->numRows() === 1) {
313 $row = $ilDB->fetchAssoc($result);
314 $lastpass = (int) $row["maxpass"];
315 }
316 } else {
317 $lastpass = $pass;
318 }
319
320 if (($active_id > 0) && ($question_id > 0) && ($lastpass > 0)) {
321 $result = $ilDB->queryF(
322 "SELECT * FROM tst_solutions WHERE active_fi = %s AND question_fi = %s AND pass = %s",
323 array('integer', 'integer', 'integer'),
324 array($active_id, $question_id, $lastpass)
325 );
326 if ($result->numRows()) {
327 while ($row = $ilDB->fetchAssoc($result)) {
328 $solution[] = $row["value1"];
329 $solution[] = $row["value2"];
330 $solution[] = $row["points"];
331 }
332 }
333 }
334 return $solution;
335 }
336
340 public function getTestUserData(string $sid, int $active_id)
341 {
342 $this->initAuth($sid);
343 $this->initIlias();
344
345 if (!$this->checkSession($sid)) {
346 return $this->raiseError($this->getMessage(), $this->getMessageCode());
347 }
348 if (!$this->isAllowedCall($sid, $active_id, false)) {
349 return $this->raiseError("The required user information is only available for active users.", "");
350 }
351
352 global $DIC;
353
354 $lng = $DIC['lng'];
355 $ilDB = $DIC['ilDB'];
356
357 $result = $ilDB->queryF(
358 "SELECT user_fi, test_fi FROM tst_active WHERE active_id = %s",
359 array('integer'),
360 array($active_id)
361 );
362 $row = $ilDB->fetchAssoc($result);
363 $user_id = $row["user_fi"];
364 $test_id = $row["test_fi"];
365
366 $test_obj_id = ilObjTest::_getObjectIDFromTestID($test_id);
367 $test_obj = new ilObjTest($test_obj_id, false);
368 $anonymity = $test_obj->getAnonymity();
369
370 $result = $ilDB->queryF(
371 "SELECT firstname, lastname, title, login FROM usr_data WHERE usr_id = %s",
372 array('integer'),
373 array($user_id)
374 );
375
376 $userdata = array();
377 if ($result->numRows() === 0) {
378 $userdata["fullname"] = $lng->txt("deleted_user");
379 $userdata["title"] = "";
380 $userdata["firstname"] = "";
381 $userdata["lastname"] = $lng->txt("anonymous");
382 $userdata["login"] = "";
383 } else {
384 $data = $ilDB->fetchAssoc($result);
385 if ((int) $user_id === ANONYMOUS_USER_ID || $anonymity) {
386 $userdata["fullname"] = $lng->txt("anonymous");
387 $userdata["title"] = "";
388 $userdata["firstname"] = "";
389 $userdata["lastname"] = $lng->txt("anonymous");
390 $userdata["login"] = "";
391 } else {
392 $userdata["fullname"] = trim($data["title"] . " " . $data["firstname"] . " " . $data["lastname"]);
393 $userdata["title"] = $data["title"];
394 $userdata["firstname"] = $data["firstname"];
395 $userdata["lastname"] = $data["lastname"];
396 $userdata["login"] = $data["login"];
397 }
398 }
399 return array_values($userdata);
400 }
401
405 public function getPositionOfQuestion(string $sid, int $active_id, int $question_id, int $pass)
406 {
407 $this->initAuth($sid);
408 $this->initIlias();
409
410 if (!$this->checkSession($sid)) {
411 return $this->raiseError($this->getMessage(), $this->getMessageCode());
412 }
413 if (!$this->isAllowedCall($sid, $active_id, false)) {
414 return $this->raiseError("The required user information is only available for active users.", "");
415 }
416
417 global $DIC;
418 $ilDB = $DIC['ilDB'];
419
420 $sequence = new ilTestSequence($ilDB, $active_id, $pass, $this->questionrepository);
421 return $sequence->getSequenceForQuestion($question_id);
422 }
423
427 public function getPreviousReachedPoints(string $sid, int $active_id, int $question_id, int $pass)
428 {
429 $this->initAuth($sid);
430 $this->initIlias();
431
432 if (!$this->checkSession($sid)) {
433 return $this->raiseError($this->getMessage(), $this->getMessageCode());
434 }
435 if (!$this->isAllowedCall($sid, $active_id, false)) {
436 return $this->raiseError("The required user information is only available for active users.", "");
437 }
438
439 global $DIC;
440
441 $lng = $DIC['lng'];
442 $ilDB = $DIC['ilDB'];
443
444 $sequence = new ilTestSequence($ilDB, $active_id, $pass, $this->questionrepository);
445 $result = $ilDB->queryF(
446 "SELECT question_fi, points FROM tst_test_result WHERE active_fi = %s AND pass = %s",
447 array('integer', 'integer'),
448 array($active_id, $pass)
449 );
450 $reachedpoints = array();
451 while ($row = $ilDB->fetchAssoc($result)) {
452 $reachedpoints[$row["question_fi"]] = $row["points"];
453 }
454 $atposition = false;
455 $pointsforposition = array();
456 foreach ($sequence->getUserSequence() as $seq) {
457 if (!$atposition) {
458 $qid = $sequence->getQuestionForSequence($seq);
459 if ($qid == $question_id) {
460 $atposition = true;
461 } else {
462 $pointsforposition[] = $reachedpoints[$qid];
463 }
464 }
465 }
466 return $pointsforposition;
467 }
468
472 public function getNrOfQuestionsInPass(string $sid, int $active_id, int $pass)
473 {
474 $this->initAuth($sid);
475 $this->initIlias();
476
477 if (!$this->checkSession($sid)) {
478 return $this->raiseError($this->getMessage(), $this->getMessageCode());
479 }
480 if (!$this->isAllowedCall($sid, $active_id, false)) {
481 return $this->raiseError("The required user information is only available for active users.", "");
482 }
483
484 global $DIC;
485
486 $lng = $DIC['lng'];
487 $ilDB = $DIC['ilDB'];
488
489 $sequence = new ilTestSequence($ilDB, $active_id, $pass, $this->questionrepository);
490 return $sequence->getUserQuestionCount();
491 }
492
496 public function removeTestResults(string $sid, int $test_ref_id, array $a_user_ids)
497 {
498 $this->initAuth($sid);
499 $this->initIlias();
500
501 if (!$this->checkSession($sid)) {
502 return $this->raiseError($this->getMessage(), $this->getMessageCode());
503 }
504 if (!($test_ref_id > 0)) {
505 return $this->raiseError(
506 'No test id given. Aborting!',
507 'Client'
508 );
509 }
510 global $DIC;
511
512 $rbacsystem = $DIC['rbacsystem'];
513 $tree = $DIC['tree'];
514 $ilLog = $DIC['ilLog'];
515
516 if (!$this->checkManageParticipantsAccess($test_ref_id)) {
517 return $this->raiseError('no permission. Aborting!', 'Client');
518 }
519
520 if (ilObject::_isInTrash($test_ref_id)) {
521 return $this->raiseError(
522 'Test is trashed. Aborting!',
523 'Client'
524 );
525 }
526
527 if (!$tst = ilObjectFactory::getInstanceByRefId($test_ref_id, false)) {
528 return $this->raiseError('No test found for id: ' . $test_ref_id, 'Client');
529 }
530 if ($tst->getType() !== 'tst') {
531 return $this->raiseError(
532 'Object with ref_id ' . $test_ref_id . ' is not of type test. Aborting',
533 'Client'
534 );
535 }
536
537 // Dirty hack
538 if (isset($a_user_ids['item'])) {
539 $a_user_ids = $a_user_ids['item'];
540 }
541
542 $part = new ilTestParticipantData($GLOBALS['DIC']['ilDB'], $GLOBALS['DIC']['lng']);
543 $part->setParticipantAccessFilter(
544 ilTestParticipantAccessFilter::getManageParticipantsUserFilter($test_ref_id)
545 );
546 $part->setUserIdsFilter((array) $a_user_ids);
547 $part->load($tst->getTestId());
548 $tst->removeTestResults($part);
549
550 return true;
551 }
552
556 public function getTestResults(string $sid, int $test_ref_id, bool $sum_only)
557 {
558 $this->initAuth($sid);
559 $this->initIlias();
560
561 if (!$this->checkSession($sid)) {
562 return $this->raiseError($this->getMessage(), $this->getMessageCode());
563 }
564 if (!($test_ref_id > 0)) {
565 return $this->raiseError(
566 'No test id given. Aborting!',
567 'Client'
568 );
569 }
570 global $DIC;
571
572 $rbacsystem = $DIC['rbacsystem'];
573 $tree = $DIC['tree'];
574 $ilLog = $DIC['ilLog'];
575
576 if (ilObject::_isInTrash($test_ref_id)) {
577 return $this->raiseError(
578 'Test is trashed. Aborting!',
579 'Client'
580 );
581 }
582
583 if (!$obj_id = ilObject::_lookupObjectId($test_ref_id)) {
584 return $this->raiseError(
585 'No test found for id: ' . $test_ref_id,
586 'Client'
587 );
588 }
589
590 $permission_ok = false;
591 foreach ($ref_ids = ilObject::_getAllReferences($obj_id) as $ref_id) {
592 if ($rbacsystem->checkAccess('write', $ref_id)) {
593 $permission_ok = true;
594 break;
595 }
596 }
597 if (!$permission_ok && $this->checkParticipantsResultsAccess($test_ref_id)) {
598 $permission_ok = $this->checkParticipantsResultsAccess($test_ref_id);
599 }
600
601 if (!$permission_ok) {
602 return $this->raiseError(
603 'No permission to edit the object with id: ' . $test_ref_id,
604 'Server'
605 );
606 }
607
608 $xmlResultSet = new ilXMLResultSet();
609 $xmlResultSet->addColumn("user_id");
610 $xmlResultSet->addColumn("login");
611 $xmlResultSet->addColumn("firstname");
612 $xmlResultSet->addColumn("lastname");
613 $xmlResultSet->addColumn("matriculation");
614
615 $test_obj = new ilObjTest($obj_id, false);
616 $participants = $test_obj->getTestParticipants();
617
618 $accessFilter = ilTestParticipantAccessFilter::getAccessResultsUserFilter($test_ref_id);
619 $participantList = new ilTestParticipantList($test_obj);
620 $participantList->initializeFromDbRows($participants);
621 $participantList = $participantList->getAccessFilteredList($accessFilter);
622 $participantList = $participantList->getScoredParticipantList();
623 foreach ($participants as $activeId => $part) {
624 if ($participantList->isActiveIdInList($activeId)) {
625 $participants[$activeId]['passed'] = $participantList->getParticipantByActiveId($activeId)->getScoring()->isPassed();
626 continue;
627 }
628
629 unset($participants[$activeId]);
630 }
631
632 if ($sum_only) {
633 $data = $test_obj->getAllTestResults($participants);
634
635 $xmlResultSet->addColumn("maximum_points");
636 $xmlResultSet->addColumn("received_points");
637 $xmlResultSet->addColumn("passed");
638 // skip titles
639 $titles = array_shift($data);
640 foreach ($data as $row) {
641 $xmlRow = new ilXMLResultSetRow();
642 $xmlRow->setValue(0, $row["user_id"]);
643 $xmlRow->setValue(1, $row["login"]);
644 $xmlRow->setValue(2, $row["firstname"]);
645 $xmlRow->setValue(3, $row["lastname"]);
646 $xmlRow->setValue(4, $row["matriculation"]);
647 $xmlRow->setValue(5, $row["max_points"]);
648 $xmlRow->setValue(6, $row["reached_points"]);
649 $xmlRow->setValue(7, $row["passed"]);
650 $xmlResultSet->addRow($xmlRow);
651 }
652 } else {
653 $data = $test_obj->getDetailedTestResults($participants);
654
655 $xmlResultSet->addColumn("question_id");
656 $xmlResultSet->addColumn("question_title");
657 $xmlResultSet->addColumn("maximum_points");
658 $xmlResultSet->addColumn("received_points");
659 $xmlResultSet->addColumn("passed");
660 foreach ($data as $row) {
661 $xmlRow = new ilXMLResultSetRow();
662 $xmlRow->setValue(0, $row["user_id"]);
663 $xmlRow->setValue(1, $row["login"]);
664 $xmlRow->setValue(2, $row["firstname"]);
665 $xmlRow->setValue(3, $row["lastname"]);
666 $xmlRow->setValue(4, $row["matriculation"]);
667 $xmlRow->setValue(5, $row["question_id"]);
668 $xmlRow->setValue(6, $row["question_title"]);
669 $xmlRow->setValue(7, $row["max_points"]);
670 $xmlRow->setValue(8, $row["reached_points"]);
671 $xmlRow->setValue(9, $row["passed"]);
672 $xmlResultSet->addRow($xmlRow);
673 }
674 }
675
676 $xmlWriter = new ilXMLResultSetWriter($xmlResultSet);
677 $xmlWriter->start();
678 return $xmlWriter->getXML();
679 }
680
681 protected function checkManageParticipantsAccess(int $refId): bool
682 {
683 return $this->getTestAccess($refId)->checkManageParticipantsAccess();
684 }
685
686 protected function checkParticipantsResultsAccess(int $refId): bool
687 {
688 return $this->getTestAccess($refId)->checkParticipantsResultsAccess();
689 }
690
691 protected function getTestAccess(int $refId): ilTestAccess
692 {
693
695 return new ilTestAccess($refId, $testId);
696 }
697}
static instantiateQuestion(int $question_id)
static getLogger(string $a_component_id)
Get component logger.
static _getTestIDFromObjectID(int $object_id)
Returns the ILIAS test id for a given object id.
static _getObjectIDFromTestID($test_id)
Returns the ILIAS test object id for a given test id.
static _lookupTestObjIdForQuestionId(int $q_id)
Get test Object ID for question ID.
static getInstanceByRefId(int $ref_id, bool $stop_on_error=true)
get an instance of an Ilias object by reference id
static _lookupObjectId(int $ref_id)
static _getAllReferences(int $id)
get all reference ids for object ID
static _isInTrash(int $ref_id)
ILIAS Setting Class.
raiseError(string $a_message, $a_code)
saveQuestionSolution(string $sid, int $active_id, int $question_id, int $pass, int $solution)
getPreviousReachedPoints(string $sid, int $active_id, int $question_id, int $pass)
isAllowedCall(string $sid, int $active_id, bool $saveaction=true)
saveQuestion(string $sid, int $active_id, int $question_id, int $pass, array $solution)
getQuestionSolution(string $sid, int $active_id, int $question_id, int $pass)
getPositionOfQuestion(string $sid, int $active_id, int $question_id, int $pass)
removeTestResults(string $sid, int $test_ref_id, array $a_user_ids)
getTestResults(string $sid, int $test_ref_id, bool $sum_only)
GeneralQuestionPropertiesRepository $questionrepository
getTestUserData(string $sid, int $active_id)
getNrOfQuestionsInPass(string $sid, int $active_id, int $pass)
Test sequence handler.
Row Class for XMLResultSet.
XML Writer for XMLResultSet.
const ANONYMOUS_USER_ID
Definition: constants.php:27
$client
$ref_id
Definition: ltiauth.php:66
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $lng
Definition: privfeed.php:26
global $DIC
Definition: shib_login.php:26
$GLOBALS["DIC"]
Definition: wac.php:54
$refId
Definition: xapitoken.php:56