ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilObjExercise.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 require_once "./Services/Object/classes/class.ilObject.php";
5 require_once "./Modules/Exercise/classes/class.ilExerciseMembers.php";
6 
19 class ilObjExercise extends ilObject
20 {
24  protected $user;
25 
26  public $file_obj;
27  public $members_obj;
28  public $files;
29 
30  public $timestamp;
31  public $hour;
32  public $minutes;
33  public $day;
34  public $month;
35  public $year;
36  public $instruction;
38 
39  public $tutor_feedback = 7; // [int]
40 
44 
53  protected $completion_by_submission = false;
54 
58  private $webFilesystem;
59 
66  public function __construct($a_id = 0, $a_call_by_reference = true)
67  {
68  global $DIC;
69 
70  $this->db = $DIC->database();
71  $this->app_event_handler = $DIC["ilAppEventHandler"];
72  $this->lng = $DIC->language();
73  $this->user = $DIC->user();
74  $this->setPassMode("all");
75  $this->type = "exc";
76  $this->webFilesystem = $DIC->filesystem()->web();
77 
78  parent::__construct($a_id, $a_call_by_reference);
79  }
80 
81  // SET, GET METHODS
82  public function setDate($a_hour, $a_minutes, $a_day, $a_month, $a_year)
83  {
84  $this->hour = (int) $a_hour;
85  $this->minutes = (int) $a_minutes;
86  $this->day = (int) $a_day;
87  $this->month = (int) $a_month;
88  $this->year = (int) $a_year;
89  $this->timestamp = mktime($this->hour, $this->minutes, 0, $this->month, $this->day, $this->year);
90  return true;
91  }
92  public function getTimestamp()
93  {
94  return $this->timestamp;
95  }
96  public function setTimestamp($a_timestamp)
97  {
98  $this->timestamp = $a_timestamp;
99  }
100  public function setInstruction($a_instruction)
101  {
102  $this->instruction = $a_instruction;
103  }
104  public function getInstruction()
105  {
106  return $this->instruction;
107  }
108 
114  public function setPassMode($a_val)
115  {
116  $this->pass_mode = $a_val;
117  }
118 
124  public function getPassMode()
125  {
126  return $this->pass_mode;
127  }
128 
134  public function setPassNr($a_val)
135  {
136  $this->pass_nr = $a_val;
137  }
138 
144  public function getPassNr()
145  {
146  return $this->pass_nr;
147  }
148 
154  public function setShowSubmissions($a_val)
155  {
156  $this->show_submissions = $a_val;
157  }
158 
164  public function getShowSubmissions()
165  {
166  return $this->show_submissions;
167  }
168 
169 
170  /* function getFiles()
171  {
172  return $this->files;
173  }*/
174 
175  public function checkDate()
176  {
177  return $this->hour == (int) date("H", $this->timestamp) and
178  $this->minutes == (int) date("i", $this->timestamp) and
179  $this->day == (int) date("d", $this->timestamp) and
180  $this->month == (int) date("m", $this->timestamp) and
181  $this->year == (int) date("Y", $this->timestamp);
182  }
183 
184  public function hasTutorFeedbackText()
185  {
186  return $this->tutor_feedback & self::TUTOR_FEEDBACK_TEXT;
187  }
188 
189  public function hasTutorFeedbackMail()
190  {
191  return $this->tutor_feedback & self::TUTOR_FEEDBACK_MAIL;
192  }
193 
194  public function hasTutorFeedbackFile()
195  {
196  return $this->tutor_feedback & self::TUTOR_FEEDBACK_FILE;
197  }
198 
199  protected function getTutorFeedback()
200  {
201  return $this->tutor_feedback;
202  }
203 
204  public function setTutorFeedback($a_value)
205  {
206  $this->tutor_feedback = $a_value;
207  }
208 
209  public function saveData()
210  {
211  $ilDB = $this->db;
212 
213  $ilDB->insert("exc_data", array(
214  "obj_id" => array("integer", $this->getId()),
215  "instruction" => array("clob", $this->getInstruction()),
216  "time_stamp" => array("integer", $this->getTimestamp()),
217  "pass_mode" => array("text", $this->getPassMode()),
218  "pass_nr" => array("text", $this->getPassNr()),
219  "show_submissions" => array("integer", (int) $this->getShowSubmissions()),
220  'compl_by_submission' => array('integer', (int) $this->isCompletionBySubmissionEnabled()),
221  "certificate_visibility" => array("integer", (int) $this->getCertificateVisibility()),
222  "tfeedback" => array("integer", (int) $this->getTutorFeedback())
223  ));
224  return true;
225  }
226 
234  public function cloneObject($a_target_id, $a_copy_id = 0, $a_omit_tree = false)
235  {
236  $ilDB = $this->db;
237 
238  // Copy settings
239  $new_obj = parent::cloneObject($a_target_id, $a_copy_id, $a_omit_tree);
240  $new_obj->setInstruction($this->getInstruction());
241  $new_obj->setTimestamp($this->getTimestamp());
242  $new_obj->setPassMode($this->getPassMode());
243  $new_obj->saveData();
244  $new_obj->setPassNr($this->getPassNr());
245  $new_obj->setShowSubmissions($this->getShowSubmissions());
246  $new_obj->setCompletionBySubmission($this->isCompletionBySubmissionEnabled());
247  $new_obj->setTutorFeedback($this->getTutorFeedback());
248  $new_obj->setCertificateVisibility($this->getCertificateVisibility());
249  $new_obj->update();
250 
251  $new_obj->saveCertificateVisibility($this->getCertificateVisibility());
252 
253  // Copy criteria catalogues
254  $crit_cat_map = array();
255  include_once("./Modules/Exercise/classes/class.ilExcCriteriaCatalogue.php");
256  foreach (ilExcCriteriaCatalogue::getInstancesByParentId($this->getId()) as $crit_cat) {
257  $new_id = $crit_cat->cloneObject($new_obj->getId());
258  $crit_cat_map[$crit_cat->getId()] = $new_id;
259  }
260 
261  // Copy assignments
262  include_once("./Modules/Exercise/classes/class.ilExAssignment.php");
263  ilExAssignment::cloneAssignmentsOfExercise($this->getId(), $new_obj->getId(), $crit_cat_map);
264 
265  // Copy learning progress settings
266  include_once('Services/Tracking/classes/class.ilLPObjSettings.php');
267  $obj_settings = new ilLPObjSettings($this->getId());
268  $obj_settings->cloneSettings($new_obj->getId());
269  unset($obj_settings);
270 
272  $templateRepository = new ilCertificateTemplateRepository($ilDB);
273 
274  $cloneAction = new ilCertificateCloneAction(
275  $ilDB,
276  $factory,
277  $templateRepository,
278  $this->webFilesystem,
279  $this->log,
281  );
282 
283  $cloneAction->cloneCertificate($this, $new_obj);
284 
285  return $new_obj;
286  }
287 
294  public function delete()
295  {
296  $ilDB = $this->db;
297  $ilAppEventHandler = $this->app_event_handler;
298 
299  // always call parent delete function first!!
300  if (!parent::delete()) {
301  return false;
302  }
303  // put here course specific stuff
304  $ilDB->manipulate("DELETE FROM exc_data " .
305  "WHERE obj_id = " . $ilDB->quote($this->getId(), "integer"));
306 
307  include_once "Modules/Exercise/classes/class.ilExcCriteriaCatalogue.php";
309 
310  // remove all notifications
311  include_once "./Services/Notification/classes/class.ilNotification.php";
313 
314  $ilAppEventHandler->raise(
315  'Modules/Exercise',
316  'delete',
317  array('obj_id' => $this->getId())
318  );
319 
320  return true;
321  }
322 
323  public function read()
324  {
325  $ilDB = $this->db;
326 
327  parent::read();
328 
329  $query = "SELECT * FROM exc_data " .
330  "WHERE obj_id = " . $ilDB->quote($this->getId(), "integer");
331 
332  $res = $ilDB->query($query);
333  while ($row = $ilDB->fetchObject($res)) {
334  $this->setInstruction($row->instruction);
335  $this->setTimestamp($row->time_stamp);
336  $pm = ($row->pass_mode == "")
337  ? "all"
338  : $row->pass_mode;
339  $this->setPassMode($pm);
340  $this->setShowSubmissions($row->show_submissions);
341  if ($row->pass_mode == "nr") {
342  $this->setPassNr($row->pass_nr);
343  }
344  $this->setCompletionBySubmission($row->compl_by_submission == 1 ? true : false);
345  $this->setCertificateVisibility($row->certificate_visibility);
346  $this->setTutorFeedback($row->tfeedback);
347  }
348 
349  $this->members_obj = new ilExerciseMembers($this);
350 
351  return true;
352  }
353 
354  public function update()
355  {
356  $ilDB = $this->db;
357 
358  parent::update();
359 
360  if ($this->getPassMode() == "all") {
361  $pass_nr = null;
362  } else {
363  $pass_nr = $this->getPassNr();
364  }
365 
366  $ilDB->update("exc_data", array(
367  "instruction" => array("clob", $this->getInstruction()),
368  "time_stamp" => array("integer", $this->getTimestamp()),
369  "pass_mode" => array("text", $this->getPassMode()),
370  "pass_nr" => array("integer", $this->getPassNr()),
371  "show_submissions" => array("integer", (int) $this->getShowSubmissions()),
372  'compl_by_submission' => array('integer', (int) $this->isCompletionBySubmissionEnabled()),
373  'tfeedback' => array('integer', (int) $this->getTutorFeedback()),
374  ), array(
375  "obj_id" => array("integer", $this->getId())
376  ));
377 
378  $this->updateAllUsersStatus();
379 
380  return true;
381  }
382 
386  public function sendAssignment(ilExAssignment $a_ass, $a_members)
387  {
388  $lng = $this->lng;
390 
391  $lng->loadLanguageModule("exc");
392 
393  // subject
394  $subject = $a_ass->getTitle()
395  ? $this->getTitle() . ": " . $a_ass->getTitle()
396  : $this->getTitle();
397 
398 
399  // body
400 
401  $body = $a_ass->getInstruction();
402  $body .= "\n\n";
403 
404  $body .= $lng->txt("exc_edit_until") . ": ";
405  $body .= (!$a_ass->getDeadline())
406  ? $lng->txt("exc_no_deadline_specified")
408  $body .= "\n\n";
409 
410  include_once "Services/Link/classes/class.ilLink.php";
411  $body .= ilLink::_getLink($this->getRefId(), "exc");
412 
413 
414  // files
415  $file_names = array();
416  include_once("./Modules/Exercise/classes/class.ilFSStorageExercise.php");
417  $storage = new ilFSStorageExercise($a_ass->getExerciseId(), $a_ass->getId());
418  $files = $storage->getFiles();
419  if (count($files)) {
420  include_once "./Services/Mail/classes/class.ilFileDataMail.php";
421  $mfile_obj = new ilFileDataMail($GLOBALS['DIC']['ilUser']->getId());
422  foreach ($files as $file) {
423  $mfile_obj->copyAttachmentFile($file["fullpath"], $file["name"]);
424  $file_names[] = $file["name"];
425  }
426  }
427 
428  // recipients
429  $recipients = array();
430  foreach ($a_members as $member_id) {
431  $tmp_obj = ilObjectFactory::getInstanceByObjId($member_id);
432  $recipients[] = $tmp_obj->getLogin();
433  unset($tmp_obj);
434  }
435  $recipients = implode(",", $recipients);
436 
437  // send mail
438  include_once "Services/Mail/classes/class.ilMail.php";
439  $tmp_mail_obj = new ilMail($ilUser->getId());
440  $errors = $tmp_mail_obj->sendMail(
441  $recipients,
442  "",
443  "",
444  $subject,
445  $body,
446  $file_names,
447  array("normal")
448  );
449  unset($tmp_mail_obj);
450 
451  // remove tmp files
452  if (sizeof($file_names)) {
453  $mfile_obj->unlinkFiles($file_names);
454  unset($mfile_obj);
455  }
456 
457  // set recipients mail status
458  foreach ($a_members as $member_id) {
459  $member_status = $a_ass->getMemberStatus($member_id);
460  $member_status->setSent(true);
461  $member_status->update();
462  }
463 
464  return true;
465  }
466 
470  public function determinStatusOfUser($a_user_id = 0)
471  {
473 
474  if ($a_user_id == 0) {
475  $a_user_id = $ilUser->getId();
476  }
477 
478  include_once("./Modules/Exercise/classes/class.ilExAssignment.php");
480 
481  $passed_all_mandatory = true;
482  $failed_a_mandatory = false;
483  $cnt_passed = 0;
484  $cnt_notgraded = 0;
485  $passed_at_least_one = false;
486 
487  foreach ($ass as $a) {
488  $stat = $a->getMemberStatus($a_user_id)->getStatus();
489  if ($a->getMandatory() && ($stat == "failed" || $stat == "notgraded")) {
490  $passed_all_mandatory = false;
491  }
492  if ($a->getMandatory() && ($stat == "failed")) {
493  $failed_a_mandatory = true;
494  }
495  if ($stat == "passed") {
496  $cnt_passed++;
497  }
498  if ($stat == "notgraded") {
499  $cnt_notgraded++;
500  }
501  }
502 
503  if (count($ass) == 0) {
504  $passed_all_mandatory = false;
505  }
506 
507  if ($this->getPassMode() != "nr") {
508  //echo "5";
509  $overall_stat = "notgraded";
510  if ($failed_a_mandatory) {
511  //echo "6";
512  $overall_stat = "failed";
513  } elseif ($passed_all_mandatory && $cnt_passed > 0) {
514  //echo "7";
515  $overall_stat = "passed";
516  }
517  } else {
518  //echo "8";
519  $min_nr = $this->getPassNr();
520  $overall_stat = "notgraded";
521  //echo "*".$cnt_passed."*".$cnt_notgraded."*".$min_nr."*";
522  if ($failed_a_mandatory || ($cnt_passed + $cnt_notgraded < $min_nr)) {
523  //echo "9";
524  $overall_stat = "failed";
525  } elseif ($passed_all_mandatory && $cnt_passed >= $min_nr) {
526  //echo "A";
527  $overall_stat = "passed";
528  }
529  }
530 
531  $ret = array(
532  "overall_status" => $overall_stat,
533  "failed_a_mandatory" => $failed_a_mandatory);
534  //echo "<br>p:".$cnt_passed.":ng:".$cnt_notgraded;
535  //var_dump($ret);
536  return $ret;
537  }
538 
542  public function updateUserStatus($a_user_id = 0)
543  {
545 
546  if ($a_user_id == 0) {
547  $a_user_id = $ilUser->getId();
548  }
549 
550  $st = $this->determinStatusOfUser($a_user_id);
551 
552  include_once("./Modules/Exercise/classes/class.ilExerciseMembers.php");
554  $this->getId(),
555  $a_user_id,
556  $st["overall_status"]
557  );
558  }
559 
563  public function updateAllUsersStatus()
564  {
565  if (!is_object($this->members_obj)) {
566  $this->members_obj = new ilExerciseMembers($this);
567  }
568 
569  $mems = $this->members_obj->getMembers();
570  foreach ($mems as $mem) {
571  $this->updateUserStatus($mem);
572  }
573  }
574 
578  public function exportGradesExcel()
579  {
580  include_once("./Modules/Exercise/classes/class.ilExAssignment.php");
581  $ass_data = ilExAssignment::getInstancesByExercise($this->getId());
582 
583  include_once "./Services/Excel/classes/class.ilExcel.php";
584  $excel = new ilExcel();
585  $excel->addSheet($this->lng->txt("exc_status"));
586 
587 
588  //
589  // status
590  //
591 
592  // header row
593  $row = $cnt = 1;
594  $excel->setCell($row, 0, $this->lng->txt("name"));
595  foreach ($ass_data as $ass) {
596  $excel->setCell($row, $cnt++, ($cnt / 2) . " - ". $this->lng->txt("exc_tbl_status"));
597  $excel->setCell($row, $cnt++, (($cnt - 1) / 2) . " - ". $this->lng->txt("exc_tbl_mark"));
598  }
599  $excel->setCell($row, $cnt++, $this->lng->txt("exc_total_exc"));
600  $excel->setCell($row, $cnt++, $this->lng->txt("exc_mark"));
601  $excel->setCell($row++, $cnt, $this->lng->txt("exc_comment_for_learner"));
602  $excel->setBold("A1:" . $excel->getColumnCoord($cnt) . "1");
603 
604  // data rows
605  $mem_obj = new ilExerciseMembers($this);
606 
607  $filtered_members = $GLOBALS['DIC']->access()->filterUserIdsByRbacOrPositionOfCurrentUser(
608  'edit_submissions_grades',
609  'edit_submissions_grades',
610  $this->getRefId(),
611  (array) $mem_obj->getMembers()
612  );
613 
614  foreach ((array) $filtered_members as $user_id) {
615  $mems[$user_id] = ilObjUser::_lookupName($user_id);
616  }
617  $mems = ilUtil::sortArray($mems, "lastname", "asc", false, true);
618 
619  include_once 'Services/Tracking/classes/class.ilLPMarks.php';
620  foreach ($mems as $user_id => $d) {
621  $col = 0;
622 
623  // name
624  $excel->setCell($row, $col++, $d["lastname"] . ", " . $d["firstname"] . " [" . $d["login"] . "]");
625 
626  reset($ass_data);
627  foreach ($ass_data as $ass) {
628  $status = $ass->getMemberStatus($user_id)->getStatus();
629  $mark = $ass->getMemberStatus($user_id)->getMark();
630  $excel->setCell($row, $col++, $this->lng->txt("exc_" . $status));
631  $excel->setCell($row, $col++, $mark);
632  }
633 
634  // total status
635  $status = ilExerciseMembers::_lookupStatus($this->getId(), $user_id);
636  $excel->setCell($row, $col++, $this->lng->txt("exc_" . $status));
637 
638  // #18096
639  $marks_obj = new ilLPMarks($this->getId(), $user_id);
640  $excel->setCell($row, $col++, $marks_obj->getMark());
641  $excel->setCell($row++, $col, $marks_obj->getComment());
642  }
643 
644 
645  //
646  // mark
647  //
648 
649  $excel->addSheet($this->lng->txt("exc_mark"));
650 
651  // header row
652  $row = $cnt = 1;
653  $excel->setCell($row, 0, $this->lng->txt("name"));
654  foreach ($ass_data as $ass) {
655  $excel->setCell($row, $cnt++, $cnt - 1);
656  }
657  $excel->setCell($row++, $cnt++, $this->lng->txt("exc_total_exc"));
658  $excel->setBold("A1:" . $excel->getColumnCoord($cnt) . "1");
659 
660  // data rows
661  reset($mems);
662  foreach ($mems as $user_id => $d) {
663  $col = 0;
664 
665  // name
666  $d = ilObjUser::_lookupName($user_id);
667  $excel->setCell($row, $col++, $d["lastname"] . ", " . $d["firstname"] . " [" . $d["login"] . "]");
668 
669  reset($ass_data);
670  foreach ($ass_data as $ass) {
671  $excel->setCell($row, $col++, $ass->getMemberStatus($user_id)->getMark());
672  }
673 
674  // total mark
675  $excel->setCell($row++, $col, ilLPMarks::_lookupMark($user_id, $this->getId()));
676  }
677 
678  $exc_name = ilUtil::getASCIIFilename(preg_replace("/\s/", "_", $this->getTitle()));
679  $excel->sendToClient($exc_name);
680  }
681 
685  public function sendFeedbackFileNotification($a_feedback_file, $a_user_id, $a_ass_id, $a_is_text_feedback = false)
686  {
687  $user_ids = $a_user_id;
688  if (!is_array($user_ids)) {
689  $user_ids = array($user_ids);
690  }
691 
692  include_once("./Modules/Exercise/classes/class.ilExerciseMailNotification.php");
693 
694  $type = (bool) $a_is_text_feedback
697 
698  $not = new ilExerciseMailNotification();
699  $not->setType($type);
700  $not->setAssignmentId($a_ass_id);
701  $not->setObjId($this->getId());
702  if ($this->getRefId() > 0) {
703  $not->setRefId($this->getRefId());
704  }
705  $not->setRecipients($user_ids);
706  $not->send();
707  }
708 
718  {
720  }
721 
731  public function setCompletionBySubmission($bool)
732  {
733  $this->completion_by_submission = (bool) $bool;
734 
735  return $this;
736  }
737 
738  public function processExerciseStatus(ilExAssignment $a_ass, array $a_user_ids, $a_has_submitted, array $a_valid_submissions = null)
739  {
740  $a_has_submitted = (bool) $a_has_submitted;
741 
742  include_once("./Modules/Exercise/classes/class.ilExerciseMembers.php");
743  foreach ($a_user_ids as $user_id) {
744  $member_status = $a_ass->getMemberStatus($user_id);
745  $member_status->setReturned($a_has_submitted);
746  $member_status->update();
747 
748  ilExerciseMembers::_writeReturned($this->getId(), $user_id, $a_has_submitted);
749  }
750 
751  // re-evaluate exercise status
752  if ($this->isCompletionBySubmissionEnabled()) {
753  foreach ($a_user_ids as $user_id) {
754  $status = 'notgraded';
755  if ($a_has_submitted) {
756  if (!is_array($a_valid_submissions) ||
757  $a_valid_submissions[$user_id]) {
758  $status = 'passed';
759  }
760  }
761 
762  $member_status = $a_ass->getMemberStatus($user_id);
763  $member_status->setStatus($status);
764  $member_status->update();
765  }
766  }
767  }
768 
775  public static function _lookupFinishedUserExercises($a_user_id)
776  {
777  global $DIC;
778 
779  $ilDB = $DIC->database();
780 
781  $set = $ilDB->query("SELECT obj_id, status FROM exc_members" .
782  " WHERE usr_id = " . $ilDB->quote($a_user_id, "integer") .
783  " AND (status = " . $ilDB->quote("passed", "text") .
784  " OR status = " . $ilDB->quote("failed", "text") . ")");
785 
786  $all = array();
787  while ($row = $ilDB->fetchAssoc($set)) {
788  $all[$row["obj_id"]] = ($row["status"] == "passed");
789  }
790  return $all;
791  }
792 
793 
800  public function getCertificateVisibility()
801  {
802  return (strlen($this->certificate_visibility)) ? $this->certificate_visibility : 0;
803  }
804 
811  public function setCertificateVisibility($a_value)
812  {
813  $this->certificate_visibility = $a_value;
814  }
815 
822  public function saveCertificateVisibility($a_value)
823  {
824  $ilDB = $this->db;
825 
826  $affectedRows = $ilDB->manipulateF(
827  "UPDATE exc_data SET certificate_visibility = %s WHERE obj_id = %s",
828  array('integer', 'integer'),
829  array($a_value, $this->getId())
830  );
831  }
832 
838  public function hasAddToDesktop()
839  {
840  $exc_set = new ilSetting("excs");
841  return (bool) $exc_set->get("add_to_pd", true);
842  }
843 }
static sortArray( $array, $a_array_sortby, $a_array_sortorder=0, $a_numeric=false, $a_keep_keys=false)
sortArray
static _lookupName($a_user_id)
lookup user name
setCompletionBySubmission($bool)
Enabled/Disable completion by submission.
getMemberStatus($a_user_id=null)
determinStatusOfUser($a_user_id=0)
Determine status of user.
static removeForObject($type, $id)
Remove all notifications for given object.
Exercise assignment.
getPassMode()
Get pass mode (all | nr)
Class ilExerciseMembers.
getCertificateVisibility()
Returns the visibility settings of the certificate.
global $DIC
Definition: saml.php:7
Class ilFileDataMail.
getId()
Get assignment id.
$factory
Definition: metadata.php:43
getDeadline()
Get deadline (timestamp)
setDate($a_hour, $a_minutes, $a_day, $a_month, $a_year)
const IL_CAL_UNIX
static getASCIIFilename($a_filename)
convert utf8 to ascii filename
setInstruction($a_instruction)
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false, $include_seconds=false)
Format a date public.
static _writeStatus($a_obj_id, $a_user_id, $a_status)
Write user status.
user()
Definition: user.php:4
getShowSubmissions()
Get whether submissions of learners should be shown to other learners after deadline.
static _writeReturned($a_obj_id, $a_user_id, $a_status)
Write returned status.
setCertificateVisibility($a_value)
Sets the visibility settings of the certificate.
updateAllUsersStatus()
Update status of all users.
getExerciseId()
Get exercise id.
Class ilObjExercise.
foreach($_POST as $key=> $value) $res
setPassMode($a_val)
Set pass mode (all | nr)
getId()
get object id public
setTimestamp($a_timestamp)
__construct($a_id=0, $a_call_by_reference=true)
Constructor public.
static _lookupStatus($a_obj_id, $a_user_id)
Lookup current status (notgraded|passed|failed)
static getInstancesByExercise($a_exc_id)
getTitle()
get object title public
Date and time handling
$ilUser
Definition: imgupload.php:18
$query
static getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
setTutorFeedback($a_value)
sendFeedbackFileNotification($a_feedback_file, $a_user_id, $a_ass_id, $a_is_text_feedback=false)
Send feedback file notification to user.
hasAddToDesktop()
Add to desktop after hand-in.
$row
static cloneAssignmentsOfExercise($a_old_exc_id, $a_new_exc_id, array $a_crit_cat_map)
Clone assignments of exercise.
update($pash, $contents, Config $config)
isCompletionBySubmissionEnabled()
Checks whether completion by submission is enabled or not.
static _lookupFinishedUserExercises($a_user_id)
Get all exercises for user.
updateUserStatus($a_user_id=0)
Update exercise status of user.
$errors
Definition: index.php:6
setShowSubmissions($a_val)
Set whether submissions of learners should be shown to other learners after deadline.
static getInstancesByParentId($a_parent_id)
getInstruction()
Get instruction.
sendAssignment(ilExAssignment $a_ass, $a_members)
send exercise per mail to members
saveCertificateVisibility($a_value)
Saves the visibility settings of the certificate.
global $ilDB
$ret
Definition: parser.php:6
getRefId()
get reference id public
exportGradesExcel()
Exports grades as excel.
getPassNr()
Get number of assignments that must be passed to pass the exercise.
static _lookupMark($a_usr_id, $a_obj_id)
processExerciseStatus(ilExAssignment $a_ass, array $a_user_ids, $a_has_submitted, array $a_valid_submissions=null)
cloneObject($a_target_id, $a_copy_id=0, $a_omit_tree=false)
Clone exercise (no member data)
for($i=6; $i< 13; $i++) for($i=1; $i< 13; $i++) $d
Definition: date.php:296
$GLOBALS['JPEG_Segment_Names']
Global Variable: XMP_tag_captions.
setPassNr($a_val)
Set number of assignments that must be passed to pass the exercise.