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 
25 include_once("Services/MetaData/classes/class.ilMDSaxParser.php");
26 include_once("Services/MetaData/classes/class.ilMD.php");
27 include_once('Services/Utilities/interfaces/interface.ilSaxSubsetParser.php');
28 include_once('Services/Utilities/classes/class.ilSaxController.php');
29 include_once 'Modules/Course/classes/class.ilCourseParticipants.php';
30 include_once 'Modules/Course/classes/class.ilCourseWaitingList.php';
31 include_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(),
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 }
static _lookupLogin($a_user_id)
lookup login
__construct($a_course_obj, $a_xml_file='')
Constructor.
const IL_CRS_SUBSCRIPTION_LIMITED
global $DIC
Definition: saml.php:7
static _importContainerSortingSettings($attibs, $obj_id)
sorting import for all container objects
handleMember($a_attribs, $id_data)
attach or detach user/member/admin from course member
static _getInstanceByObjId($a_obj_id)
Get singleton instance.
if(!array_key_exists('StateId', $_REQUEST)) $id
setHandlers($a_xml_parser)
set event handlers
handleAdmin($a_attribs, $id_data)
attach or detach admin from course member
const IL_CRS_TUTOR
const IL_CRS_SUBSCRIPTION_CONFIRMATION
const IL_CAL_UNIX
handleWaitingList($a_attribs, $id_data)
attach or detach members from waitinglist
static _getImportedUserId($i2_id)
handlerBeginTag($a_xml_parser, $a_name, $a_attribs)
handler for begin of element
const IL_CRS_MEMBER
handlerEndTag($a_xml_parser, $a_name)
handler for end of element
const IL_CRS_SUBSCRIPTION_PASSWORD
Class for single dates.
const IL_CRS_SUBSCRIPTION_UNLIMITED
handleTutor($a_attribs, $id_data)
attach or detach admin from course member
const IL_CRS_ADMIN
Base class for course and group participants.
Interface definition for sax subset parsers.
Controller class for sax element handlers.
static _writeImportId($a_obj_id, $a_import_id)
write import id to db (static)
static _writeContainerSetting($a_id, $a_keyword, $a_value)
const IL_CRS_SUBSCRIPTION_DIRECT
static getInstanceByObjId($a_obj_id)
Get singleton instance.
handlerCharacterData($a_xml_parser, $a_data)
handler for character data
handleSubscriber($a_attribs, $id_data)
attach or detach members from subscribers
const IL_CRS_SUBSCRIPTION_DEACTIVATED