1<?php 2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */ 3 4include_once('./Services/Membership/classes/class.ilRegistrationGUI.php'); 5 6/** 7* GUI class for course registrations 8* 9* @author Stefan Meyer <smeyer.ilias@gmx.de> 10* @version $Id$ 11* 12* @ingroup ModulesCourse 13* 14* @ilCtrl_Calls ilCourseRegistrationGUI: 15*/ 16class ilCourseRegistrationGUI extends ilRegistrationGUI 17{ 18 private $parent_gui = null; 19 20 /** 21 * Constructor 22 * 23 * @access public 24 * @param object course object 25 */ 26 public function __construct($a_container, $a_parent_gui) 27 { 28 parent::__construct($a_container); 29 30 $this->parent_gui = $a_parent_gui; 31 } 32 33 /** 34 * Execute command 35 * 36 * @access public 37 */ 38 public function executeCommand() 39 { 40 global $DIC; 41 42 $ilTabs = $DIC['ilTabs']; 43 $ilUser = $DIC['ilUser']; 44 45 if ($this->getWaitingList()->isOnList($ilUser->getId())) { 46 $ilTabs->activateTab('leave'); 47 } 48 49 if (!$GLOBALS['DIC']['ilAccess']->checkAccess('join', '', $this->getRefId())) { 50 $this->ctrl->setReturn($this->parent_gui, 'infoScreen'); 51 $this->ctrl->returnToParent($this); 52 return false; 53 } 54 55 $next_class = $this->ctrl->getNextClass($this); 56 switch ($next_class) { 57 default: 58 $cmd = $this->ctrl->getCmd("show"); 59 $this->$cmd(); 60 break; 61 } 62 return true; 63 } 64 65 /** 66 * get form title 67 * 68 * @access protected 69 * @return string title 70 */ 71 protected function getFormTitle() 72 { 73 global $DIC; 74 75 $ilUser = $DIC['ilUser']; 76 77 if ($this->getWaitingList()->isOnList($ilUser->getId())) { 78 return $this->lng->txt('member_status'); 79 } 80 return $this->lng->txt('crs_registration'); 81 } 82 83 /** 84 * fill informations 85 * 86 * @access protected 87 * @param 88 * @return 89 */ 90 protected function fillInformations() 91 { 92 if ($this->container->getImportantInformation()) { 93 $imp = new ilNonEditableValueGUI($this->lng->txt('crs_important_info'), "", true); 94 $value = nl2br(ilUtil::makeClickable($this->container->getImportantInformation(), true)); 95 $imp->setValue($value); 96 $this->form->addItem($imp); 97 } 98 99 if ($this->container->getSyllabus()) { 100 $syl = new ilNonEditableValueGUI($this->lng->txt('crs_syllabus'), "", true); 101 $value = nl2br(ilUtil::makeClickable($this->container->getSyllabus(), true)); 102 $syl->setValue($value); 103 $this->form->addItem($syl); 104 } 105 } 106 107 /** 108 * show informations about the registration period 109 * 110 * @access protected 111 */ 112 protected function fillRegistrationPeriod() 113 { 114 include_once('./Services/Calendar/classes/class.ilDateTime.php'); 115 $now = new ilDateTime(time(), IL_CAL_UNIX, 'UTC'); 116 117 if ($this->container->getSubscriptionUnlimitedStatus()) { 118 $reg = new ilNonEditableValueGUI($this->lng->txt('mem_reg_period')); 119 $reg->setValue($this->lng->txt('mem_unlimited')); 120 $this->form->addItem($reg); 121 return true; 122 } elseif ($this->container->getSubscriptionLimitationType() == IL_CRS_SUBSCRIPTION_DEACTIVATED) { 123 return true; 124 } 125 126 $start = new ilDateTime($this->container->getSubscriptionStart(), IL_CAL_UNIX, 'UTC'); 127 $end = new ilDateTime($this->container->getSubscriptionEnd(), IL_CAL_UNIX, 'UTC'); 128 129 if (ilDateTime::_before($now, $start)) { 130 $tpl = new ilTemplate('tpl.registration_period_form.html', true, true, 'Services/Membership'); 131 $tpl->setVariable('TXT_FIRST', $this->lng->txt('mem_start')); 132 $tpl->setVariable('FIRST', ilDatePresentation::formatDate($start)); 133 134 $tpl->setVariable('TXT_END', $this->lng->txt('mem_end')); 135 $tpl->setVariable('END', ilDatePresentation::formatDate($end)); 136 137 $warning = $this->lng->txt('mem_reg_not_started'); 138 } elseif (ilDateTime::_after($now, $end)) { 139 $tpl = new ilTemplate('tpl.registration_period_form.html', true, true, 'Services/Membership'); 140 $tpl->setVariable('TXT_FIRST', $this->lng->txt('mem_start')); 141 $tpl->setVariable('FIRST', ilDatePresentation::formatDate($start)); 142 143 $tpl->setVariable('TXT_END', $this->lng->txt('mem_end')); 144 $tpl->setVariable('END', ilDatePresentation::formatDate($end)); 145 146 147 $warning = $this->lng->txt('mem_reg_expired'); 148 } else { 149 $tpl = new ilTemplate('tpl.registration_period_form.html', true, true, 'Services/Membership'); 150 $tpl->setVariable('TXT_FIRST', $this->lng->txt('mem_end')); 151 $tpl->setVariable('FIRST', ilDatePresentation::formatDate($end)); 152 } 153 154 $reg = new ilCustomInputGUI($this->lng->txt('mem_reg_period')); 155 $reg->setHtml($tpl->get()); 156 if (strlen($warning)) { 157 // Disable registration 158 $this->enableRegistration(false); 159 ilUtil::sendFailure($warning); 160 #$reg->setAlert($warning); 161 } 162 $this->form->addItem($reg); 163 return true; 164 } 165 166 167 /** 168 * fill max members 169 * 170 * @access protected 171 * @param 172 * @return 173 */ 174 protected function fillMaxMembers() 175 { 176 global $DIC; 177 178 $ilUser = $DIC['ilUser']; 179 180 if (!$this->container->isSubscriptionMembershipLimited()) { 181 return true; 182 } 183 $tpl = new ilTemplate('tpl.max_members_form.html', true, true, 'Services/Membership'); 184 185 if ($this->container->getSubscriptionMinMembers()) { 186 $tpl->setVariable('TXT_MIN', $this->lng->txt('mem_min_users') . ':'); 187 $tpl->setVariable('NUM_MIN', $this->container->getSubscriptionMinMembers()); 188 } 189 190 if ($this->container->getSubscriptionMaxMembers()) { 191 $tpl->setVariable('TXT_MAX', $this->lng->txt('mem_max_users')); 192 $tpl->setVariable('NUM_MAX', $this->container->getSubscriptionMaxMembers()); 193 194 $tpl->setVariable('TXT_FREE', $this->lng->txt('mem_free_places') . ":"); 195 include_once './Modules/Course/classes/class.ilObjCourseAccess.php'; 196 $reg_info = ilObjCourseAccess::lookupRegistrationInfo($this->getContainer()->getId()); 197 $free = $reg_info['reg_info_free_places']; 198 199 if ($free) { 200 $tpl->setVariable('NUM_FREE', $free); 201 } else { 202 $tpl->setVariable('WARN_FREE', $free); 203 } 204 205 include_once('./Modules/Course/classes/class.ilCourseWaitingList.php'); 206 $waiting_list = new ilCourseWaitingList($this->container->getId()); 207 if ( 208 $this->container->isSubscriptionMembershipLimited() and 209 $this->container->enabledWaitingList() and 210 (!$free or $waiting_list->getCountUsers())) { 211 if ($waiting_list->isOnList($ilUser->getId())) { 212 $tpl->setVariable('TXT_WAIT', $this->lng->txt('mem_waiting_list_position')); 213 $tpl->setVariable('NUM_WAIT', $waiting_list->getPosition($ilUser->getId())); 214 } else { 215 $tpl->setVariable('TXT_WAIT', $this->lng->txt('mem_waiting_list')); 216 if ($free and $waiting_list->getCountUsers()) { 217 $tpl->setVariable('WARN_WAIT', $waiting_list->getCountUsers()); 218 } else { 219 $tpl->setVariable('NUM_WAIT', $waiting_list->getCountUsers()); 220 } 221 } 222 } 223 224 $alert = ''; 225 if ( 226 !$free and 227 !$this->container->enabledWaitingList()) { 228 // Disable registration 229 $this->enableRegistration(false); 230 ilUtil::sendFailure($this->lng->txt('mem_alert_no_places')); 231 #$alert = $this->lng->txt('mem_alert_no_places'); 232 } elseif ( 233 $this->container->enabledWaitingList() and 234 $this->container->isSubscriptionMembershipLimited() and 235 $waiting_list->isOnList($ilUser->getId()) 236 ) { 237 // Disable registration 238 $this->enableRegistration(false); 239 } elseif ( 240 !$free and 241 $this->container->enabledWaitingList() and 242 $this->container->isSubscriptionMembershipLimited()) { 243 ilUtil::sendFailure($this->lng->txt('crs_warn_no_max_set_on_waiting_list')); 244 #$alert = $this->lng->txt('crs_warn_no_max_set_on_waiting_list'); 245 } elseif ( 246 $free and 247 $this->container->enabledWaitingList() and 248 $this->container->isSubscriptionMembershipLimited() and 249 $this->getWaitingList()->getCountUsers()) { 250 ilUtil::sendFailure($this->lng->txt('crs_warn_wl_set_on_waiting_list')); 251 #$alert = $this->lng->txt('crs_warn_wl_set_on_waiting_list'); 252 } 253 } 254 255 $max = new ilCustomInputGUI($this->lng->txt('mem_participants')); 256 $max->setHtml($tpl->get()); 257 if (strlen($alert)) { 258 $max->setAlert($alert); 259 } 260 $this->form->addItem($max); 261 return true; 262 } 263 264 /** 265 * fill registration type 266 * 267 * @access protected 268 * @return 269 */ 270 protected function fillRegistrationType() 271 { 272 global $DIC; 273 274 $ilUser = $DIC['ilUser']; 275 276 if ($this->container->getSubscriptionLimitationType() == IL_CRS_SUBSCRIPTION_DEACTIVATED) { 277 $reg = new ilCustomInputGUI($this->lng->txt('mem_reg_type')); 278 #$reg->setHtml($this->lng->txt('crs_info_reg_deactivated')); 279 $reg->setAlert($this->lng->txt('crs_info_reg_deactivated')); 280 #ilUtil::sendFailure($this->lng->txt('crs_info_reg_deactivated')); 281 #$reg = new ilNonEditableValueGUI($this->lng->txt('mem_reg_type')); 282 #$reg->setValue($this->lng->txt('crs_info_reg_deactivated')); 283 #$reg->setAlert($this->lng->txt('grp_reg_deactivated_alert')); 284 $this->form->addItem($reg); 285 286 // Disable registration 287 $this->enableRegistration(false); 288 return true; 289 } 290 291 switch ($this->container->getSubscriptionType()) { 292 case IL_CRS_SUBSCRIPTION_DIRECT: 293 294 // no "request" info if waiting list is active 295 if ($this->isWaitingListActive()) { 296 return true; 297 } 298 299 $txt = new ilNonEditableValueGUI($this->lng->txt('mem_reg_type')); 300 $txt->setValue($this->lng->txt('crs_info_reg_direct')); 301 302 $this->form->addItem($txt); 303 break; 304 305 case IL_CRS_SUBSCRIPTION_PASSWORD: 306 $txt = new ilNonEditableValueGUI($this->lng->txt('mem_reg_type')); 307 $txt->setValue($this->lng->txt('crs_subscription_options_password')); 308 309 310 $pass = new ilTextInputGUI($this->lng->txt('passwd'), 'grp_passw'); 311 $pass->setInputType('password'); 312 $pass->setSize(12); 313 $pass->setMaxLength(32); 314 #$pass->setRequired(true); 315 $pass->setInfo($this->lng->txt('crs_info_reg_password')); 316 317 $txt->addSubItem($pass); 318 $this->form->addItem($txt); 319 break; 320 321 case IL_CRS_SUBSCRIPTION_CONFIRMATION: 322 323 // no "request" info if waiting list is active 324 if ($this->isWaitingListActive()) { 325 return true; 326 } 327 328 $txt = new ilNonEditableValueGUI($this->lng->txt('mem_reg_type')); 329 $txt->setValue($this->lng->txt('crs_subscription_options_confirmation')); 330 331 $sub = new ilTextAreaInputGUI($this->lng->txt('crs_reg_subject'), 'subject'); 332 $sub->setValue($_POST['subject']); 333 $sub->setInfo($this->lng->txt('crs_info_reg_confirmation')); 334 $sub->setCols(40); 335 $sub->setRows(5); 336 if ($this->participants->isSubscriber($ilUser->getId())) { 337 $sub_data = $this->participants->getSubscriberData($ilUser->getId()); 338 $sub->setValue($sub_data['subject']); 339 $sub->setInfo(''); 340 ilUtil::sendFailure($this->lng->txt('crs_reg_user_already_subscribed')); 341 $this->enableRegistration(false); 342 } 343 $txt->addSubItem($sub); 344 $this->form->addItem($txt); 345 break; 346 347 348 default: 349 return true; 350 } 351 352 return true; 353 } 354 355 /** 356 * Add group specific command buttons 357 * @return 358 */ 359 protected function addCommandButtons() 360 { 361 global $DIC; 362 363 $ilUser = $DIC['ilUser']; 364 365 parent::addCommandButtons(); 366 367 368 switch ($this->container->getSubscriptionType()) { 369 case IL_CRS_SUBSCRIPTION_CONFIRMATION: 370 if ($this->participants->isSubscriber($ilUser->getId())) { 371 $this->form->clearCommandButtons(); 372 $this->form->addCommandButton('updateSubscriptionRequest', $this->lng->txt('crs_update_subscr_request')); 373 $this->form->addCommandButton('cancelSubscriptionRequest', $this->lng->txt('crs_cancel_subscr_request')); 374 } elseif ($this->isRegistrationPossible()) { 375 $this->form->clearCommandButtons(); 376 $this->form->addCommandButton('join', $this->lng->txt('crs_join_request')); 377 $this->form->addCommandButton('cancel', $this->lng->txt('cancel')); 378 } 379 break; 380 } 381 if (!$this->isRegistrationPossible()) { 382 return false; 383 } 384 385 return true; 386 } 387 388 /** 389 * Validate subscription request 390 * 391 * @access protected 392 * @param 393 * @return 394 */ 395 protected function validate() 396 { 397 global $DIC; 398 399 $ilUser = $DIC['ilUser']; 400 401 if ($ilUser->getId() == ANONYMOUS_USER_ID) { 402 $this->join_error = $this->lng->txt('permission_denied'); 403 return false; 404 } 405 406 // Set aggrement to not accepted 407 $this->setAccepted(false); 408 409 if (!$this->isRegistrationPossible()) { 410 $this->join_error = $this->lng->txt('mem_error_preconditions'); 411 return false; 412 } 413 if ($this->container->getSubscriptionType() == IL_CRS_SUBSCRIPTION_PASSWORD) { 414 if (!strlen($pass = ilUtil::stripSlashes($_POST['grp_passw']))) { 415 $this->join_error = $this->lng->txt('crs_password_required'); 416 return false; 417 } 418 if (strcmp($pass, $this->container->getSubscriptionPassword()) !== 0) { 419 $this->join_error = $this->lng->txt('crs_password_not_valid'); 420 return false; 421 } 422 } 423 if (!$this->validateCustomFields()) { 424 $this->join_error = $this->lng->txt('fill_out_all_required_fields'); 425 return false; 426 } 427 if (!$this->validateAgreement()) { 428 $this->join_error = $this->lng->txt('crs_agreement_required'); 429 return false; 430 } 431 432 return true; 433 } 434 435 /** 436 * add user 437 * 438 * @access protected 439 * @param 440 * @return 441 */ 442 protected function add() 443 { 444 global $DIC; 445 446 $ilUser = $DIC['ilUser']; 447 $tree = $DIC['tree']; 448 $ilCtrl = $DIC['ilCtrl']; 449 450 // TODO: language vars 451 452 // set aggreement accepted 453 $this->setAccepted(true); 454 455 include_once('./Modules/Course/classes/class.ilCourseWaitingList.php'); 456 $free = max(0, $this->container->getSubscriptionMaxMembers() - $this->participants->getCountMembers()); 457 $waiting_list = new ilCourseWaitingList($this->container->getId()); 458 if ($this->container->isSubscriptionMembershipLimited() and $this->container->enabledWaitingList() and (!$free or $waiting_list->getCountUsers())) { 459 $waiting_list->addToList($ilUser->getId()); 460 $info = sprintf( 461 $this->lng->txt('crs_added_to_list'), 462 $waiting_list->getPosition($ilUser->getId()) 463 ); 464 ilUtil::sendSuccess($info, true); 465 466 $this->participants->sendNotification($this->participants->NOTIFY_SUBSCRIPTION_REQUEST, $ilUser->getId()); 467 $this->participants->sendNotification($this->participants->NOTIFY_WAITING_LIST, $ilUser->getId()); 468 $ilCtrl->setParameterByClass( 469 "ilrepositorygui", 470 "ref_id", 471 $tree->getParentId($this->container->getRefId()) 472 ); 473 $ilCtrl->redirectByClass("ilrepositorygui", ""); 474 } 475 476 switch ($this->container->getSubscriptionType()) { 477 case IL_CRS_SUBSCRIPTION_CONFIRMATION: 478 $this->participants->addSubscriber($ilUser->getId()); 479 $this->participants->updateSubscriptionTime($ilUser->getId(), time()); 480 $this->participants->updateSubject($ilUser->getId(), ilUtil::stripSlashes($_POST['subject'])); 481 $this->participants->sendNotification($this->participants->NOTIFY_SUBSCRIPTION_REQUEST, $ilUser->getId()); 482 483 ilUtil::sendSuccess($this->lng->txt("application_completed"), true); 484 $ilCtrl->setParameterByClass( 485 "ilrepositorygui", 486 "ref_id", 487 $tree->getParentId($this->container->getRefId()) 488 ); 489 $ilCtrl->redirectByClass("ilrepositorygui", ""); 490 break; 491 492 default: 493 494 if ($this->container->isSubscriptionMembershipLimited() && $this->container->getSubscriptionMaxMembers()) { 495 $success = $GLOBALS['DIC']['rbacadmin']->assignUserLimited( 496 ilParticipants::getDefaultMemberRole($this->container->getRefId()), 497 $ilUser->getId(), 498 $this->container->getSubscriptionMaxMembers(), 499 array(ilParticipants::getDefaultMemberRole($this->container->getRefId())) 500 ); 501 if (!$success) { 502 ilUtil::sendFailure($this->lng->txt('crs_subscription_failed_limit')); 503 $this->show(); 504 return false; 505 } 506 } 507 508 $this->participants->add($ilUser->getId(), IL_CRS_MEMBER); 509 $this->participants->sendNotification($this->participants->NOTIFY_ADMINS, $ilUser->getId()); 510 $this->participants->sendNotification($this->participants->NOTIFY_REGISTERED, $ilUser->getId()); 511 512 include_once './Modules/Forum/classes/class.ilForumNotification.php'; 513 ilForumNotification::checkForumsExistsInsert($this->container->getRefId(), $ilUser->getId()); 514 515 if ($this->container->getType() == "crs") { 516 $this->container->checkLPStatusSync($ilUser->getId()); 517 } 518 519 if (!$_SESSION["pending_goto"]) { 520 ilUtil::sendSuccess($this->lng->txt("crs_subscription_successful"), true); 521 $this->ctrl->returnToParent($this); 522 } else { 523 $tgt = $_SESSION["pending_goto"]; 524 unset($_SESSION["pending_goto"]); 525 ilUtil::redirect($tgt); 526 } 527 break; 528 } 529 } 530 531 532 533 534 /** 535 * Init course participants 536 * 537 * @access protected 538 */ 539 protected function initParticipants() 540 { 541 include_once('./Modules/Course/classes/class.ilCourseParticipants.php'); 542 $this->participants = ilCourseParticipants::_getInstanceByObjId($this->obj_id); 543 } 544 545 546 /** 547 * @see ilRegistrationGUI::initWaitingList() 548 * @access protected 549 */ 550 protected function initWaitingList() 551 { 552 include_once './Modules/Course/classes/class.ilCourseWaitingList.php'; 553 $this->waiting_list = new ilCourseWaitingList($this->container->getId()); 554 } 555 556 /** 557 * @see ilRegistrationGUI::isWaitingListActive() 558 */ 559 protected function isWaitingListActive() 560 { 561 global $DIC; 562 563 $ilUser = $DIC['ilUser']; 564 static $active = null; 565 566 if ($active !== null) { 567 return $active; 568 } 569 if (!$this->container->enabledWaitingList() or !$this->container->isSubscriptionMembershipLimited()) { 570 return $active = false; 571 } 572 if (!$this->container->getSubscriptionMaxMembers()) { 573 return $active = false; 574 } 575 576 $free = max(0, $this->container->getSubscriptionMaxMembers() - $this->participants->getCountMembers()); 577 return $active = (!$free or $this->getWaitingList()->getCountUsers()); 578 } 579} 580