ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilCourseXMLParser.php
Go to the documentation of this file.
1<?php
2/*
3 +-----------------------------------------------------------------------------+
4 | ILIAS open source |
5 +-----------------------------------------------------------------------------+
6 | Copyright (c) 1998-2001 ILIAS open source, University of Cologne |
7 | |
8 | This program is free software; you can redistribute it and/or |
9 | modify it under the terms of the GNU General Public License |
10 | as published by the Free Software Foundation; either version 2 |
11 | of the License, or (at your option) any later version. |
12 | |
13 | This program is distributed in the hope that it will be useful, |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | GNU General Public License for more details. |
17 | |
18 | You should have received a copy of the GNU General Public License |
19 | along with this program; if not, write to the Free Software |
20 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21 +-----------------------------------------------------------------------------+
22*/
23
24
25include_once("Services/MetaData/classes/class.ilMDSaxParser.php");
26include_once("Services/MetaData/classes/class.ilMD.php");
27include_once('Services/Utilities/interfaces/interface.ilSaxSubsetParser.php');
28include_once('Services/Utilities/classes/class.ilSaxController.php');
29include_once 'Modules/Course/classes/class.ilCourseParticipants.php';
30include_once 'Modules/Course/classes/class.ilCourseWaitingList.php';
31include_once 'Modules/Course/classes/class.ilCourseConstants.php';
32
33
34
44{
45 public $lng;
46 public $md_obj = null; // current meta data object
47
49
59 public function __construct($a_course_obj, $a_xml_file = '')
60 {
61 global $DIC;
62
63 $lng = $DIC['lng'];
64 $ilLog = $DIC['ilLog'];
65
66 parent::__construct($a_xml_file);
67
68 $this->sax_controller = new ilSaxController();
69
70 $this->log = $ilLog;
71
72 $this->course_obj = $a_course_obj;
73 $this->course_members = ilCourseParticipants::_getInstanceByObjId($this->course_obj->getId());
74 $this->course_waiting_list = new ilCourseWaitingList($this->course_obj->getId());
75 // flip the array so we can use array_key_exists
76 $this->course_members_array = array_flip($this->course_members->getParticipants());
77
78 $this->md_obj = new ilMD($this->course_obj->getId(), 0, 'crs');
79 $this->setMDObject($this->md_obj);
80
81 $this->lng = $lng;
82 }
83
90 public function setHandlers($a_xml_parser)
91 {
92 $this->sax_controller->setHandlers($a_xml_parser);
93 $this->sax_controller->setDefaultElementHandler($this);
94
95 include_once('Services/AdvancedMetaData/classes/class.ilAdvancedMDValueParser.php');
96 $this->sax_controller->setElementHandler(
97 $this->adv_md_handler = new ilAdvancedMDValueParser($this->course_obj->getId()),
98 'AdvancedMetaData'
99 );
100 }
101
102
103
104
112 public function handlerBeginTag($a_xml_parser, $a_name, $a_attribs)
113 {
114 if ($this->in_meta_data) {
115 parent::handlerBeginTag($a_xml_parser, $a_name, $a_attribs);
116 return;
117 }
118
119 switch ($a_name) {
120 case 'Course':
121
122 if (strlen($a_attribs['importId'])) {
123 $this->log->write("CourseXMLParser: importId = " . $a_attribs['importId']);
124 $this->course_obj->setImportId($a_attribs['importId']);
125 ilObject::_writeImportId($this->course_obj->getId(), $a_attribs['importId']);
126 }
127 if (strlen($a_attribs['showMembers'])) {
128 $this->course_obj->setShowMembers(
129 $a_attribs['showMembers'] == 'Yes' ? true : false
130 );
131 }
132 break;
133
134 case 'Admin':
135 if ($id_data = $this->__parseId($a_attribs['id'])) {
136 if ($id_data['local'] or $id_data['imported']) {
137 $this->handleAdmin($a_attribs, $id_data);
138 }
139 }
140 break;
141
142 case 'Tutor':
143 if ($id_data = $this->__parseId($a_attribs['id'])) {
144 if ($id_data['local'] or $id_data['imported']) {
145 $this->handleTutor($a_attribs, $id_data);
146 }
147 }
148 break;
149
150 case 'Member':
151 if ($id_data = $this->__parseId($a_attribs['id'])) {
152 if ($id_data['local'] or $id_data['imported']) {
153 $this->handleMember($a_attribs, $id_data);
154 }
155 }
156 break;
157
158 case 'Subscriber':
159 if ($id_data = $this->__parseId($a_attribs['id'])) {
160 if ($id_data['local'] or $id_data['imported']) {
161 $this->handleSubscriber($a_attribs, $id_data);
162 }
163 }
164 break;
165
166 case 'WaitingList':
167 if ($id_data = $this->__parseId($a_attribs['id'])) {
168 if ($id_data['local'] or $id_data['imported']) {
169 $this->handleWaitingList($a_attribs, $id_data);
170 }
171 }
172 break;
173
174 case 'Owner':
175 if ($id_data = $this->__parseId($a_attribs['id'])) {
176 if ($id_data['local'] or $id_data['imported']) {
177 $this->course_obj->setOwner($id_data['usr_id']);
178 $this->course_obj->updateOwner();
179 }
180 }
181 break;
182
183
184 case 'Settings':
185 $this->in_settings = true;
186 break;
187 case 'Availability':
188 $this->in_availability = true;
189 break;
190
191 case 'NotAvailable':
192 if ($this->in_availability) {
193 $this->course_obj->setOfflineStatus(true);
194 } elseif ($this->in_registration) {
195 $this->course_obj->setSubscriptionLimitationType(IL_CRS_SUBSCRIPTION_DEACTIVATED);
196 }
197
198 break;
199
200 case 'Unlimited':
201 if ($this->in_availability) {
202 $this->course_obj->setOfflineStatus(false);
203 } elseif ($this->in_registration) {
204 $this->course_obj->setSubscriptionLimitationType(IL_CRS_SUBSCRIPTION_UNLIMITED);
205 }
206
207 break;
208 case 'TemporarilyAvailable':
209 if ($this->in_availability) {
210 $this->course_obj->setOfflineStatus(false);
211 } elseif ($this->in_registration) {
212 $this->course_obj->setSubscriptionLimitationType(IL_CRS_SUBSCRIPTION_LIMITED);
213 }
214 break;
215
216 case 'Start':
217 break;
218
219 case 'End':
220 break;
221
222 case 'Syllabus':
223 break;
224
225 case 'Contact':
226 break;
227
228 case 'Name':
229 case 'Responsibility':
230 case 'Phone':
231 case 'Email':
232 case 'Consultation':
233 break;
234
235 case 'Registration':
236 $this->in_registration = true;
237
238 switch ($a_attribs['registrationType']) {
239 case 'Confirmation':
240 $this->course_obj->setSubscriptionType(IL_CRS_SUBSCRIPTION_CONFIRMATION);
241 break;
242
243 case 'Direct':
244 $this->course_obj->setSubscriptionType(IL_CRS_SUBSCRIPTION_DIRECT);
245 break;
246
247 case 'Password':
248 $this->course_obj->setSubscriptionType(IL_CRS_SUBSCRIPTION_PASSWORD);
249 break;
250 }
251
252 $this->course_obj->setSubscriptionMaxMembers((int) $a_attribs['maxMembers']);
253 $this->course_obj->enableSubscriptionMembershipLimitation($this->course_obj->getSubscriptionMaxMembers() > 0);
254 $this->course_obj->setSubscriptionNotify($a_attribs['notification'] == 'Yes' ? true : false);
255 $this->course_obj->enableWaitingList($a_attribs['waitingList'] == 'Yes' ? true : false);
256 break;
257
258 case 'Sort':
259 include_once './Services/Container/classes/class.ilContainerSortingSettings.php';
260 ilContainerSortingSettings::_importContainerSortingSettings($a_attribs, $this->course_obj->getId());
261
262 //#17837
263 $this->course_obj->setOrderType(
264 ilContainerSortingSettings::getInstanceByObjId($this->course_obj->getId())->getSortMode()
265 );
266 break;
267
268 case 'Disabled':
269 $this->course_obj->getSubscriptionLimitationType(IL_CRS_SUBSCRIPTION_DEACTIVATED);
270 break;
271
272 case "MetaData":
273 $this->in_meta_data = true;
274 parent::handlerBeginTag($a_xml_parser, $a_name, $a_attribs);
275 break;
276
277 case 'ContainerSetting':
278 $this->current_container_setting = $a_attribs['id'];
279 break;
280
281 case 'Period':
282 $this->in_period = true;
283 break;
284
285 case 'WaitingListAutoFill':
286 case 'CancellationEnd':
287 case 'MinMembers':
288 break;
289 }
290 }
291
300 private function handleMember($a_attribs, $id_data)
301 {
302 if (!isset($a_attribs['action']) || $a_attribs['action'] == 'Attach') {
303 // if action not set, or set and attach
304 if (!array_key_exists($id_data['usr_id'], $this->course_members_array)) {
305 // add only if member is not yet assigned as tutor or admin
306 $this->course_members->add($id_data['usr_id'], IL_CRS_MEMBER);
307 if ($a_attribs['blocked'] == 'Yes') {
308 $this->course_members->updateBlocked($id_data['usr_id'], true);
309 }
310 if ($a_attribs['passed'] == 'Yes') {
311 $this->course_members->updatePassed($id_data['usr_id'], true);
312 }
313 $this->course_members_array[$id_data['usr_id']] = "added";
314 } else {
315 // the member does exist. Now update status etc. only
316 if ($a_attribs['blocked'] == 'Yes') {
317 $this->course_members->updateBlocked($id_data['usr_id'], true);
318 }
319 if ($a_attribs['passed'] == 'Yes') {
320 $this->course_members->updatePassed($id_data['usr_id'], true);
321 }
322 }
323 } elseif (isset($a_attribs['action']) && $a_attribs['action'] == 'Detach' && $this->course_members->isMember($id_data['usr_id'])) {
324 // if action set and detach and is member of course
325 $this->course_members->delete($id_data['usr_id']);
326 }
327 }
328
329
337 private function handleAdmin($a_attribs, $id_data)
338 {
339 global $DIC;
340
341 $rbacadmin = $DIC['rbacadmin'];
342
343 if (!isset($a_attribs['action']) || $a_attribs['action'] == 'Attach') {
344 // if action not set, or attach
345 if (!array_key_exists($id_data['usr_id'], $this->course_members_array)) {
346 // add only if member is not assigned yet
347 $this->course_members->add($id_data['usr_id'], IL_CRS_ADMIN);
348 if ($a_attribs['notification'] == 'Yes') {
349 $this->course_members->updateNotification($id_data['usr_id'], true);
350 }
351 if ($a_attribs['passed'] == 'Yes') {
352 $this->course_members->updatePassed($id_data['usr_id'], true);
353 }
354 if (isset($a_attribs['contact']) && $a_attribs['contact'] == 'Yes') {
355 // default for new course admin/tutors is "no contact"
356 $this->course_members->updateContact($id_data['usr_id'], true);
357 }
358 $this->course_members_array[$id_data['usr_id']] = "added";
359 } else {
360 // update
361 if ($a_attribs['notification'] == 'Yes') {
362 $this->course_members->updateNotification($id_data['usr_id'], true);
363 }
364 if ($a_attribs['passed'] == 'Yes') {
365 $this->course_members->updatePassed($id_data['usr_id'], true);
366 }
367 if (isset($a_attribs['contact']) && $a_attribs['contact'] == 'Yes') {
368 $this->course_members->updateContact($id_data['usr_id'], true);
369 } elseif (isset($a_attribs['contact']) && $a_attribs['contact'] == 'No') {
370 $this->course_members->updateContact($id_data['usr_id'], false);
371 }
372 $this->course_members->updateBlocked($id_data['usr_id'], false);
373 }
374 } elseif (isset($a_attribs['action']) && $a_attribs['action'] == 'Detach' && $this->course_members->isAdmin($id_data['usr_id'])) {
375 // if action set and detach and is admin of course
376 $this->course_members->delete($id_data['usr_id']);
377 }
378 }
379
380
388 private function handleTutor($a_attribs, $id_data)
389 {
390 if (!isset($a_attribs['action']) || $a_attribs['action'] == 'Attach') {
391 // if action not set, or attach
392 if (!array_key_exists($id_data['usr_id'], $this->course_members_array)) {
393 // add only if member is not assigned yet
394 $this->course_members->add($id_data['usr_id'], IL_CRS_TUTOR);
395 if ($a_attribs['notification'] == 'Yes') {
396 $this->course_members->updateNotification($id_data['usr_id'], true);
397 }
398 if ($a_attribs['passed'] == 'Yes') {
399 $this->course_members->updatePassed($id_data['usr_id'], true);
400 }
401 if (isset($a_attribs['contact']) && $a_attribs['contact'] == 'Yes') {
402 // default for new course admin/tutors is "no contact"
403 $this->course_members->updateContact($id_data['usr_id'], true);
404 }
405 $this->course_members_array[$id_data['usr_id']] = "added";
406 } else {
407 if ($a_attribs['notification'] == 'Yes') {
408 $this->course_members->updateNotification($id_data['usr_id'], true);
409 }
410 if ($a_attribs['passed'] == 'Yes') {
411 $this->course_members->updatePassed($id_data['usr_id'], true);
412 }
413 if (isset($a_attribs['contact']) && $a_attribs['contact'] == 'Yes') {
414 $this->course_members->updateContact($id_data['usr_id'], true);
415 } elseif (isset($a_attribs['contact']) && $a_attribs['contact'] == 'No') {
416 $this->course_members->updateContact($id_data['usr_id'], false);
417 }
418 $this->course_members->updateBlocked($id_data['usr_id'], false);
419 }
420 } elseif (isset($a_attribs['action']) && $a_attribs['action'] == 'Detach' && $this->course_members->isTutor($id_data['usr_id'])) {
421 // if action set and detach and is tutor of course
422 $this->course_members->delete($id_data['usr_id']);
423 }
424 }
425
426
427
434 private function handleSubscriber($a_attribs, $id_data)
435 {
436 if (!isset($a_attribs['action']) || $a_attribs['action'] == 'Attach') {
437 // if action not set, or attach
438 if (!$this->course_members->isSubscriber($id_data['usr_id'])) {
439 // add only if not exist
440 $this->course_members->addSubscriber($id_data['usr_id']);
441 }
442 $this->course_members->updateSubscriptionTime($id_data['usr_id'], $a_attribs['subscriptionTime']);
443 } elseif (isset($a_attribs['action']) && $a_attribs['action'] == 'Detach' && $this->course_members->isSubscriber($id_data['usr_id'])) {
444 // if action set and detach and is subscriber
445 $this->course_members->deleteSubscriber($id_data["usr_id"]);
446 }
447 }
448
455 private function handleWaitingList($a_attribs, $id_data)
456 {
457 if (!isset($a_attribs['action']) || $a_attribs['action'] == 'Attach') {
458 // if action not set, or attach
459 if (!$this->course_waiting_list->isOnList($id_data['usr_id'])) {
460 // add only if not exists
461 $this->course_waiting_list->addToList($id_data['usr_id']);
462 }
463 $this->course_waiting_list->updateSubscriptionTime($id_data['usr_id'], $a_attribs['subscriptionTime']);
464 } elseif (isset($a_attribs['action']) && $a_attribs['action'] == 'Detach' && $this->course_waiting_list->isOnList($id_data['usr_id'])) {
465 // if action set and detach and is on list
466 $this->course_waiting_list->removeFromList($id_data['usr_id']);
467 }
468 }
469
470
477 public function handlerEndTag($a_xml_parser, $a_name)
478 {
479 if ($this->in_meta_data) {
480 parent::handlerEndTag($a_xml_parser, $a_name);
481 }
482
483 switch ($a_name) {
484 case 'Course':
485
486 $this->log->write('CourseXMLParser: import_id = ' . $this->course_obj->getImportId());
487 $this->course_obj->MDUpdateListener('General');
488 $this->course_obj->update();
489 $this->adv_md_handler->save();
490 break;
491
492 case 'Settings':
493 $this->in_settings = false;
494 break;
495
496 case 'Availability':
497 $this->in_availability = false;
498 break;
499
500 case 'Registration':
501 $this->in_registration = false;
502 break;
503
504
505 case 'Start':
506 if ($this->in_availability) {
507 $this->course_obj->setActivationStart(trim($this->cdata));
508 }
509 if ($this->in_registration) {
510 $this->course_obj->setSubscriptionStart(trim($this->cdata));
511 }
512 if ($this->in_period) {
513 if ((int) $this->cdata) {
514 $this->course_obj->setCourseStart(new ilDate((int) $this->cdata, IL_CAL_UNIX));
515 }
516 }
517 break;
518
519 case 'End':
520 if ($this->in_availability) {
521 $this->course_obj->setActivationEnd(trim($this->cdata));
522 }
523 if ($this->in_registration) {
524 $this->course_obj->setSubscriptionEnd(trim($this->cdata));
525 }
526 if ($this->in_period) {
527 if ((int) $this->cdata) {
528 $this->course_obj->setCourseEnd(new ilDate((int) $this->cdata, IL_CAL_UNIX));
529 }
530 }
531 break;
532
533 case 'Syllabus':
534 $this->course_obj->setSyllabus(trim($this->cdata));
535 break;
536
537
538 case 'ImportantInformation':
539 $this->course_obj->setImportantInformation(trim($this->cdata));
540 break;
541
542 case 'ViewMode':
543 $this->course_obj->setViewMode(trim($this->cdata));
544 break;
545
546 case 'Name':
547 $this->course_obj->setContactName(trim($this->cdata));
548 break;
549
550 case 'Responsibility':
551 $this->course_obj->setContactResponsibility(trim($this->cdata));
552 break;
553
554 case 'Phone':
555 $this->course_obj->setContactPhone(trim($this->cdata));
556 break;
557
558 case 'Email':
559 $this->course_obj->setContactEmail(trim($this->cdata));
560 break;
561
562 case 'Consultation':
563 $this->course_obj->setContactConsultation(trim($this->cdata));
564 break;
565
566 case 'Password':
567 $this->course_obj->setSubscriptionPassword(trim($this->cdata));
568 break;
569
570 case 'MetaData':
571 $this->in_meta_data = false;
572 parent::handlerEndTag($a_xml_parser, $a_name);
573 break;
574
575 case 'ContainerSetting':
576 if ($this->current_container_setting) {
578 $this->course_obj->getId(),
579 $this->current_container_setting,
580 $this->cdata
581 );
582 }
583 break;
584
585 case 'Period':
586 $this->in_period = false;
587 break;
588
589 case 'WaitingListAutoFill':
590 $this->course_obj->setWaitingListAutoFill($this->cdata);
591 break;
592
593 case 'CancellationEnd':
594 if ((int) $this->cdata) {
595 $this->course_obj->setCancellationEnd(new ilDate((int) $this->cdata, IL_CAL_UNIX));
596 }
597 break;
598
599 case 'MinMembers':
600 if ((int) $this->cdata) {
601 $this->course_obj->setSubscriptionMinMembers((int) $this->cdata);
602 }
603 break;
604
605 case 'ViewMode':
606 $this->course_obj->setViewMode((int) $this->cdata);
607 break;
608
609 case 'TimingMode':
610 $this->course_obj->setTimingMode((int) $this->cdata);
611 break;
612 }
613 $this->cdata = '';
614
615 return;
616 }
617
624 public function handlerCharacterData($a_xml_parser, $a_data)
625 {
626 // call meta data handler
627 if ($this->in_meta_data) {
628 parent::handlerCharacterData($a_xml_parser, $a_data);
629 }
630 if ($a_data != "\n") {
631 // Replace multiple tabs with one space
632 $a_data = preg_replace("/\t+/", " ", $a_data);
633
634 $this->cdata .= $a_data;
635 }
636 }
637
638 // PRIVATE
639 public function __parseId($a_id)
640 {
641 global $DIC;
642
643 $ilias = $DIC['ilias'];
644
645 $fields = explode('_', $a_id);
646
647 if (!is_array($fields) or
648 $fields[0] != 'il' or
649 !is_numeric($fields[1]) or
650 $fields[2] != 'usr' or
651 !is_numeric($fields[3])) {
652 return false;
653 }
654 if ($id = ilObjUser::_getImportedUserId($a_id)) {
655 return array('imported' => true,
656 'local' => false,
657 'usr_id' => $id);
658 }
659 if (($fields[1] == $ilias->getSetting('inst_id', 0)) and strlen(ilObjUser::_lookupLogin($fields[3]))) {
660 return array('imported' => false,
661 'local' => true,
662 'usr_id' => $fields[3]);
663 }
664 return false;
665 }
666}
An exception for terminatinating execution or to throw for unit testing.
const IL_CRS_SUBSCRIPTION_LIMITED
const IL_CRS_SUBSCRIPTION_PASSWORD
const IL_CRS_SUBSCRIPTION_CONFIRMATION
const IL_CRS_SUBSCRIPTION_UNLIMITED
const IL_CRS_SUBSCRIPTION_DEACTIVATED
const IL_CRS_SUBSCRIPTION_DIRECT
const IL_CAL_UNIX
const IL_CRS_ADMIN
Base class for course and group participants.
const IL_CRS_MEMBER
const IL_CRS_TUTOR
static getInstanceByObjId($a_obj_id)
Get singleton instance.
static _importContainerSortingSettings($attibs, $obj_id)
sorting import for all container objects
static _writeContainerSetting($a_id, $a_keyword, $a_value)
static _getInstanceByObjId($a_obj_id)
Get singleton instance.
handleWaitingList($a_attribs, $id_data)
attach or detach members from waitinglist
handlerCharacterData($a_xml_parser, $a_data)
handler for character data
handlerBeginTag($a_xml_parser, $a_name, $a_attribs)
handler for begin of element
__construct($a_course_obj, $a_xml_file='')
Constructor.
handleSubscriber($a_attribs, $id_data)
attach or detach members from subscribers
handleTutor($a_attribs, $id_data)
attach or detach admin from course member
setHandlers($a_xml_parser)
set event handlers
handleAdmin($a_attribs, $id_data)
attach or detach admin from course member
handlerEndTag($a_xml_parser, $a_name)
handler for end of element
handleMember($a_attribs, $id_data)
attach or detach user/member/admin from course member
Class for single dates.
static _getImportedUserId($i2_id)
static _lookupLogin($a_user_id)
lookup login
static _writeImportId($a_obj_id, $a_import_id)
write import id to db (static)
Controller class for sax element handlers.
if(!array_key_exists('StateId', $_REQUEST)) $id
Interface definition for sax subset parsers.
global $DIC
Definition: saml.php:7