ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
class.ilCourseXMLParser.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=0);
27 {
28  public const MODE_SOAP = 1;
29  public const MODE_EXPORT = 2;
30 
31  private int $mode = self::MODE_EXPORT;
32 
33  private bool $in_meta_data = false;
34  private bool $in_availability = false;
35  private bool $in_registration = false;
36  private bool $in_period = false;
37  private bool $in_period_with_time = false;
38 
39  private ?ilDateTime $period_start = null;
40  private ?ilDateTime $period_end = null;
41 
42  private string $cdata = '';
43 
44  private string $current_container_setting = ''; // current meta data object
46  private ?ilLogger $log;
47  protected ilSetting $setting;
51  protected ?ilMD $md_obj = null;
56  protected array $course_members_array = [];
57 
58  public function __construct(ilObjCourse $a_course_obj, string $a_xml_file = '')
59  {
60  global $DIC;
61 
62  parent::__construct($a_xml_file);
63  $this->sax_controller = new ilSaxController();
64  $this->log = $DIC->logger()->crs();
65  $this->setting = $DIC->settings();
66  $this->course_obj = $a_course_obj;
67  $this->course_members = ilCourseParticipants::_getInstanceByObjId($this->course_obj->getId());
68  $this->course_waiting_list = new ilCourseWaitingList($this->course_obj->getId());
69  // flip the array so we can use array_key_exists
70  $this->course_members_array = array_flip($this->course_members->getParticipants());
71 
72  $this->md_obj = new ilMD($this->course_obj->getId(), 0, 'crs');
73  $this->setMDObject($this->md_obj);
74  }
75 
76  public function setMode(int $a_mode): void
77  {
78  $this->mode = $a_mode;
79  }
80 
81  public function getMode(): int
82  {
83  return $this->mode;
84  }
85 
86  public function startParsing(): void
87  {
88  parent::startParsing();
89 
90  // rewrite autogenerated entry
91  $general = $this->getMDObject()->getGeneral();
92  $identifier_ids = $general->getIdentifierIds();
93  if (!isset($identifier_ids[0])) {
94  return;
95  }
96  $identifier = $general->getIdentifier($identifier_ids[0]);
97  $identifier->setEntry(
98  'il__' . $this->getMDObject()->getObjType() . '_' . $this->getMDObject()->getObjId()
99  );
100  $identifier->update();
101  }
102 
106  public function setHandlers($a_xml_parser): void
107  {
108  $this->sax_controller->setHandlers($a_xml_parser);
109  $this->sax_controller->setDefaultElementHandler($this);
110  $this->sax_controller->setElementHandler(
111  $this->adv_md_handler = new ilAdvancedMDValueParser($this->course_obj->getId()),
112  'AdvancedMetaData'
113  );
114  }
115 
119  public function handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs): void
120  {
121  $a_attribs = $this->trimAndStripAttribs($a_attribs);
122  if ($this->in_meta_data) {
123  parent::handlerBeginTag($a_xml_parser, $a_name, $a_attribs);
124  return;
125  }
126 
127  switch ($a_name) {
128  case 'Course':
129  if (strlen($a_attribs['importId'] ?? '')) {
130  $this->log->write("CourseXMLParser: importId = " . $a_attribs['importId']);
131  $this->course_obj->setImportId($a_attribs['importId']);
132  ilObject::_writeImportId($this->course_obj->getId(), $a_attribs['importId']);
133  }
134  if (strlen($a_attribs['showMembers'] ?? '')) {
135  $this->course_obj->setShowMembers(
136  $a_attribs['showMembers'] == 'Yes'
137  );
138  }
139  break;
140 
141  case 'Admin':
142  if ($id_data = $this->__parseId($a_attribs['id'] ?? '')) {
143  if ($id_data['local'] or $id_data['imported']) {
144  $this->handleAdmin($a_attribs, $id_data);
145  }
146  }
147  break;
148 
149  case 'Tutor':
150  if ($id_data = $this->__parseId($a_attribs['id'] ?? '')) {
151  if ($id_data['local'] or $id_data['imported']) {
152  $this->handleTutor($a_attribs, $id_data);
153  }
154  }
155  break;
156 
157  case 'Member':
158  if ($id_data = $this->__parseId($a_attribs['id'] ?? '')) {
159  if ($id_data['local'] or $id_data['imported']) {
160  $this->handleMember($a_attribs, $id_data);
161  }
162  }
163  break;
164 
165  case 'Subscriber':
166  if ($id_data = $this->__parseId($a_attribs['id'] ?? '')) {
167  if ($id_data['local'] or $id_data['imported']) {
168  $this->handleSubscriber($a_attribs, $id_data);
169  }
170  }
171  break;
172 
173  case 'WaitingList':
174  if ($id_data = $this->__parseId($a_attribs['id'] ?? '')) {
175  if ($id_data['local'] or $id_data['imported']) {
176  $this->handleWaitingList($a_attribs, $id_data);
177  }
178  }
179  break;
180 
181  case 'Owner':
182  if ($id_data = $this->__parseId($a_attribs['id'] ?? '')) {
183  if ($id_data['local'] or $id_data['imported']) {
184  $this->course_obj->setOwner((int) ($id_data['usr_id'] ?? 0));
185  $this->course_obj->updateOwner();
186  }
187  }
188  break;
189 
190  case 'Settings':
191  break;
192  case 'Availability':
193  $this->in_availability = true;
194  break;
195 
196  case 'NotAvailable':
197  if ($this->in_availability) {
198  $this->course_obj->setOfflineStatus(true);
199  } elseif ($this->in_registration) {
200  $this->course_obj->setSubscriptionLimitationType(ilCourseConstants::IL_CRS_SUBSCRIPTION_DEACTIVATED);
201  }
202 
203  break;
204 
205  case 'Unlimited':
206  if ($this->in_availability) {
207  $this->course_obj->setOfflineStatus(false);
208  } elseif ($this->in_registration) {
209  $this->course_obj->setSubscriptionLimitationType(ilCourseConstants::IL_CRS_SUBSCRIPTION_UNLIMITED);
210  }
211 
212  break;
213  case 'TemporarilyAvailable':
214  if ($this->in_availability) {
215  $this->course_obj->setOfflineStatus(false);
216  } elseif ($this->in_registration) {
217  $this->course_obj->setSubscriptionLimitationType(ilCourseConstants::IL_CRS_SUBSCRIPTION_LIMITED);
218  }
219  break;
220 
221  case 'Start':
222  break;
223 
224  case 'End':
225  break;
226 
227  case 'Syllabus':
228  break;
229 
230  case 'TargetGroup':
231  break;
232 
233  case 'Contact':
234  break;
235 
236  case 'Name':
237  case 'Responsibility':
238  case 'Phone':
239  case 'Email':
240  case 'Consultation':
241  break;
242 
243  case 'Registration':
244  $this->in_registration = true;
245 
246  switch ($a_attribs['registrationType'] ?? '') {
247  case 'Confirmation':
248  $this->course_obj->setSubscriptionType(ilCourseConstants::IL_CRS_SUBSCRIPTION_CONFIRMATION);
249  break;
250 
251  case 'Direct':
252  $this->course_obj->setSubscriptionType(ilCourseConstants::IL_CRS_SUBSCRIPTION_DIRECT);
253  break;
254 
255  case 'Password':
256  $this->course_obj->setSubscriptionType(ilCourseConstants::IL_CRS_SUBSCRIPTION_PASSWORD);
257  break;
258  }
259 
260  $this->course_obj->setSubscriptionMaxMembers((int) ($a_attribs['maxMembers'] ?? 0));
261  $this->course_obj->enableSubscriptionMembershipLimitation($this->course_obj->getSubscriptionMaxMembers() > 0);
262  $this->course_obj->enableWaitingList(($a_attribs['waitingList'] ?? null) == 'Yes' ? true : false);
263  break;
264 
265  case 'Sort':
266  ilContainerSortingSettings::_importContainerSortingSettings($a_attribs, $this->course_obj->getId());
267 
268  //#17837
269  $this->course_obj->setOrderType(
270  ilContainerSortingSettings::getInstanceByObjId($this->course_obj->getId())->getSortMode()
271  );
272  break;
273 
274  case 'Disabled':
275  $this->course_obj->setSubscriptionLimitationType(ilCourseConstants::IL_CRS_SUBSCRIPTION_DEACTIVATED);
276  break;
277 
278  case "MetaData":
279  $this->in_meta_data = true;
280  parent::handlerBeginTag($a_xml_parser, $a_name, $a_attribs);
281  break;
282 
283  case 'ContainerSetting':
284  $this->current_container_setting = ($a_attribs['id'] ?? '');
285  break;
286 
287  case 'Period':
288  $this->in_period = true;
289  $this->in_period_with_time = (bool) ($a_attribs['withTime'] ?? false);
290  break;
291 
292  case 'WaitingListAutoFill':
293  case 'CancellationEnd':
294  case 'MinMembers':
295  case 'StatusDetermination':
296  case 'MailToMembersType':
297  break;
298 
299  case 'WelcomeMail':
300  if (array_key_exists('status', $a_attribs)) {
301  $this->course_obj->setAutoNotification((bool) $a_attribs['status']);
302  }
303  break;
304 
305  case 'CourseMap':
306  $this->course_obj->setEnableCourseMap((bool) $a_attribs['enabled'] ?? false);
307  $this->course_obj->setLatitude((string) $a_attribs['latitude'] ?? '');
308  $this->course_obj->setLongitude((string) $a_attribs['longitude'] ?? '');
309  $this->course_obj->setLocationZoom((int) $a_attribs['location_zoom'] ?? 0);
310  break;
311 
312  case 'SessionLimit':
313  if (isset($a_attribs['active'])) {
314  $this->course_obj->enableSessionLimit((bool) $a_attribs['active']);
315  }
316  if (isset($a_attribs['previous'])) {
317  $this->course_obj->setNumberOfPreviousSessions((int) $a_attribs['previous']);
318  }
319  if (isset($a_attribs['next'])) {
320  $this->course_obj->setNumberOfNextSessions((int) $a_attribs['next']);
321  }
322  break;
323  }
324  }
325 
326  public function __parseId($a_id): array
327  {
328  $fields = explode('_', $a_id);
329 
330  if (!is_array($fields) or
331  $fields[0] != 'il' or
332  !is_numeric($fields[1]) or
333  $fields[2] != 'usr' or
334  !is_numeric($fields[3])) {
335  return [];
336  }
337  if ($id = ilObjUser::_getImportedUserId($a_id)) {
338  return array('imported' => true,
339  'local' => false,
340  'usr_id' => $id
341  );
342  }
343  if ($fields[1] == $this->setting->get('inst_id', '0') && strlen(ilObjUser::_lookupLogin((int) $fields[3]))) {
344  return array('imported' => false,
345  'local' => true,
346  'usr_id' => (int) $fields[3]
347  );
348  }
349  return [];
350  }
351 
355  private function handleAdmin(array $a_attribs, array $id_data): void
356  {
357  if (!isset($a_attribs['action']) || $a_attribs['action'] == 'Attach') {
358  // if action not set, or attach
359  if (!array_key_exists($id_data['usr_id'], $this->course_members_array)) {
360  // add only if member is not assigned yet
361  $this->course_members->add($id_data['usr_id'], ilParticipants::IL_CRS_ADMIN);
362  if (isset($a_attribs['notification']) && $a_attribs['notification'] == 'Yes') {
363  $this->course_members->updateNotification($id_data['usr_id'], true);
364  }
365  if (isset($a_attribs['passed']) && $a_attribs['passed'] == 'Yes') {
366  $this->course_members->updatePassed($id_data['usr_id'], true);
367  }
368  if (isset($a_attribs['contact']) && $a_attribs['contact'] == 'Yes') {
369  // default for new course admin/tutors is "no contact"
370  $this->course_members->updateContact($id_data['usr_id'], true);
371  }
372  $this->course_members_array[$id_data['usr_id']] = "added";
373  } else {
374  // update
375  if (isset($a_attribs['notification']) && $a_attribs['notification'] == 'Yes') {
376  $this->course_members->updateNotification($id_data['usr_id'], true);
377  }
378  if (isset($a_attribs['passed']) && $a_attribs['passed'] == 'Yes') {
379  $this->course_members->updatePassed($id_data['usr_id'], true);
380  }
381  if (isset($a_attribs['contact']) && $a_attribs['contact'] == 'Yes') {
382  $this->course_members->updateContact($id_data['usr_id'], true);
383  } elseif (isset($a_attribs['contact']) && $a_attribs['contact'] == 'No') {
384  $this->course_members->updateContact($id_data['usr_id'], false);
385  }
386  $this->course_members->updateBlocked($id_data['usr_id'], false);
387  }
388  } elseif (isset($a_attribs['action']) && $a_attribs['action'] == 'Detach' && $this->course_members->isAdmin($id_data['usr_id'])) {
389  // if action set and detach and is admin of course
390  $this->course_members->delete($id_data['usr_id']);
391  }
392  }
393 
394  private function handleTutor(array $a_attribs, array $id_data): void
395  {
396  if (!isset($a_attribs['action']) || $a_attribs['action'] == 'Attach') {
397  // if action not set, or attach
398  if (!array_key_exists($id_data['usr_id'], $this->course_members_array)) {
399  // add only if member is not assigned yet
400  $this->course_members->add($id_data['usr_id'], ilParticipants::IL_CRS_TUTOR);
401  if (isset($a_attribs['notification']) && $a_attribs['notification'] == 'Yes') {
402  $this->course_members->updateNotification($id_data['usr_id'], true);
403  }
404  if (isset($a_attribs['passed']) && $a_attribs['passed'] == 'Yes') {
405  $this->course_members->updatePassed($id_data['usr_id'], true);
406  }
407  if (isset($a_attribs['contact']) && $a_attribs['contact'] == 'Yes') {
408  // default for new course admin/tutors is "no contact"
409  $this->course_members->updateContact($id_data['usr_id'], true);
410  }
411  $this->course_members_array[$id_data['usr_id']] = "added";
412  } else {
413  if (isset($a_attribs['notification']) && $a_attribs['notification'] == 'Yes') {
414  $this->course_members->updateNotification($id_data['usr_id'], true);
415  }
416  if (isset($a_attribs['passed']) && $a_attribs['passed'] == 'Yes') {
417  $this->course_members->updatePassed($id_data['usr_id'], true);
418  }
419  if (isset($a_attribs['contact']) && $a_attribs['contact'] == 'Yes') {
420  $this->course_members->updateContact($id_data['usr_id'], true);
421  } elseif (isset($a_attribs['contact']) && $a_attribs['contact'] == 'No') {
422  $this->course_members->updateContact($id_data['usr_id'], false);
423  }
424  $this->course_members->updateBlocked($id_data['usr_id'], false);
425  }
426  } elseif (isset($a_attribs['action']) && $a_attribs['action'] == 'Detach' && $this->course_members->isTutor($id_data['usr_id'])) {
427  // if action set and detach and is tutor of course
428  $this->course_members->delete($id_data['usr_id']);
429  }
430  }
431 
435  private function handleMember(array $a_attribs, array $id_data): void
436  {
437  if (!isset($a_attribs['action']) || $a_attribs['action'] == 'Attach') {
438  // if action not set, or set and attach
439  if (!array_key_exists($id_data['usr_id'], $this->course_members_array)) {
440  // add only if member is not yet assigned as tutor or admin
441  $this->course_members->add($id_data['usr_id'], ilParticipants::IL_CRS_MEMBER);
442  if (isset($a_attribs['blocked']) && $a_attribs['blocked'] == 'Yes') {
443  $this->course_members->updateBlocked($id_data['usr_id'], true);
444  }
445  if (isset($a_attribs['passed']) && $a_attribs['passed'] == 'Yes') {
446  $this->course_members->updatePassed($id_data['usr_id'], true);
447  }
448  $this->course_members_array[$id_data['usr_id']] = "added";
449  } else {
450  // the member does exist. Now update status etc. only
451  if (isset($a_attribs['blocked']) && $a_attribs['blocked'] == 'Yes') {
452  $this->course_members->updateBlocked($id_data['usr_id'], true);
453  }
454  if (isset($a_attribs['passed']) && $a_attribs['passed'] == 'Yes') {
455  $this->course_members->updatePassed($id_data['usr_id'], true);
456  }
457  }
458  } elseif (isset($a_attribs['action']) && $a_attribs['action'] == 'Detach' && $this->course_members->isMember($id_data['usr_id'])) {
459  // if action set and detach and is member of course
460  $this->course_members->delete($id_data['usr_id']);
461  }
462  }
463 
467  private function handleSubscriber(array $a_attribs, array $id_data): void
468  {
469  if (!isset($a_attribs['action']) || $a_attribs['action'] == 'Attach') {
470  // if action not set, or attach
471  if (!$this->course_members->isSubscriber($id_data['usr_id'])) {
472  // add only if not exist
473  $this->course_members->addSubscriber($id_data['usr_id']);
474  }
475  $this->course_members->updateSubscriptionTime($id_data['usr_id'], (int) ($a_attribs['subscriptionTime'] ?? 0));
476  } elseif (isset($a_attribs['action']) && $a_attribs['action'] == 'Detach' && $this->course_members->isSubscriber($id_data['usr_id'])) {
477  // if action set and detach and is subscriber
478  $this->course_members->deleteSubscriber($id_data["usr_id"]);
479  }
480  }
481 
485  private function handleWaitingList(array $a_attribs, array $id_data): void
486  {
487  if (!isset($a_attribs['action']) || $a_attribs['action'] == 'Attach') {
488  // if action not set, or attach
489  if (!$this->course_waiting_list->isOnList($id_data['usr_id'])) {
490  // add only if not exists
491  $this->course_waiting_list->addToList($id_data['usr_id']);
492  }
493  $this->course_waiting_list->updateSubscriptionTime($id_data['usr_id'], (int) ($a_attribs['subscriptionTime'] ?? 0));
494  } elseif (isset($a_attribs['action']) && $a_attribs['action'] == 'Detach' && $this->course_waiting_list->isOnList($id_data['usr_id'])) {
495  // if action set and detach and is on list
496  $this->course_waiting_list->removeFromList($id_data['usr_id']);
497  }
498  }
499 
503  public function handlerEndTag($a_xml_parser, string $a_name): void
504  {
505  $this->cdata = $this->trimAndStrip((string) $this->cdata);
506  if ($this->in_meta_data) {
507  parent::handlerEndTag($a_xml_parser, $a_name);
508  }
509 
510  switch ($a_name) {
511  case 'Course':
512 
513  $this->log->write('CourseXMLParser: import_id = ' . $this->course_obj->getImportId());
514  /*
515  * This needs to be before MDUpdateListener, since otherwise container settings are
516  * overwritten by ilContainer::update in MDUpdateListener, see #24733.
517  */
518  $this->course_obj->readContainerSettings();
519  if ($this->getMode() === self::MODE_SOAP) {
520  $this->course_obj->MDUpdateListener('General');
521  $this->adv_md_handler->save();
522  }
523  // see #26169
524  $transl = ilObjectTranslation::getInstance($this->course_obj->getId());
525  if ($transl->getDefaultTitle() !== "") {
526  $this->course_obj->setTitle($transl->getDefaultTitle());
527  }
528  if ($transl->getDefaultDescription() !== "") {
529  $this->course_obj->setDescription($transl->getDefaultDescription());
530  }
531  $this->course_obj->update();
532  break;
533 
534  case 'Settings':
535  break;
536 
537  case 'Availability':
538  $this->in_availability = false;
539  break;
540 
541  case 'Registration':
542  $this->in_registration = false;
543  break;
544 
545  case 'Start':
546  if ($this->in_availability) {
547  $this->course_obj->setActivationStart((int) trim($this->cdata));
548  }
549  if ($this->in_registration) {
550  $this->course_obj->setSubscriptionStart((int) trim($this->cdata));
551  }
552  if ($this->in_period) {
553  if ((int) $this->cdata) {
554  if ($this->in_period_with_time) {
555  $this->period_start = new \ilDateTime((int) $this->cdata, IL_CAL_UNIX);
556  } else {
557  $this->period_start = new \ilDate((int) $this->cdata, IL_CAL_UNIX);
558  }
559  }
560  }
561  break;
562 
563  case 'End':
564  if ($this->in_availability) {
565  $this->course_obj->setActivationEnd((int) trim($this->cdata));
566  }
567  if ($this->in_registration) {
568  $this->course_obj->setSubscriptionEnd((int) trim($this->cdata));
569  }
570  if ($this->in_period) {
571  if ((int) $this->cdata) {
572  if ($this->in_period_with_time) {
573  $this->period_end = new \ilDateTime((int) $this->cdata, IL_CAL_UNIX);
574  } else {
575  $this->period_end = new \ilDate((int) $this->cdata, IL_CAL_UNIX);
576  }
577  }
578  }
579  break;
580 
581  case 'Syllabus':
582  $this->course_obj->setSyllabus(trim($this->cdata));
583  break;
584 
585  case 'TargetGroup':
586  $this->course_obj->setTargetGroup(trim($this->cdata));
587  break;
588 
589  case 'ImportantInformation':
590  $this->course_obj->setImportantInformation(trim($this->cdata));
591  break;
592 
593  case 'ViewMode':
594  $this->course_obj->setViewMode((int) trim($this->cdata));
595  break;
596 
597  case 'Name':
598  $this->course_obj->setContactName(trim($this->cdata));
599  break;
600 
601  case 'Responsibility':
602  $this->course_obj->setContactResponsibility(trim($this->cdata));
603  break;
604 
605  case 'Phone':
606  $this->course_obj->setContactPhone(trim($this->cdata));
607  break;
608 
609  case 'Email':
610  $this->course_obj->setContactEmail(trim($this->cdata));
611  break;
612 
613  case 'Consultation':
614  $this->course_obj->setContactConsultation(trim($this->cdata));
615  break;
616 
617  case 'Password':
618  $this->course_obj->setSubscriptionPassword(trim($this->cdata));
619  break;
620 
621  case 'MetaData':
622  $this->in_meta_data = false;
623  parent::handlerEndTag($a_xml_parser, $a_name);
624  break;
625 
626  case 'ContainerSetting':
627  if ($this->current_container_setting) {
629  $this->course_obj->getId(),
632  );
633  }
634  break;
635 
636  case 'Period':
637  $this->in_period = false;
638  try {
639  $this->course_obj->setCoursePeriod($this->period_start, $this->period_end);
640  } catch (Exception $e) {
641  $this->log->warning('invalid course period given');
642  }
643  break;
644 
645  case 'WaitingListAutoFill':
646  $this->course_obj->setWaitingListAutoFill((bool) $this->cdata);
647  break;
648 
649  case 'CancellationEnd':
650  if ((int) $this->cdata) {
651  $this->course_obj->setCancellationEnd(new ilDate((int) $this->cdata, IL_CAL_UNIX));
652  }
653  break;
654 
655  case 'MinMembers':
656  if ((int) $this->cdata) {
657  $this->course_obj->setSubscriptionMinMembers((int) $this->cdata);
658  }
659  break;
660 
661  case 'TimingMode':
662  $this->course_obj->setTimingMode((int) $this->cdata);
663  break;
664 
665  case 'StatusDetermination':
666  $this->course_obj->setStatusDetermination((int) $this->cdata);
667  break;
668 
669  case 'MailToMembersType':
670  $this->course_obj->setMailToMembersType((int) $this->cdata);
671  break;
672  }
673  $this->cdata = '';
674  }
675 
676  // PRIVATE
677 
678  public function handlerCharacterData($a_xml_parser, string $a_data): void
679  {
680  // call meta data handler
681  if ($this->in_meta_data) {
682  parent::handlerCharacterData($a_xml_parser, $a_data);
683  }
684  if ($a_data != "\n") {
685  // Replace multiple tabs with one space
686  $a_data = preg_replace("/\t+/", " ", $a_data);
687 
688  $this->cdata .= $a_data;
689  }
690  }
691 }
static _writeImportId(int $obj_id, string $import_id)
write import id to db (static)
handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs)
trimAndStrip(string $input)
handleWaitingList(array $a_attribs, array $id_data)
attach or detach members from waitinglist
handleAdmin(array $a_attribs, array $id_data)
attach or detach admin from course member
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
trimAndStripAttribs(array $attribs)
ilCourseWaitingList $course_waiting_list
static _importContainerSortingSettings(array $attibs, int $obj_id)
sorting import for all container objects
const IL_CAL_UNIX
handleSubscriber(array $a_attribs, array $id_data)
attach or detach members from subscribers
global $DIC
Definition: feed.php:28
__construct(VocabulariesInterface $vocabularies)
static _getInstanceByObjId(int $a_obj_id)
ilSaxController $sax_controller
$general
SECTIONS.
ilAdvancedMDValueParser $adv_md_handler
static getInstance(int $obj_id)
handlerEndTag($a_xml_parser, string $a_name)
handleTutor(array $a_attribs, array $id_data)
static _writeContainerSetting(int $a_id, string $a_keyword, string $a_value)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Interface definition for sax subset parsers.
Controller class for sax element handlers.
static _getImportedUserId(string $i2_id)
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
handleMember(array $a_attribs, array $id_data)
attach or detach user/member/admin from course member
ilCourseParticipants $course_members
__construct(ilObjCourse $a_course_obj, string $a_xml_file='')
handlerCharacterData($a_xml_parser, string $a_data)
Character data handler.
static _lookupLogin(int $a_user_id)