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