1<?php
2
3/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
4
5include_once "./Services/Container/classes/class.ilContainerGUI.php";
6include_once('./Modules/Group/classes/class.ilObjGroup.php');
7
8/**
9 * Class ilObjGroupGUI
10 *
11 * @author    Stefan Meyer <smeyer.ilias@gmx.de>
12 * @author    Sascha Hofmann <saschahofmann@gmx.de>
13 *
14 * @version    $Id$
15 *
16 * @ilCtrl_Calls ilObjGroupGUI: ilGroupRegistrationGUI, ilPermissionGUI, ilInfoScreenGUI,, ilLearningProgressGUI
17 * @ilCtrl_Calls ilObjGroupGUI: ilPublicUserProfileGUI, ilObjCourseGroupingGUI, ilObjStyleSheetGUI
18 * @ilCtrl_Calls ilObjGroupGUI: ilCourseContentGUI, ilColumnGUI, ilContainerPageGUI, ilObjectCopyGUI
19 * @ilCtrl_Calls ilObjGroupGUI: ilObjectCustomUserFieldsGUI, ilMemberAgreementGUI, ilExportGUI, ilMemberExportGUI
20 * @ilCtrl_Calls ilObjGroupGUI: ilCommonActionDispatcherGUI, ilObjectServiceSettingsGUI, ilSessionOverviewGUI
21 * @ilCtrl_Calls ilObjGroupGUI: ilGroupMembershipGUI, ilBadgeManagementGUI, ilMailMemberSearchGUI, ilNewsTimelineGUI, ilContainerNewsSettingsGUI
22 * @ilCtrl_Calls ilObjGroupGUI: ilContainerSkillGUI, ilCalendarPresentationGUI
23 * @ilCtrl_Calls ilObjGroupGUI: ilLTIProviderObjectSettingGUI
24 * @ilCtrl_Calls ilObjGroupGUI: ilObjectMetaDataGUI, ilObjectTranslationGUI
25 *
26 *
27 *
28 * @extends ilObjectGUI
29 */
30class ilObjGroupGUI extends ilContainerGUI
31{
32    /**
33    * Constructor
34    * @access	public
35    */
36    public function __construct($a_data, $a_id, $a_call_by_reference, $a_prepare_output = false)
37    {
38        global $DIC;
39
40        $ilSetting = $DIC['ilSetting'];
41
42        $this->type = "grp";
43        parent::__construct($a_data, $a_id, $a_call_by_reference, $a_prepare_output);
44
45        $this->lng->loadLanguageModule('grp');
46        $this->lng->loadLanguageModule('obj');
47
48        $this->setting = $ilSetting;
49    }
50
51    public function executeCommand()
52    {
53        global $DIC;
54
55        $ilUser = $DIC['ilUser'];
56        $rbacsystem = $DIC['rbacsystem'];
57        $ilAccess = $DIC['ilAccess'];
58        $ilNavigationHistory = $DIC['ilNavigationHistory'];
59        $ilErr = $DIC['ilErr'];
60        $ilToolbar = $DIC['ilToolbar'];
61
62        $next_class = $this->ctrl->getNextClass($this);
63        $cmd = $this->ctrl->getCmd();
64        $this->prepareOutput();
65        // show repository tree
66        $this->showRepTree();
67
68        // add entry to navigation history
69        if (!$this->getCreationMode() &&
70            $ilAccess->checkAccess("read", "", $_GET["ref_id"])) {
71            include_once("./Services/Link/classes/class.ilLink.php");
72            $ilNavigationHistory->addItem(
73                $_GET["ref_id"],
74                ilLink::_getLink($_GET["ref_id"], "grp"),
75                "grp"
76            );
77        }
78
79        // if news timeline is landing page, redirect if necessary
80        if ($next_class == "" && $cmd == "" && $this->object->isNewsTimelineLandingPageEffective()
81            && $ilAccess->checkAccess("read", "", $_GET["ref_id"])) {
82            $this->ctrl->redirectbyclass("ilnewstimelinegui");
83        }
84
85        switch ($next_class) {
86            case 'illtiproviderobjectsettinggui':
87                $this->setSubTabs('properties');
88                $this->tabs_gui->activateTab('settings');
89                $this->tabs_gui->activateSubTab('lti_provider');
90                $lti_gui = new ilLTIProviderObjectSettingGUI($this->object->getRefId());
91                $lti_gui->setCustomRolesForSelection($GLOBALS['DIC']->rbac()->review()->getLocalRoles($this->object->getRefId()));
92                $lti_gui->offerLTIRolesForSelection(false);
93                $this->ctrl->forwardCommand($lti_gui);
94                break;
95
96
97            case 'ilgroupmembershipgui':
98
99                $this->tabs_gui->activateTab('members');
100
101                include_once './Modules/Group/classes/class.ilGroupMembershipGUI.php';
102                $mem_gui = new ilGroupMembershipGUI($this, $this->object);
103                $this->ctrl->forwardCommand($mem_gui);
104                break;
105
106
107            case 'ilgroupregistrationgui':
108                $this->ctrl->setReturn($this, '');
109                $this->tabs_gui->setTabActive('join');
110                include_once('./Modules/Group/classes/class.ilGroupRegistrationGUI.php');
111                $registration = new ilGroupRegistrationGUI($this->object);
112                $this->ctrl->forwardCommand($registration);
113                break;
114
115            case 'ilpermissiongui':
116                $this->tabs_gui->setTabActive('perm_settings');
117                include_once("Services/AccessControl/classes/class.ilPermissionGUI.php");
118                $perm_gui = new ilPermissionGUI($this);
119                $ret = &$this->ctrl->forwardCommand($perm_gui);
120                break;
121
122            case "ilinfoscreengui":
123                $ret = &$this->infoScreen();
124                break;
125
126            case "illearningprogressgui":
127                include_once './Services/Tracking/classes/class.ilLearningProgressGUI.php';
128
129                $new_gui = new ilLearningProgressGUI(
130                    ilLearningProgressGUI::LP_CONTEXT_REPOSITORY,
131                    $this->object->getRefId(),
132                    $_GET['user_id'] ? $_GET['user_id'] : $ilUser->getId()
133                );
134                $this->ctrl->forwardCommand($new_gui);
135                $this->tabs_gui->setTabActive('learning_progress');
136                break;
137
138            case 'ilobjcoursegroupinggui':
139                $this->setSubTabs('settings');
140
141                include_once './Modules/Course/classes/class.ilObjCourseGroupingGUI.php';
142                $this->ctrl->setReturn($this, 'edit');
143                $crs_grp_gui = new ilObjCourseGroupingGUI($this->object, (int) $_GET['obj_id']);
144                $this->ctrl->forwardCommand($crs_grp_gui);
145
146                $this->tabs_gui->setTabActive('settings');
147                $this->tabs_gui->setSubTabActive('groupings');
148                break;
149
150            case 'ilcoursecontentgui':
151
152                include_once './Modules/Course/classes/class.ilCourseContentGUI.php';
153                $course_content_obj = new ilCourseContentGUI($this);
154                $this->ctrl->forwardCommand($course_content_obj);
155                break;
156
157            case 'ilpublicuserprofilegui':
158                require_once './Services/User/classes/class.ilPublicUserProfileGUI.php';
159                $this->setSubTabs('members');
160                $this->tabs_gui->setTabActive('group_members');
161                $this->tabs_gui->setSubTabActive('grp_members_gallery');
162                $profile_gui = new ilPublicUserProfileGUI($_GET["user"]);
163                if ($_GET["back_url"] == "") {
164                    $profile_gui->setBackUrl($this->ctrl->getLinkTargetByClass(["ilGroupMembershipGUI", "ilUsersGalleryGUI"], 'view'));
165                }
166                $html = $this->ctrl->forwardCommand($profile_gui);
167                $this->tpl->setVariable("ADM_CONTENT", $html);
168                break;
169
170            case "ilcolumngui":
171                $this->tabs_gui->setTabActive('none');
172                $this->checkPermission("read");
173                include_once("./Services/Style/Content/classes/class.ilObjStyleSheet.php");
174                $this->tpl->setVariable(
175                    "LOCATION_CONTENT_STYLESHEET",
176                    ilObjStyleSheet::getContentStylePath($this->object->getStyleSheetId())
177                );
178                $this->renderObject();
179                break;
180
181            // container page editing
182            case "ilcontainerpagegui":
183                $ret = $this->forwardToPageObject();
184                if ($ret != "") {
185                    $this->tpl->setContent($ret);
186                }
187                break;
188
189            case 'ilobjectcopygui':
190                include_once './Services/Object/classes/class.ilObjectCopyGUI.php';
191                $cp = new ilObjectCopyGUI($this);
192                $cp->setType('grp');
193                $this->ctrl->forwardCommand($cp);
194                break;
195
196            case "ilobjstylesheetgui":
197                $this->forwardToStyleSheet();
198                break;
199
200            case 'ilobjectcustomuserfieldsgui':
201                include_once './Services/Membership/classes/class.ilObjectCustomUserFieldsGUI.php';
202                $cdf_gui = new ilObjectCustomUserFieldsGUI($this->object->getId());
203                $this->setSubTabs('settings');
204                $this->tabs_gui->setTabActive('settings');
205                $this->ctrl->forwardCommand($cdf_gui);
206                break;
207
208            case 'ilmemberagreementgui':
209                include_once('Services/Membership/classes/class.ilMemberAgreementGUI.php');
210                $this->ctrl->setReturn($this, '');
211                $this->tabs_gui->setTabActive('view_content');
212                $agreement = new ilMemberAgreementGUI($this->object->getRefId());
213                $this->ctrl->forwardCommand($agreement);
214                break;
215
216            case 'ilexportgui':
217                $this->tabs_gui->setTabActive('export');
218                include_once './Services/Export/classes/class.ilExportGUI.php';
219                $exp = new ilExportGUI($this);
220                $exp->addFormat('xml');
221                $this->ctrl->forwardCommand($exp);
222                break;
223
224            case "ilcommonactiondispatchergui":
225                include_once("Services/Object/classes/class.ilCommonActionDispatcherGUI.php");
226                $gui = ilCommonActionDispatcherGUI::getInstanceFromAjaxCall();
227                $this->ctrl->forwardCommand($gui);
228                break;
229
230            case 'ilobjectservicesettingsgui':
231                $this->ctrl->setReturn($this, 'edit');
232                $this->setSubTabs("settings");
233                $this->tabs_gui->activateTab('settings');
234                $this->tabs_gui->activateSubTab('tool_settings');
235
236                include_once './Services/Object/classes/class.ilObjectServiceSettingsGUI.php';
237                $service = new ilObjectServiceSettingsGUI(
238                    $this,
239                    $this->object->getId(),
240                    array(
241                            ilObjectServiceSettingsGUI::CALENDAR_VISIBILITY
242                        )
243                );
244                $this->ctrl->forwardCommand($service);
245                break;
246
247            case 'ilmailmembersearchgui':
248                include_once 'Services/Mail/classes/class.ilMail.php';
249                $mail = new ilMail($ilUser->getId());
250
251                if (!($ilAccess->checkAccess('manage_members', '', $this->object->getRefId()) ||
252                    $this->object->getMailToMembersType() == ilObjGroup::MAIL_ALLOWED_ALL) &&
253                    $rbacsystem->checkAccess('internal_mail', $mail->getMailObjectReferenceId())) {
254                    $ilErr->raiseError($this->lng->txt("msg_no_perm_read"), $ilErr->MESSAGE);
255                }
256
257                $this->tabs_gui->setTabActive('members');
258
259                include_once './Services/Contact/classes/class.ilMailMemberSearchGUI.php';
260                include_once './Services/Contact/classes/class.ilMailMemberGroupRoles.php';
261
262                $mail_search = new ilMailMemberSearchGUI($this, $this->object->getRefId(), new ilMailMemberGroupRoles());
263                $mail_search->setObjParticipants(ilCourseParticipants::_getInstanceByObjId($this->object->getId()));
264                $this->ctrl->forwardCommand($mail_search);
265                break;
266
267            case 'ilbadgemanagementgui':
268                $this->tabs_gui->setTabActive('obj_tool_setting_badges');
269                include_once 'Services/Badge/classes/class.ilBadgeManagementGUI.php';
270                $bgui = new ilBadgeManagementGUI($this->object->getRefId(), $this->object->getId(), 'grp');
271                $this->ctrl->forwardCommand($bgui);
272                break;
273
274            case "ilcontainernewssettingsgui":
275                $this->setSubTabs("settings");
276                $this->tabs_gui->setTabActive('settings');
277                include_once("./Services/Container/classes/class.ilContainerNewsSettingsGUI.php");
278                $news_set_gui = new ilContainerNewsSettingsGUI($this);
279                $news_set_gui->setTimeline(true);
280                $news_set_gui->setCronNotifications(true);
281                $news_set_gui->setHideByDate(true);
282                $this->ctrl->forwardCommand($news_set_gui);
283                break;
284
285            case "ilnewstimelinegui":
286                $this->checkPermission("read");
287                $this->tabs_gui->setTabActive('news_timeline');
288                include_once("./Services/News/classes/class.ilNewsTimelineGUI.php");
289                $t = ilNewsTimelineGUI::getInstance($this->object->getRefId(), $this->object->getNewsTimelineAutoENtries());
290                $t->setUserEditAll($ilAccess->checkAccess('write', '', $this->object->getRefId(), 'grp'));
291                $this->showPermanentLink($tpl);
292                $this->ctrl->forwardCommand($t);
293                include_once 'Services/Tracking/classes/class.ilLearningProgress.php';
294                ilLearningProgress::_tracProgress(
295                    $ilUser->getId(),
296                    $this->object->getId(),
297                    $this->object->getRefId(),
298                    'grp'
299                );
300                break;
301
302            case "ilcontainerskillgui":
303                $this->tabs_gui->activateTab('obj_tool_setting_skills');
304                include_once("./Services/Container/Skills/classes/class.ilContainerSkillGUI.php");
305                $gui = new ilContainerSkillGUI($this);
306                $this->ctrl->forwardCommand($gui);
307                break;
308
309            case 'ilcalendarpresentationgui':
310                include_once('./Services/Calendar/classes/class.ilCalendarPresentationGUI.php');
311                $cal = new ilCalendarPresentationGUI($this->object->getRefId());
312                $ret = $this->ctrl->forwardCommand($cal);
313                break;
314
315            case 'ilobjectmetadatagui':
316                if (!$ilAccess->checkAccess('write', '', $this->object->getRefId())) {
317                    $ilErr->raiseError($this->lng->txt('permission_denied'), $ilErr->WARNING);
318                }
319                $this->tabs_gui->activateTab('meta_data');
320                $this->ctrl->forwardCommand(new ilObjectMetaDataGUI($this->object));
321                break;
322
323
324            case 'ilobjecttranslationgui':
325                $this->checkPermissionBool("write");
326                $this->setSubTabs("settings");
327                $this->tabs->activateTab("settings");
328                include_once("./Services/Object/classes/class.ilObjectTranslationGUI.php");
329                $transgui = new ilObjectTranslationGUI($this);
330                $this->ctrl->forwardCommand($transgui);
331                break;
332
333            default:
334
335                // check visible permission
336                if (!$this->getCreationMode() and
337                        !$ilAccess->checkAccess('visible', '', $this->object->getRefId(), 'grp') and
338                        !$ilAccess->checkAccess('read', '', $this->object->getRefId(), 'grp')) {
339                    $ilErr->raiseError($this->lng->txt("msg_no_perm_read"), $ilErr->MESSAGE);
340                }
341
342                // #9401 - see also ilStartupGUI::_checkGoto()
343                if ($cmd == 'infoScreenGoto') {
344                    if ($this->object->isRegistrationEnabled()) {
345                        $cmd = 'join';
346                    } else {
347                        $cmd = 'infoScreen';
348                    }
349                }
350
351                // check read permission
352                if ((!$this->getCreationMode()
353                    && !$rbacsystem->checkAccess('read', $this->object->getRefId()) && $cmd != 'infoScreen')
354                    || $cmd == 'join') {
355                    // no join permission -> redirect to info screen
356                    if (!$rbacsystem->checkAccess('join', $this->object->getRefId())) {
357                        $this->ctrl->redirect($this, "infoScreen");
358                    } else {	// no read -> show registration
359                        include_once('./Modules/Group/classes/class.ilGroupRegistrationGUI.php');
360                        $this->ctrl->redirectByClass("ilGroupRegistrationGUI", "show");
361                    }
362                }
363                if (!$cmd) {
364                    $cmd = 'view';
365                }
366                $cmd .= 'Object';
367                $this->$cmd();
368                break;
369        }
370
371        $this->addHeaderAction();
372    }
373
374    public function viewObject()
375    {
376        global $DIC;
377
378        $tree = $DIC['tree'];
379        $rbacsystem = $DIC['rbacsystem'];
380        $ilUser = $DIC['ilUser'];
381
382        include_once 'Services/Tracking/classes/class.ilLearningProgress.php';
383        ilLearningProgress::_tracProgress(
384            $ilUser->getId(),
385            $this->object->getId(),
386            $this->object->getRefId(),
387            'grp'
388        );
389
390        ilMDUtils::_fillHTMLMetaTags(
391            $this->object->getId(),
392            $this->object->getId(),
393            'grp'
394        );
395
396
397        if (strtolower($_GET["baseClass"]) == "iladministrationgui") {
398            parent::viewObject();
399            return true;
400        }
401
402        if (!$this->checkAgreement()) {
403            include_once('Services/Membership/classes/class.ilMemberAgreementGUI.php');
404            $this->tabs_gui->setTabActive('view_content');
405            $this->ctrl->setReturn($this, 'view');
406            $agreement = new ilMemberAgreementGUI($this->object->getRefId());
407            $this->ctrl->setCmdClass(get_class($agreement));
408            $this->ctrl->forwardCommand($agreement);
409            return true;
410        }
411
412        $this->tabs_gui->setTabActive('view_content');
413        $this->renderObject();
414    }
415
416    /**
417    * Render group
418    */
419    public function renderObject()
420    {
421        global $DIC;
422
423        $ilTabs = $DIC['ilTabs'];
424
425        $ilTabs->activateTab("view_content");
426        $ret = parent::renderObject();
427        return $ret;
428    }
429
430    /**
431     * Modify Item ListGUI for presentation in container
432     * @global type $tree
433     * @param type $a_item_list_gui
434     * @param type $a_item_data
435     * @param type $a_show_path
436     */
437    public function modifyItemGUI($a_item_list_gui, $a_item_data, $a_show_path)
438    {
439        global $DIC;
440
441        $tree = $DIC['tree'];
442
443        // if folder is in a course, modify item list gui according to course requirements
444        if ($course_ref_id = $tree->checkForParentType($this->object->getRefId(), 'crs')) {
445            include_once("./Modules/Course/classes/class.ilObjCourse.php");
446            include_once("./Modules/Course/classes/class.ilObjCourseGUI.php");
447            $course_obj_id = ilObject::_lookupObjId($course_ref_id);
448            ilObjCourseGUI::_modifyItemGUI(
449                $a_item_list_gui,
450                'ilcoursecontentgui',
451                $a_item_data,
452                $a_show_path,
453                ilObjCourse::_lookupAboStatus($course_obj_id),
454                $course_ref_id,
455                $course_obj_id,
456                $this->object->getRefId()
457            );
458        }
459    }
460
461    /**
462     * After object creation
463     * @param \ilObject $new_object
464     */
465    public function afterSave(\ilObject $new_object, $a_redirect = true)
466    {
467        global $DIC;
468
469        $ilUser = $DIC['ilUser'];
470        $ilSetting = $DIC['ilSetting'];
471
472        $new_object->setRegistrationType(GRP_REGISTRATION_DIRECT);
473        $new_object->update();
474
475        // check for parent group or course => SORT_INHERIT
476        $sort_mode = ilContainer::SORT_TITLE;
477        if (
478                $GLOBALS['DIC']['tree']->checkForParentType($new_object->getRefId(), 'crs', true) ||
479                $GLOBALS['DIC']['tree']->checkForParentType($new_object->getRefId(), 'grp', true)
480        ) {
481            $sort_mode = ilContainer::SORT_INHERIT;
482        }
483
484        // Save sorting
485        include_once './Services/Container/classes/class.ilContainerSortingSettings.php';
486        $sort = new ilContainerSortingSettings($new_object->getId());
487        $sort->setSortMode($sort_mode);
488        $sort->update();
489
490
491        // Add user as admin and enable notification
492        include_once './Modules/Group/classes/class.ilGroupParticipants.php';
493        $members_obj = ilGroupParticipants::_getInstanceByObjId($new_object->getId());
494        $members_obj->add($ilUser->getId(), IL_GRP_ADMIN);
495        $members_obj->updateNotification($ilUser->getId(), $ilSetting->get('mail_grp_admin_notification', true));
496        $members_obj->updateContact($ilUser->getId(), true);
497
498        ilUtil::sendSuccess($this->lng->txt("object_added"), true);
499        if ($a_redirect) {
500            $this->ctrl->setParameter($this, "ref_id", $new_object->getRefId());
501            $this->ctrl->redirect($this, 'edit');
502        }
503    }
504
505    /**
506     * Edit object
507     *
508     * @access public
509     * @param ilPropertyFormGUI
510     * @return
511     */
512    public function editObject(ilPropertyFormGUI $a_form = null)
513    {
514        $this->checkPermission("write");
515
516        $this->setSubTabs('settings');
517        $this->tabs_gui->setTabActive('settings');
518        $this->tabs_gui->setSubTabActive('grp_settings');
519
520        if (!$a_form) {
521            $a_form = $this->initForm('edit');
522        }
523
524        $this->tpl->setVariable('ADM_CONTENT', $a_form->getHTML());
525    }
526
527    /**
528     * change group type
529     *
530     * @access public
531     * @param
532     * @return
533     */
534    public function updateGroupTypeObject()
535    {
536        include_once './Services/DidacticTemplate/classes/class.ilDidacticTemplateUtils.php';
537        ilDidacticTemplateUtils::switchTemplate(
538            $this->object->getRefId(),
539            (int) $_REQUEST['grp_type']
540        );
541
542        ilUtil::sendSuccess($this->lng->txt('settings_saved'), true);
543        $this->ctrl->redirect($this, 'edit');
544    }
545
546
547    /**
548     * update group settings
549     * @param bool update group type
550     * @access public
551     */
552    public function updateObject()
553    {
554        $obj_service = $this->getObjectService();
555
556        $this->checkPermission('write');
557
558        $form = $this->initForm();
559        if ($form->checkInput()) {
560            // handle group type settings
561            include_once './Services/DidacticTemplate/classes/class.ilDidacticTemplateObjSettings.php';
562            $old_type = ilDidacticTemplateObjSettings::lookupTemplateId($this->object->getRefId());
563
564            $modified = false;
565            $new_type_info = $form->getInput('didactic_type');
566            if ($new_type_info) {
567                $new_type = explode('_', $form->getInput('didactic_type'));
568                $new_type = $new_type[1];
569
570                $modified = ($new_type != $old_type);
571                ilLoggerFactory::getLogger('grp')->info('Switched group type from ' . $old_type . ' to ' . $new_type);
572            }
573
574            $old_autofill = $this->object->hasWaitingListAutoFill();
575
576            $this->object->setTitle(ilUtil::stripSlashes($form->getInput('title')));
577            $this->object->setDescription(ilUtil::stripSlashes($form->getInput('desc')));
578            $this->object->setGroupType(ilUtil::stripSlashes($form->getInput('grp_type')));
579            $this->object->setRegistrationType(ilUtil::stripSlashes($form->getInput('registration_type')));
580            $this->object->setPassword(ilUtil::stripSlashes($form->getInput('password')));
581            $this->object->enableUnlimitedRegistration((bool) !$form->getInput('reg_limit_time'));
582            $this->object->enableMembershipLimitation((bool) $form->getInput('registration_membership_limited'));
583            $this->object->setMinMembers((int) $form->getInput('registration_min_members'));
584            $this->object->setMaxMembers((int) $form->getInput('registration_max_members'));
585            $this->object->enableRegistrationAccessCode((bool) $form->getInput('reg_code_enabled'));
586            $this->object->setRegistrationAccessCode($form->getInput('reg_code'));
587            $this->object->setViewMode($form->getInput('view_mode'));
588            $this->object->setMailToMembersType((int) $form->getInput('mail_type'));
589            $this->object->setShowMembers((int) $form->getInput('show_members'));
590
591            // group period
592            $period = $form->getItemByPostVar('period');
593            $this->object->setStart($period->getStart());
594            $this->object->setEnd($period->getEnd());
595
596            $reg = $form->getItemByPostVar("reg");
597            if ($reg->getStart() instanceof ilDateTime && $reg->getEnd() instanceof ilDateTime) {
598                $this->object->enableUnlimitedRegistration(false);
599            } else {
600                $this->object->enableUnlimitedRegistration(true);
601            }
602
603            $this->object->setRegistrationStart($reg->getStart());
604            $this->object->setRegistrationEnd($reg->getEnd());
605
606            $cancel_end = $form->getItemByPostVar("cancel_end");
607            $this->object->setCancellationEnd($cancel_end->getDate());
608
609            switch ((int) $_POST['waiting_list']) {
610                case 2:
611                    $this->object->enableWaitingList(true);
612                    $this->object->setWaitingListAutoFill(true);
613                    break;
614
615                case 1:
616                    $this->object->enableWaitingList(true);
617                    $this->object->setWaitingListAutoFill(false);
618                    break;
619
620                default:
621                    $this->object->enableWaitingList(false);
622                    $this->object->setWaitingListAutoFill(false);
623                    break;
624            }
625
626            // title icon visibility
627            $obj_service->commonSettings()->legacyForm($form, $this->object)->saveTitleIconVisibility();
628
629            // top actions visibility
630            $obj_service->commonSettings()->legacyForm($form, $this->object)->saveTopActionsVisibility();
631
632            // custom icon
633            $obj_service->commonSettings()->legacyForm($form, $this->object)->saveIcon();
634
635            // tile image
636            $obj_service->commonSettings()->legacyForm($form, $this->object)->saveTileImage();
637
638            // list presentation
639            $this->saveListPresentation($form);
640
641            // update object settings
642            $this->object->update();
643
644
645            include_once './Services/Object/classes/class.ilObjectServiceSettingsGUI.php';
646            ilObjectServiceSettingsGUI::updateServiceSettingsForm(
647                $this->object->getId(),
648                $form,
649                array(
650                    ilObjectServiceSettingsGUI::CALENDAR_VISIBILITY,
651                    ilObjectServiceSettingsGUI::USE_NEWS,
652                    ilObjectServiceSettingsGUI::CUSTOM_METADATA,
653                    ilObjectServiceSettingsGUI::AUTO_RATING_NEW_OBJECTS,
654                    ilObjectServiceSettingsGUI::TAG_CLOUD,
655                    ilObjectServiceSettingsGUI::BADGES,
656                    ilObjectServiceSettingsGUI::SKILLS,
657                    ilObjectServiceSettingsGUI::ORGU_POSITION_ACCESS
658                )
659            );
660
661            // Save sorting
662            $this->saveSortingSettings($form);
663            // if autofill has been activated trigger process
664            if (
665                !$old_autofill &&
666                $this->object->hasWaitingListAutoFill()) {
667                $this->object->handleAutoFill();
668            }
669
670            // BEGIN ChangeEvents: Record update Object.
671            require_once('Services/Tracking/classes/class.ilChangeEvent.php');
672            global $DIC;
673
674            $ilUser = $DIC['ilUser'];
675            ilChangeEvent::_recordWriteEvent(
676                $this->object->getId(),
677                $ilUser->getId(),
678                'update'
679            );
680            ilChangeEvent::_catchupWriteEvents($this->object->getId(), $ilUser->getId());
681            // END PATCH ChangeEvents: Record update Object.
682            // Update ecs export settings
683            include_once 'Modules/Group/classes/class.ilECSGroupSettings.php';
684            $ecs = new ilECSGroupSettings($this->object);
685            $ecs->handleSettingsUpdate();
686        } else {
687            ilUtil::sendFailure($GLOBALS['DIC']->language()->txt('err_check_input')); // #16975
688
689            $form->setValuesByPost();
690            $this->editObject($form);
691            return true;
692        }
693
694        // group type modified
695        if ($modified) {
696            if ($new_type == 0) {
697                $new_type_txt = $GLOBALS['DIC']['lng']->txt('il_grp_status_open');
698            } else {
699                include_once './Services/DidacticTemplate/classes/class.ilDidacticTemplateSetting.php';
700                $dtpl = new ilDidacticTemplateSetting($new_type);
701                $new_type_txt = $dtpl->getPresentationTitle($GLOBALS['DIC']['lng']->getLangKey());
702            }
703
704
705            include_once './Services/Utilities/classes/class.ilConfirmationGUI.php';
706            ilUtil::sendQuestion($this->lng->txt('grp_warn_grp_type_changed'));
707            $confirm = new ilConfirmationGUI();
708            $confirm->setFormAction($this->ctrl->getFormAction($this));
709            $confirm->addItem(
710                'grp_type',
711                $new_type,
712                $this->lng->txt('grp_info_new_grp_type') . ': ' . $new_type_txt
713            );
714            $confirm->addButton($this->lng->txt('grp_change_type'), 'updateGroupType');
715            $confirm->setCancel($this->lng->txt('cancel'), 'edit');
716
717            $this->tpl->setContent($confirm->getHTML());
718            return true;
719        } else {
720            ilUtil::sendSuccess($this->lng->txt("msg_obj_modified"), true);
721            $this->ctrl->redirect($this, 'edit');
722            return true;
723        }
724    }
725
726    /**
727    * Edit Map Settings
728    */
729    public function editMapSettingsObject()
730    {
731        global $DIC;
732
733        $ilUser = $DIC['ilUser'];
734        $ilCtrl = $DIC['ilCtrl'];
735        $ilUser = $DIC['ilUser'];
736        $ilAccess = $DIC['ilAccess'];
737
738        $this->setSubTabs("settings");
739        $this->tabs_gui->setTabActive('settings');
740        $this->tabs_gui->setSubTabActive('grp_map_settings');
741
742        include_once('./Services/Maps/classes/class.ilMapUtil.php');
743        if (!ilMapUtil::isActivated() ||
744            !$ilAccess->checkAccess("write", "", $this->object->getRefId())) {
745            return;
746        }
747
748        $latitude = $this->object->getLatitude();
749        $longitude = $this->object->getLongitude();
750        $zoom = $this->object->getLocationZoom();
751
752        // Get Default settings, when nothing is set
753        if ($latitude == 0 && $longitude == 0 && $zoom == 0) {
754            $def = ilMapUtil::getDefaultSettings();
755            $latitude = $def["latitude"];
756            $longitude = $def["longitude"];
757            $zoom = $def["zoom"];
758        }
759
760
761        include_once("./Services/Form/classes/class.ilPropertyFormGUI.php");
762        $form = new ilPropertyFormGUI();
763        $form->setFormAction($ilCtrl->getFormAction($this));
764
765        $form->setTitle($this->lng->txt("grp_map_settings"));
766
767        // enable map
768        $public = new ilCheckboxInputGUI(
769            $this->lng->txt("grp_enable_map"),
770            "enable_map"
771        );
772        $public->setValue("1");
773        $public->setChecked($this->object->getEnableGroupMap());
774        $form->addItem($public);
775
776        // map location
777        $loc_prop = new ilLocationInputGUI(
778            $this->lng->txt("grp_map_location"),
779            "location"
780        );
781        $loc_prop->setLatitude($latitude);
782        $loc_prop->setLongitude($longitude);
783        $loc_prop->setZoom($zoom);
784        $form->addItem($loc_prop);
785
786        $form->addCommandButton("saveMapSettings", $this->lng->txt("save"));
787
788        $this->tpl->setVariable("ADM_CONTENT", $form->getHTML());
789    }
790
791    public function saveMapSettingsObject()
792    {
793        global $DIC;
794
795        $ilCtrl = $DIC['ilCtrl'];
796        $ilUser = $DIC['ilUser'];
797
798        $this->object->setLatitude(ilUtil::stripSlashes($_POST["location"]["latitude"]));
799        $this->object->setLongitude(ilUtil::stripSlashes($_POST["location"]["longitude"]));
800        $this->object->setLocationZoom(ilUtil::stripSlashes($_POST["location"]["zoom"]));
801        $this->object->setEnableGroupMap(ilUtil::stripSlashes($_POST["enable_map"]));
802        $this->object->update();
803
804        $ilCtrl->redirect($this, "editMapSettings");
805    }
806
807
808    /**
809     * edit info
810     *
811     * @access public
812     * @return
813     */
814    public function editInfoObject()
815    {
816        global $DIC;
817
818        $ilErr = $DIC['ilErr'];
819        $ilAccess = $DIC['ilAccess'];
820
821        $this->checkPermission('write');
822
823        $this->setSubTabs('settings');
824        $this->tabs_gui->setTabActive('settings');
825        $this->tabs_gui->setSubTabActive('grp_info_settings');
826
827        $form = $this->initInfoEditor();
828        $this->tpl->setContent($form->getHTML());
829    }
830
831    /**
832     * init info editor
833     *
834     * @access protected
835     * @return
836     */
837    protected function initInfoEditor()
838    {
839        include_once("./Services/Form/classes/class.ilPropertyFormGUI.php");
840        $form = new ilPropertyFormGUI();
841        $form->setFormAction($this->ctrl->getFormAction($this, 'updateInfo'));
842        $form->setTitle($this->lng->txt('grp_general_informations'));
843        $form->addCommandButton('updateInfo', $this->lng->txt('save'));
844        $form->addCommandButton('cancel', $this->lng->txt('cancel'));
845
846        $area = new ilTextAreaInputGUI($this->lng->txt('grp_information'), 'important');
847        $area->setInfo($this->lng->txt('grp_information_info'));
848        $area->setValue($this->object->getInformation());
849        $area->setRows(8);
850        $area->setCols(80);
851        $form->addItem($area);
852
853        return $form;
854    }
855
856    /**
857     * update info
858     *
859     * @access public
860     * @return
861     */
862    public function updateInfoObject()
863    {
864        $this->checkPermission('manage_members');
865
866        $this->object->setInformation(ilUtil::stripSlashes($_POST['important']));
867        $this->object->update();
868
869        ilUtil::sendSuccess($this->lng->txt("settings_saved"));
870        $this->editInfoObject();
871        return true;
872    }
873
874    /////////////////////////////////////////////////////////// Member section /////////////////////
875    public function readMemberData($ids, $selected_columns = null)
876    {
877        include_once('./Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
878        $privacy = ilPrivacySettings::_getInstance();
879
880        include_once './Services/Tracking/classes/class.ilObjUserTracking.php';
881        $this->show_tracking =
882            (
883                ilObjUserTracking::_enabledLearningProgress() and
884            ilObjUserTracking::_enabledUserRelatedData()
885            );
886        if ($this->show_tracking) {
887            include_once('./Services/Object/classes/class.ilObjectLP.php');
888            $olp = ilObjectLP::getInstance($this->object->getId());
889            $this->show_tracking = $olp->isActive();
890        }
891
892        if ($this->show_tracking) {
893            include_once 'Services/Tracking/classes/class.ilLPStatusWrapper.php';
894            $completed = ilLPStatusWrapper::_lookupCompletedForObject($this->object->getId());
895            $in_progress = ilLPStatusWrapper::_lookupInProgressForObject($this->object->getId());
896            $failed = ilLPStatusWrapper::_lookupFailedForObject($this->object->getId());
897        }
898
899        if ($privacy->enabledGroupAccessTimes()) {
900            include_once('./Services/Tracking/classes/class.ilLearningProgress.php');
901            $progress = ilLearningProgress::_lookupProgressByObjId($this->object->getId());
902        }
903
904        $do_prtf = (is_array($selected_columns) &&
905            in_array('prtf', $selected_columns) &&
906            is_array($ids));
907        if ($do_prtf) {
908            include_once "Modules/Portfolio/classes/class.ilObjPortfolio.php";
909            $all_prtf = ilObjPortfolio::getAvailablePortfolioLinksForUserIds(
910                $ids,
911                $this->ctrl->getLinkTarget($this, "members")
912            );
913        }
914
915        $profile_data = ilObjUser::_readUsersProfileData($ids);
916        foreach ($ids as $usr_id) {
917            $name = ilObjUser::_lookupName($usr_id);
918            $tmp_data['firstname'] = $name['firstname'];
919            $tmp_data['lastname'] = $name['lastname'];
920            $tmp_data['login'] = ilObjUser::_lookupLogin($usr_id);
921            $tmp_data['notification'] = $this->object->members_obj->isNotificationEnabled($usr_id) ? 1 : 0;
922            $tmp_data['contact'] = $this->object->members_obj->isContact($usr_id) ? 1 : 0;
923            $tmp_data['usr_id'] = $usr_id;
924            $tmp_data['login'] = ilObjUser::_lookupLogin($usr_id);
925
926            foreach ((array) $profile_data[$usr_id] as $field => $value) {
927                $tmp_data[$field] = $value;
928            }
929
930            if ($this->show_tracking) {
931                if (in_array($usr_id, $completed)) {
932                    $tmp_data['progress'] = ilLPStatus::LP_STATUS_COMPLETED;
933                } elseif (in_array($usr_id, $in_progress)) {
934                    $tmp_data['progress'] = ilLPStatus::LP_STATUS_IN_PROGRESS;
935                } elseif (in_array($usr_id, $failed)) {
936                    $tmp_data['progress'] = ilLPStatus::LP_STATUS_FAILED;
937                } else {
938                    $tmp_data['progress'] = ilLPStatus::LP_STATUS_NOT_ATTEMPTED;
939                }
940            }
941
942            if ($privacy->enabledGroupAccessTimes()) {
943                if (isset($progress[$usr_id]['ts']) and $progress[$usr_id]['ts']) {
944                    $tmp_data['access_time'] = ilDatePresentation::formatDate(
945                        $tmp_date = new ilDateTime($progress[$usr_id]['ts'], IL_CAL_UNIX)
946                    );
947                    $tmp_data['access_time_unix'] = $tmp_date->get(IL_CAL_UNIX);
948                } else {
949                    $tmp_data['access_time'] = $this->lng->txt('no_date');
950                    $tmp_data['access_time_unix'] = 0;
951                }
952            }
953
954            if ($do_prtf) {
955                $tmp_data['prtf'] = $all_prtf[$usr_id];
956            }
957
958            $members[$usr_id] = $tmp_data;
959        }
960        return $members ? $members : array();
961    }
962
963    /**
964    * leave Group
965    * @access public
966    */
967    public function leaveObject()
968    {
969        global $DIC;
970
971        $ilUser = $DIC['ilUser'];
972
973        $this->checkPermission('leave');
974
975        $part = ilGroupParticipants::_getInstanceByObjId($this->object->getId());
976        if ($part->isLastAdmin($ilUser->getId())) {
977            ilUtil::sendFailure($this->lng->txt('grp_err_administrator_required'));
978            $this->viewObject();
979            return false;
980        }
981
982        $this->tabs_gui->setTabActive('grp_btn_unsubscribe');
983
984        include_once "Services/Utilities/classes/class.ilConfirmationGUI.php";
985        $cgui = new ilConfirmationGUI();
986        $cgui->setHeaderText($this->lng->txt('grp_dismiss_myself'));
987        $cgui->setFormAction($this->ctrl->getFormAction($this));
988        $cgui->setCancel($this->lng->txt("cancel"), "cancel");
989        $cgui->setConfirm($this->lng->txt("grp_btn_unsubscribe"), "unsubscribe");
990        $this->tpl->setContent($cgui->getHTML());
991    }
992
993    /**
994     * unsubscribe from group
995     *
996     * @access public
997     * @return
998     */
999    public function unsubscribeObject()
1000    {
1001        global $DIC;
1002
1003        $ilUser = $DIC['ilUser'];
1004        $tree = $DIC['tree'];
1005        $ilCtrl = $DIC['ilCtrl'];
1006
1007        $this->checkPermission('leave');
1008
1009        $this->object->members_obj->delete($ilUser->getId());
1010
1011        include_once './Modules/Group/classes/class.ilGroupMembershipMailNotification.php';
1012        $this->object->members_obj->sendNotification(
1013            ilGroupMembershipMailNotification::TYPE_UNSUBSCRIBE_MEMBER,
1014            $ilUser->getId()
1015        );
1016        $this->object->members_obj->sendNotification(
1017            ilGroupMembershipMailNotification::TYPE_NOTIFICATION_UNSUBSCRIBE,
1018            $ilUser->getId()
1019        );
1020
1021        ilUtil::sendSuccess($this->lng->txt('grp_msg_membership_annulled'), true);
1022        $ilCtrl->setParameterByClass(
1023            "ilrepositorygui",
1024            "ref_id",
1025            $tree->getParentId($this->object->getRefId())
1026        );
1027        $ilCtrl->redirectByClass("ilrepositorygui", "");
1028    }
1029
1030    /**
1031     * Add content tab
1032     *
1033     * @param
1034     * @return
1035     */
1036    public function addContentTab()
1037    {
1038        $this->tabs_gui->addTab(
1039            "view_content",
1040            $this->lng->txt("content"),
1041            $this->ctrl->getLinkTarget($this, "view")
1042        );
1043    }
1044
1045
1046    // get tabs
1047    public function getTabs()
1048    {
1049        global $DIC;
1050
1051        $rbacsystem = $DIC['rbacsystem'];
1052        $ilUser = $DIC['ilUser'];
1053        $ilAccess = $DIC['ilAccess'];
1054        $lng = $DIC['lng'];
1055        $ilHelp = $DIC['ilHelp'];
1056
1057        $ilHelp->setScreenIdComponent("grp");
1058
1059        if ($ilAccess->checkAccess('read', '', $this->ref_id)) {
1060            if ($this->object->isNewsTimelineEffective()) {
1061                if (!$this->object->isNewsTimelineLandingPageEffective()) {
1062                    $this->addContentTab();
1063                }
1064                $this->tabs_gui->addTab(
1065                    "news_timeline",
1066                    $lng->txt("cont_news_timeline_tab"),
1067                    $this->ctrl->getLinkTargetByClass("ilnewstimelinegui", "show")
1068                );
1069                if ($this->object->isNewsTimelineLandingPageEffective()) {
1070                    $this->addContentTab();
1071                }
1072            } else {
1073                $this->addContentTab();
1074            }
1075        }
1076        if (
1077            $ilAccess->checkAccess('visible', '', $this->ref_id) ||
1078            $ilAccess->checkAccess('join', '', $this->ref_id) ||
1079            $ilAccess->checkAccess('read', '', $this->ref_id)
1080        ) {
1081            $this->tabs_gui->addTarget(
1082                "info_short",
1083                $this->ctrl->getLinkTargetByClass(
1084                    array("ilobjgroupgui", "ilinfoscreengui"),
1085                    "showSummary"
1086                ),
1087                "infoScreen",
1088                "",
1089                "",
1090                false
1091            );
1092        }
1093
1094
1095        if ($ilAccess->checkAccess('write', '', $this->object->getRefId())) {
1096            $this->tabs_gui->addTarget(
1097                "settings",
1098                $this->ctrl->getLinkTarget($this, "edit"),
1099                array("edit", "editMapSettings"),
1100                get_class($this),
1101                ""
1102            );
1103        }
1104
1105        include_once './Modules/Group/classes/class.ilGroupParticipants.php';
1106        $is_participant = ilGroupParticipants::_isParticipant($this->ref_id, $ilUser->getId());
1107
1108        // Members
1109        include_once './Modules/Group/classes/class.ilGroupMembershipGUI.php';
1110        $membership_gui = new ilGroupMembershipGUI($this, $this->object);
1111        $membership_gui->addMemberTab($this->tabs_gui, $is_participant);
1112
1113
1114        // badges
1115        if ($ilAccess->checkAccess('write', '', $this->ref_id)) {
1116            include_once 'Services/Badge/classes/class.ilBadgeHandler.php';
1117            if (ilBadgeHandler::getInstance()->isObjectActive($this->object->getId())) {
1118                $this->tabs_gui->addTarget(
1119                    "obj_tool_setting_badges",
1120                    $this->ctrl->getLinkTargetByClass("ilbadgemanagementgui", ""),
1121                    "",
1122                    "ilbadgemanagementgui"
1123                );
1124            }
1125        }
1126
1127        // skills
1128        include_once("./Services/Object/classes/class.ilObjectServiceSettingsGUI.php");
1129        if ($ilAccess->checkAccess('read', '', $this->ref_id) && ilContainer::_lookupContainerSetting(
1130            $this->object->getId(),
1131            ilObjectServiceSettingsGUI::SKILLS,
1132            false
1133        )) {
1134            $this->tabs_gui->addTarget(
1135                "obj_tool_setting_skills",
1136                $this->ctrl->getLinkTargetByClass(array("ilcontainerskillgui", "ilcontskillpresentationgui"), ""),
1137                "",
1138                array("ilcontainerskillgui", "ilcontskillpresentationgui", "ilcontskilladmingui")
1139            );
1140        }
1141
1142        // learning progress
1143        include_once './Services/Tracking/classes/class.ilLearningProgressAccess.php';
1144        if (ilLearningProgressAccess::checkAccess($this->object->getRefId(), $is_participant)) {
1145            $this->tabs_gui->addTarget(
1146                'learning_progress',
1147                $this->ctrl->getLinkTargetByClass(array('ilobjgroupgui','illearningprogressgui'), ''),
1148                '',
1149                array('illplistofobjectsgui','illplistofsettingsgui','illearningprogressgui','illplistofprogressgui')
1150            );
1151        }
1152
1153        // meta data
1154        if ($ilAccess->checkAccess('write', '', $this->ref_id)) {
1155            $md_gui = new ilObjectMetaDataGUI($this->object);
1156            $tab_link = $md_gui->getTab();
1157            if ($tab_link !== null) {
1158                $this->tabs_gui->addTab(
1159                    'meta_data',
1160                    $this->lng->txt('meta_data'),
1161                    $tab_link,
1162                    '',
1163                    'ilObjectMetaDataGUI'
1164                );
1165            }
1166        }
1167
1168
1169        if ($ilAccess->checkAccess('write', '', $this->object->getRefId())) {
1170            $this->tabs_gui->addTarget(
1171                'export',
1172                $this->ctrl->getLinkTargetByClass('ilexportgui', ''),
1173                'export',
1174                'ilexportgui'
1175            );
1176        }
1177
1178        // parent tabs (all container: edit_permission, clipboard, trash
1179        parent::getTabs();
1180
1181        if ($ilAccess->checkAccess('join', '', $this->object->getRefId()) and
1182            !$this->object->members_obj->isAssigned($ilUser->getId())) {
1183            include_once './Modules/Group/classes/class.ilGroupWaitingList.php';
1184            if (ilGroupWaitingList::_isOnList($ilUser->getId(), $this->object->getId())) {
1185                $this->tabs_gui->addTab(
1186                    'leave',
1187                    $this->lng->txt('membership_leave'),
1188                    $this->ctrl->getLinkTargetByClass('ilgroupregistrationgui', 'show', '')
1189                );
1190            } else {
1191                $this->tabs_gui->addTarget(
1192                    "join",
1193                    $this->ctrl->getLinkTargetByClass('ilgroupregistrationgui', "show"),
1194                    'show',
1195                    ""
1196                );
1197            }
1198        }
1199        if ($ilAccess->checkAccess('leave', '', $this->object->getRefId()) and
1200            $this->object->members_obj->isMember($ilUser->getId())) {
1201            $this->tabs_gui->addTarget(
1202                "grp_btn_unsubscribe",
1203                $this->ctrl->getLinkTarget($this, "leave"),
1204                '',
1205                ""
1206            );
1207        }
1208    }
1209
1210    /**
1211    * this one is called from the info button in the repository
1212    * not very nice to set cmdClass/Cmd manually, if everything
1213    * works through ilCtrl in the future this may be changed
1214    */
1215    public function infoScreenObject()
1216    {
1217        $this->ctrl->setCmd("showSummary");
1218        $this->ctrl->setCmdClass("ilinfoscreengui");
1219        $this->infoScreen();
1220    }
1221
1222    /**
1223    * show information screen
1224    */
1225    public function infoScreen()
1226    {
1227        global $DIC;
1228
1229        $rbacsystem = $DIC['rbacsystem'];
1230        $ilUser = $DIC['ilUser'];
1231        $ilSetting = $DIC['ilSetting'];
1232
1233        $this->tabs_gui->setTabActive('info_short');
1234
1235        if (!$this->checkPermissionBool('read')) {
1236            $this->checkPermission('visible');
1237        }
1238
1239        ilMDUtils::_fillHTMLMetaTags(
1240            $this->object->getId(),
1241            $this->object->getId(),
1242            'grp'
1243        );
1244
1245        include_once("./Services/InfoScreen/classes/class.ilInfoScreenGUI.php");
1246        $info = new ilInfoScreenGUI($this);
1247
1248        if (strlen($this->object->getInformation())) {
1249            $info->addSection($this->lng->txt('grp_general_informations'));
1250            $info->addProperty($this->lng->txt('grp_information'), nl2br(
1251                ilUtil::makeClickable($this->object->getInformation(), true)
1252            ));
1253        }
1254
1255        $info->enablePrivateNotes();
1256        $info->enableLearningProgress(true);
1257
1258        $record_gui = new ilAdvancedMDRecordGUI(ilAdvancedMDRecordGUI::MODE_INFO, 'grp', $this->object->getId());
1259        $record_gui->setInfoObject($info);
1260        $record_gui->parse();
1261
1262        // meta data
1263        $info->addMetaDataSections($this->object->getId(), 0, $this->object->getType());
1264
1265
1266        // support contacts
1267        $parts = ilParticipants::getInstance($this->object->getRefId());
1268        $contacts = $parts->getContacts();
1269        if (count($contacts) > 0) {
1270            $info->addSection($this->lng->txt("grp_mem_contacts"));
1271            foreach ($contacts as $c) {
1272                $pgui = new ilPublicUserProfileGUI($c);
1273                $pgui->setBackUrl($this->ctrl->getLinkTargetByClass("ilinfoscreengui"));
1274                $pgui->setEmbedded(true);
1275                $info->addProperty("", $pgui->getHTML());
1276            }
1277        }
1278
1279
1280        $info->addSection($this->lng->txt('group_registration'));
1281        $info->showLDAPRoleGroupMappingInfo();
1282
1283        if (!$this->object->isRegistrationEnabled()) {
1284            $info->addProperty(
1285                $this->lng->txt('group_registration_mode'),
1286                $this->lng->txt('grp_reg_deac_info_screen')
1287            );
1288        } else {
1289            switch ($this->object->getRegistrationType()) {
1290                case GRP_REGISTRATION_DIRECT:
1291                    $info->addProperty(
1292                        $this->lng->txt('group_registration_mode'),
1293                        $this->lng->txt('grp_reg_direct_info_screen')
1294                    );
1295                    break;
1296
1297                case GRP_REGISTRATION_REQUEST:
1298                    $info->addProperty(
1299                        $this->lng->txt('group_registration_mode'),
1300                        $this->lng->txt('grp_reg_req_info_screen')
1301                    );
1302                    break;
1303
1304                case GRP_REGISTRATION_PASSWORD:
1305                    $info->addProperty(
1306                        $this->lng->txt('group_registration_mode'),
1307                        $this->lng->txt('grp_reg_passwd_info_screen')
1308                    );
1309                    break;
1310
1311            }
1312            /*
1313            $info->addProperty($this->lng->txt('group_registration_time'),
1314                ilDatePresentation::formatPeriod(
1315                    $this->object->getRegistrationStart(),
1316                    $this->object->getRegistrationEnd()));
1317            */
1318            if ($this->object->isRegistrationUnlimited()) {
1319                $info->addProperty(
1320                    $this->lng->txt('group_registration_time'),
1321                    $this->lng->txt('grp_registration_unlimited')
1322                );
1323            } elseif ($this->object->getRegistrationStart()->getUnixTime() < time()) {
1324                $info->addProperty(
1325                    $this->lng->txt("group_registration_time"),
1326                    $this->lng->txt('cal_until') . ' ' .
1327                                   ilDatePresentation::formatDate($this->object->getRegistrationEnd())
1328                );
1329            } elseif ($this->object->getRegistrationStart()->getUnixTime() >= time()) {
1330                $info->addProperty(
1331                    $this->lng->txt("group_registration_time"),
1332                    $this->lng->txt('cal_from') . ' ' .
1333                                   ilDatePresentation::formatDate($this->object->getRegistrationStart())
1334                );
1335            }
1336            if ($this->object->isMembershipLimited()) {
1337                if ($this->object->getMinMembers()) {
1338                    $info->addProperty(
1339                        $this->lng->txt("mem_min_users"),
1340                        $this->object->getMinMembers()
1341                    );
1342                }
1343                if ($this->object->getMaxMembers()) {
1344                    include_once './Modules/Group/classes/class.ilObjGroupAccess.php';
1345                    $reg_info = ilObjGroupAccess::lookupRegistrationInfo($this->object->getId());
1346
1347                    $info->addProperty(
1348                        $this->lng->txt('mem_free_places'),
1349                        $reg_info['reg_info_free_places']
1350                    );
1351                }
1352            }
1353
1354            if ($this->object->getCancellationEnd()) {
1355                $info->addProperty(
1356                    $this->lng->txt('grp_cancellation_end'),
1357                    ilDatePresentation::formatDate($this->object->getCancellationEnd())
1358                );
1359            }
1360        }
1361
1362        if ($this->object->getStart()) {
1363            $info->addProperty(
1364                $this->lng->txt('grp_period'),
1365                ilDatePresentation::formatPeriod(
1366                    $this->object->getStart(),
1367                    $this->object->getEnd()
1368                )
1369            );
1370        }
1371
1372
1373        // Confirmation
1374        include_once('Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
1375        $privacy = ilPrivacySettings::_getInstance();
1376
1377        include_once('Modules/Course/classes/Export/class.ilCourseDefinedFieldDefinition.php');
1378        if ($privacy->groupConfirmationRequired() or ilCourseDefinedFieldDefinition::_getFields($this->object->getId()) or $privacy->enabledGroupExport()) {
1379            include_once('Services/PrivacySecurity/classes/class.ilExportFieldsInfo.php');
1380
1381            $field_info = ilExportFieldsInfo::_getInstanceByType($this->object->getType());
1382
1383            $this->lng->loadLanguageModule('ps');
1384            $info->addSection($this->lng->txt('grp_user_agreement_info'));
1385            $info->addProperty($this->lng->txt('ps_export_data'), $field_info->exportableFieldsToInfoString());
1386
1387            if ($fields = ilCourseDefinedFieldDefinition::_fieldsToInfoString($this->object->getId())) {
1388                $info->addProperty($this->lng->txt('ps_grp_user_fields'), $fields);
1389            }
1390        }
1391
1392
1393        // forward the command
1394        $this->ctrl->forwardCommand($info);
1395    }
1396
1397    /**
1398     * :TEMP: Save notification setting (from infoscreen)
1399     */
1400    public function saveNotificationObject()
1401    {
1402        include_once "Services/Membership/classes/class.ilMembershipNotifications.php";
1403        $noti = new ilMembershipNotifications($this->ref_id);
1404        if ($noti->canCurrentUserEdit()) {
1405            if ((bool) $_REQUEST["grp_ntf"]) {
1406                $noti->activateUser();
1407            } else {
1408                $noti->deactivateUser();
1409            }
1410        }
1411        ilUtil::sendSuccess($this->lng->txt("settings_saved"), true);
1412        $this->ctrl->redirect($this, "");
1413    }
1414
1415    /**
1416     * Called from goto?
1417     */
1418    protected function membersObject()
1419    {
1420        $GLOBALS['DIC']['ilCtrl']->redirectByClass('ilgroupmembershipgui');
1421    }
1422
1423
1424    /**
1425     * goto target group
1426     */
1427    public static function _goto($a_target, $a_add = "")
1428    {
1429        global $DIC;
1430
1431        $ilAccess = $DIC['ilAccess'];
1432        $ilErr = $DIC['ilErr'];
1433        $lng = $DIC['lng'];
1434        $ilUser = $DIC['ilUser'];
1435
1436        include_once './Services/Membership/classes/class.ilMembershipRegistrationCodeUtils.php';
1437        if (substr($a_add, 0, 5) == 'rcode') {
1438            if ($ilUser->getId() == ANONYMOUS_USER_ID) {
1439                // Redirect to login for anonymous
1440                ilUtil::redirect(
1441                    "login.php?target=" . $_GET["target"] . "&cmd=force_login&lang=" .
1442                    $ilUser->getCurrentLanguage()
1443                );
1444            }
1445
1446            // Redirects to target location after assigning user to group
1447            ilMembershipRegistrationCodeUtils::handleCode(
1448                $a_target,
1449                ilObject::_lookupType(ilObject::_lookupObjId($a_target)),
1450                substr($a_add, 5)
1451            );
1452        }
1453
1454        if ($a_add == "mem" && $ilAccess->checkAccess("manage_members", "", $a_target)) {
1455            ilObjectGUI::_gotoRepositoryNode($a_target, "members");
1456        }
1457
1458        if ($ilAccess->checkAccess("read", "", $a_target)) {
1459            ilObjectGUI::_gotoRepositoryNode($a_target);
1460        } else {
1461            // to do: force flat view
1462            if ($ilAccess->checkAccess("visible", "", $a_target)) {
1463                ilObjectGUI::_gotoRepositoryNode($a_target, "infoScreenGoto");
1464            } else {
1465                if ($ilAccess->checkAccess("read", "", ROOT_FOLDER_ID)) {
1466                    ilUtil::sendFailure(sprintf(
1467                        $lng->txt("msg_no_perm_read_item"),
1468                        ilObject::_lookupTitle(ilObject::_lookupObjId($a_target))
1469                    ), true);
1470                    ilObjectGUI::_gotoRepositoryRoot();
1471                }
1472            }
1473        }
1474        $ilErr->raiseError($lng->txt("msg_no_perm_read"), $ilErr->FATAL);
1475    }
1476
1477
1478    /**
1479     * init create/edit form
1480     *
1481     * @access protected
1482     * @param string edit or create
1483     * @return
1484     */
1485    public function initForm($a_mode = 'edit', $a_omit_form_action = false)
1486    {
1487        global $DIC;
1488
1489        $obj_service = $this->getObjectService();
1490
1491        $tree = $DIC['tree'];
1492
1493        include_once("./Services/Form/classes/class.ilPropertyFormGUI.php");
1494
1495        $form = new ilPropertyFormGUI();
1496
1497        if (!$a_omit_form_action) {
1498            switch ($a_mode) {
1499                case 'edit':
1500                    $form->setFormAction($this->ctrl->getFormAction($this, 'update'));
1501                    break;
1502
1503                default:
1504                    $form->setTableWidth('600px');
1505                    $form->setFormAction($this->ctrl->getFormAction($this, 'save'));
1506                    break;
1507            }
1508        }
1509
1510        // title/description
1511        $this->initFormTitleDescription($form);
1512
1513        $form = $this->initDidacticTemplate($form);
1514
1515        if ($a_mode == 'edit') {
1516            // group period
1517            include_once 'Services/Form/classes/class.ilDateDurationInputGUI.php';
1518            $group_duration = new ilDateDurationInputGUI($this->lng->txt('grp_period'), 'period');
1519            $group_duration->setInfo($this->lng->txt('grp_period_info'));
1520            if ($this->object->getStart()) {
1521                $group_duration->setStart($this->object->getStart());
1522            }
1523            if ($this->object->getEnd()) {
1524                $group_duration->setEnd($this->object->getEnd());
1525            }
1526            $form->addItem($group_duration);
1527
1528            // Group registration ############################################################
1529            $pres = new ilFormSectionHeaderGUI();
1530            $pres->setTitle($this->lng->txt('grp_setting_header_registration'));
1531            $form->addItem($pres);
1532
1533            // Registration type
1534            $reg_type = new ilRadioGroupInputGUI($this->lng->txt('group_registration_mode'), 'registration_type');
1535            $reg_type->setValue($this->object->getRegistrationType());
1536
1537            $opt_dir = new ilRadioOption($this->lng->txt('grp_reg_direct'), GRP_REGISTRATION_DIRECT);#$this->lng->txt('grp_reg_direct_info'));
1538            $reg_type->addOption($opt_dir);
1539
1540            $opt_pass = new ilRadioOption($this->lng->txt('grp_pass_request'), GRP_REGISTRATION_PASSWORD);
1541            $pass = new ilTextInputGUI($this->lng->txt("password"), 'password');
1542            $pass->setRequired(true);
1543            $pass->setInfo($this->lng->txt('grp_reg_password_info'));
1544            $pass->setValue($this->object->getPassword());
1545            $pass->setSize(32);
1546            $pass->setMaxLength(32);
1547            $opt_pass->addSubItem($pass);
1548            $reg_type->addOption($opt_pass);
1549
1550            $opt_req = new ilRadioOption($this->lng->txt('grp_reg_request'), GRP_REGISTRATION_REQUEST, $this->lng->txt('grp_reg_request_info'));
1551            $reg_type->addOption($opt_req);
1552
1553            $opt_deact = new ilRadioOption($this->lng->txt('grp_reg_no_selfreg'), GRP_REGISTRATION_DEACTIVATED, $this->lng->txt('grp_reg_disabled_info'));
1554            $reg_type->addOption($opt_deact);
1555
1556            // Registration codes
1557            $reg_code = new ilCheckboxInputGUI($this->lng->txt('grp_reg_code'), 'reg_code_enabled');
1558            $reg_code->setChecked($this->object->isRegistrationAccessCodeEnabled());
1559            $reg_code->setValue(1);
1560            $reg_code->setInfo($this->lng->txt('grp_reg_code_enabled_info'));
1561            $form->addItem($reg_type);
1562
1563            // Registration codes
1564            if (!$this->object->getRegistrationAccessCode()) {
1565                include_once './Services/Membership/classes/class.ilMembershipRegistrationCodeUtils.php';
1566                $this->object->setRegistrationAccessCode(ilMembershipRegistrationCodeUtils::generateCode());
1567            }
1568            $reg_link = new ilHiddenInputGUI('reg_code');
1569            $reg_link->setValue($this->object->getRegistrationAccessCode());
1570            $form->addItem($reg_link);
1571
1572            $link = new ilCustomInputGUI($this->lng->txt('grp_reg_code_link'));
1573            include_once './Services/Link/classes/class.ilLink.php';
1574            $val = ilLink::_getLink($this->object->getRefId(), $this->object->getType(), array(), '_rcode' . $this->object->getRegistrationAccessCode());
1575            $link->setHTML('<span class="small">' . $val . '</span>');
1576            $reg_code->addSubItem($link);
1577            $form->addItem($reg_code);
1578
1579            // time limit
1580            $this->lng->loadLanguageModule('dateplaner');
1581            include_once './Services/Form/classes/class.ilDateDurationInputGUI.php';
1582            $dur = new ilDateDurationInputGUI($this->lng->txt('grp_reg_limited'), 'reg');
1583            $dur->setShowTime(true);
1584            $dur->setStart($this->object->getRegistrationStart());
1585            $dur->setEnd($this->object->getRegistrationEnd());
1586            $form->addItem($dur);
1587
1588            // cancellation limit
1589            $cancel = new ilDateTimeInputGUI($this->lng->txt('grp_cancellation_end'), 'cancel_end');
1590            $cancel->setInfo($this->lng->txt('grp_cancellation_end_info'));
1591            $cancel->setDate($this->object->getCancellationEnd());
1592            $form->addItem($cancel);
1593
1594            // max member
1595            $lim = new ilCheckboxInputGUI($this->lng->txt('reg_grp_max_members_short'), 'registration_membership_limited');
1596            $lim->setValue(1);
1597            //			$lim->setOptionTitle($this->lng->txt('reg_grp_max_members'));
1598            $lim->setChecked($this->object->isMembershipLimited());
1599
1600            $min = new ilTextInputGUI($this->lng->txt('reg_grp_min_members'), 'registration_min_members');
1601            $min->setSize(3);
1602            $min->setMaxLength(4);
1603            $min->setValue($this->object->getMinMembers() ? $this->object->getMinMembers() : '');
1604            $min->setInfo($this->lng->txt('grp_subscription_min_members_info'));
1605            $lim->addSubItem($min);
1606
1607            $max = new ilTextInputGUI($this->lng->txt('reg_grp_max_members'), 'registration_max_members');
1608            $max->setValue($this->object->getMaxMembers() ? $this->object->getMaxMembers() : '');
1609            //$max->setTitle($this->lng->txt('members'));
1610            $max->setSize(3);
1611            $max->setMaxLength(4);
1612            $max->setInfo($this->lng->txt('grp_reg_max_members_info'));
1613            $lim->addSubItem($max);
1614
1615            /*
1616            $wait = new ilCheckboxInputGUI($this->lng->txt('grp_waiting_list'),'waiting_list');
1617            $wait->setValue(1);
1618            //$wait->setOptionTitle($this->lng->txt('grp_waiting_list'));
1619            $wait->setInfo($this->lng->txt('grp_waiting_list_info'));
1620            $wait->setChecked($this->object->isWaitingListEnabled() ? true : false);
1621            $lim->addSubItem($wait);
1622            $form->addItem($lim);
1623            */
1624
1625            $wait = new ilRadioGroupInputGUI($this->lng->txt('grp_waiting_list'), 'waiting_list');
1626
1627            $option = new ilRadioOption($this->lng->txt('none'), 0);
1628            $wait->addOption($option);
1629
1630            $option = new ilRadioOption($this->lng->txt('grp_waiting_list_no_autofill'), 1);
1631            $option->setInfo($this->lng->txt('grp_waiting_list_info'));
1632            $wait->addOption($option);
1633
1634            $option = new ilRadioOption($this->lng->txt('grp_waiting_list_autofill'), 2);
1635            $option->setInfo($this->lng->txt('grp_waiting_list_autofill_info'));
1636            $wait->addOption($option);
1637
1638            if ($this->object->hasWaitingListAutoFill()) {
1639                $wait->setValue(2);
1640            } elseif ($this->object->isWaitingListEnabled()) {
1641                $wait->setValue(1);
1642            }
1643
1644            $lim->addSubItem($wait);
1645
1646            $form->addItem($lim);
1647
1648
1649            // Group presentation
1650            $parent_membership_ref_id = 0;
1651            $hasParentMembership =
1652                (
1653                    $parent_membership_ref_id = $tree->checkForParentType($this->object->getRefId(), 'crs', true)
1654                );
1655
1656            $pres = new ilFormSectionHeaderGUI();
1657            $pres->setTitle($this->lng->txt('grp_setting_header_presentation'));
1658            $form->addItem($pres);
1659
1660            // title and icon visibility
1661            $form = $obj_service->commonSettings()->legacyForm($form, $this->object)->addTitleIconVisibility();
1662
1663            // top actions visibility
1664            $form = $obj_service->commonSettings()->legacyForm($form, $this->object)->addTopActionsVisibility();
1665
1666            // custom icon
1667            $form = $obj_service->commonSettings()->legacyForm($form, $this->object)->addIcon();
1668
1669            // tile image
1670            $form = $obj_service->commonSettings()->legacyForm($form, $this->object)->addTileImage();
1671
1672            // list presentation
1673            $form = $this->initListPresentationForm($form);
1674
1675
1676            // presentation type
1677            $view_type = new ilRadioGroupInputGUI($this->lng->txt('grp_presentation_type'), 'view_mode');
1678            if ($hasParentMembership) {
1679                $parent_view_mode = ilObjCourseAccess::_lookupViewMode(ilObject::_lookupObjId($parent_membership_ref_id));
1680                $course_view_mode = '';
1681                switch ($parent_view_mode) {
1682                    case ilContainer::VIEW_SESSIONS:
1683                        $course_view_mode = ': ' . $this->lng->txt('cntr_view_sessions');
1684                        break;
1685
1686                    case ilContainer::VIEW_SIMPLE:
1687                        $course_view_mode = ': ' . $this->lng->txt('cntr_view_simple');
1688                        break;
1689
1690                    case ilContainer::VIEW_BY_TYPE:
1691                        $course_view_mode = ': ' . $this->lng->txt('cntr_view_by_type');
1692                        break;
1693                }
1694                if ($course_view_mode) {
1695                    $opt = new ilRadioOption($this->lng->txt('grp_view_inherit') . $course_view_mode, ilContainer::VIEW_INHERIT);
1696                    $opt->setInfo($this->lng->txt('grp_view_inherit_info'));
1697                    $view_type->addOption($opt);
1698                }
1699            }
1700
1701            if ($hasParentMembership && ilObjGroup::lookupViewMode($this->object->getId()) == ilContainer::VIEW_INHERIT) {
1702                $view_type->setValue(ilContainer::VIEW_INHERIT);
1703            } else {
1704                $view_type->setValue(ilObjGroup::lookupViewMode($this->object->getId()));
1705            }
1706
1707            $opt = new ilRadioOption($this->lng->txt('cntr_view_sessions'), ilContainer::VIEW_SESSIONS);
1708            $opt->setInfo($this->lng->txt('cntr_view_info_sessions'));
1709            $view_type->addOption($opt);
1710
1711            $opt = new ilRadioOption($this->lng->txt('cntr_view_simple'), ilContainer::VIEW_SIMPLE);
1712            $opt->setInfo($this->lng->txt('grp_view_info_simple'));
1713            $view_type->addOption($opt);
1714
1715            $opt = new ilRadioOption($this->lng->txt('cntr_view_by_type'), ilContainer::VIEW_BY_TYPE);
1716            $opt->setInfo($this->lng->txt('grp_view_info_by_type'));
1717            $view_type->addOption($opt);
1718            $form->addItem($view_type);
1719
1720
1721            // Sorting
1722            $sorting_settings = array();
1723            if ($hasParentMembership) {
1724                $sorting_settings[] = ilContainer::SORT_INHERIT;
1725            }
1726            $sorting_settings[] = ilContainer::SORT_TITLE;
1727            $sorting_settings[] = ilContainer::SORT_CREATION;
1728            $sorting_settings[] = ilContainer::SORT_MANUAL;
1729            $this->initSortingForm($form, $sorting_settings);
1730
1731            // additional features
1732            $feat = new ilFormSectionHeaderGUI();
1733            $feat->setTitle($this->lng->txt('obj_features'));
1734            $form->addItem($feat);
1735
1736            include_once './Services/Object/classes/class.ilObjectServiceSettingsGUI.php';
1737            ilObjectServiceSettingsGUI::initServiceSettingsForm(
1738                $this->object->getId(),
1739                $form,
1740                array(
1741                        ilObjectServiceSettingsGUI::CALENDAR_VISIBILITY,
1742                        ilObjectServiceSettingsGUI::USE_NEWS,
1743                        ilObjectServiceSettingsGUI::CUSTOM_METADATA,
1744                        ilObjectServiceSettingsGUI::AUTO_RATING_NEW_OBJECTS,
1745                        ilObjectServiceSettingsGUI::TAG_CLOUD,
1746                        ilObjectServiceSettingsGUI::BADGES,
1747                        ilObjectServiceSettingsGUI::SKILLS,
1748                        ilObjectServiceSettingsGUI::ORGU_POSITION_ACCESS
1749                    )
1750            );
1751
1752
1753            $mem = new ilCheckboxInputGUI($this->lng->txt('grp_show_members'), 'show_members');
1754            $mem->setChecked($this->object->getShowMembers());
1755            $mem->setInfo($this->lng->txt('grp_show_members_info'));
1756            $form->addItem($mem);
1757
1758            // Show members type
1759            $mail_type = new ilRadioGroupInputGUI($this->lng->txt('grp_mail_type'), 'mail_type');
1760            $mail_type->setValue($this->object->getMailToMembersType());
1761
1762            $mail_tutors = new ilRadioOption(
1763                $this->lng->txt('grp_mail_tutors_only'),
1764                ilObjGroup::MAIL_ALLOWED_TUTORS,
1765                $this->lng->txt('grp_mail_tutors_only_info')
1766            );
1767            $mail_type->addOption($mail_tutors);
1768
1769            $mail_all = new ilRadioOption(
1770                $this->lng->txt('grp_mail_all'),
1771                ilObjGroup::MAIL_ALLOWED_ALL,
1772                $this->lng->txt('grp_mail_all_info')
1773            );
1774            $mail_type->addOption($mail_all);
1775            $form->addItem($mail_type);
1776        }
1777
1778        switch ($a_mode) {
1779            case 'create':
1780                $form->setTitle($this->lng->txt('grp_new'));
1781                $form->setTitleIcon(ilUtil::getImagePath('icon_grp.svg'));
1782
1783                $form->addCommandButton('save', $this->lng->txt('grp_new'));
1784                $form->addCommandButton('cancel', $this->lng->txt('cancel'));
1785                break;
1786
1787            case 'edit':
1788                $form->setTitle($this->lng->txt('grp_edit'));
1789                $form->setTitleIcon(ilUtil::getImagePath('icon_grp.svg'));
1790
1791                // Edit ecs export settings
1792                include_once 'Modules/Group/classes/class.ilECSGroupSettings.php';
1793                $ecs = new ilECSGroupSettings($this->object);
1794                $ecs->addSettingsToForm($form, 'grp');
1795
1796                $form->addCommandButton('update', $this->lng->txt('save'));
1797                $form->addCommandButton('cancel', $this->lng->txt('cancel'));
1798                break;
1799        }
1800        return $form;
1801    }
1802
1803    /**
1804     * set sub tabs
1805     *
1806     * @access protected
1807     * @param
1808     * @return
1809     */
1810    protected function setSubTabs($a_tab)
1811    {
1812        global $DIC;
1813
1814        $rbacsystem = $DIC['rbacsystem'];
1815        $ilUser = $DIC['ilUser'];
1816        $ilAccess = $DIC['ilAccess'];
1817
1818        switch ($a_tab) {
1819
1820            case 'settings':
1821                $this->tabs_gui->addSubTabTarget(
1822                    "grp_settings",
1823                    $this->ctrl->getLinkTarget($this, 'edit'),
1824                    "edit",
1825                    get_class($this)
1826                );
1827
1828                $this->tabs_gui->addSubTabTarget(
1829                    "grp_info_settings",
1830                    $this->ctrl->getLinkTarget($this, 'editInfo'),
1831                    "editInfo",
1832                    get_class($this)
1833                );
1834
1835                include_once("./Services/Maps/classes/class.ilMapUtil.php");
1836                if (ilMapUtil::isActivated()) {
1837                    $this->tabs_gui->addSubTabTarget(
1838                        "grp_map_settings",
1839                        $this->ctrl->getLinkTarget($this, 'editMapSettings'),
1840                        "editMapSettings",
1841                        get_class($this)
1842                    );
1843                }
1844
1845                $this->tabs_gui->addSubTabTarget(
1846                    'groupings',
1847                    $this->ctrl->getLinkTargetByClass('ilobjcoursegroupinggui', 'listGroupings'),
1848                    'listGroupings',
1849                    get_class($this)
1850                );
1851
1852                include_once('Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
1853                include_once('Modules/Course/classes/Export/class.ilCourseDefinedFieldDefinition.php');
1854                // only show if export permission is granted
1855                if (ilPrivacySettings::_getInstance()->checkExportAccess($this->object->getRefId()) or ilCourseDefinedFieldDefinition::_hasFields($this->object->getId())) {
1856                    $this->tabs_gui->addSubTabTarget(
1857                        'grp_custom_user_fields',
1858                        $this->ctrl->getLinkTargetByClass('ilobjectcustomuserfieldsgui'),
1859                        '',
1860                        'ilobjectcustomuserfieldsgui'
1861                    );
1862                }
1863
1864                // news settings
1865                if ($this->object->getUseNews()) {
1866                    $this->tabs_gui->addSubTab(
1867                        'obj_news_settings',
1868                        $this->lng->txt("cont_news_settings"),
1869                        $this->ctrl->getLinkTargetByClass('ilcontainernewssettingsgui')
1870                    );
1871                }
1872
1873                $lti_settings = new ilLTIProviderObjectSettingGUI($this->object->getRefId());
1874                if ($lti_settings->hasSettingsAccess()) {
1875                    $this->tabs_gui->addSubTabTarget(
1876                        'lti_provider',
1877                        $this->ctrl->getLinkTargetByClass(ilLTIProviderObjectSettingGUI::class)
1878                    );
1879                }
1880
1881                $this->tabs_gui->addSubTabTarget(
1882                    "obj_multilinguality",
1883                    $this->ctrl->getLinkTargetByClass("ilobjecttranslationgui", ""),
1884                    "",
1885                    "ilobjecttranslationgui"
1886                );
1887
1888
1889                break;
1890
1891
1892        }
1893    }
1894
1895    /**
1896     * Check agreement and redirect if it is not accepted
1897     *
1898     * @access private
1899     *
1900     */
1901    private function checkAgreement()
1902    {
1903        global $DIC;
1904
1905        $ilUser = $DIC['ilUser'];
1906        $ilAccess = $DIC['ilAccess'];
1907
1908        if ($ilAccess->checkAccess('write', '', $this->object->getRefId())) {
1909            return true;
1910        }
1911
1912        // Disable aggrement if is not member of group
1913        if (!$this->object->members_obj->isAssigned($ilUser->getId())) {
1914            return true;
1915        }
1916
1917        include_once './Services/Container/classes/class.ilMemberViewSettings.php';
1918        if (ilMemberViewSettings::getInstance()->isActive()) {
1919            return true;
1920        }
1921
1922        include_once('Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
1923        include_once('Services/Membership/classes/class.ilMemberAgreement.php');
1924        $privacy = ilPrivacySettings::_getInstance();
1925
1926        // Check agreement
1927        if (($privacy->groupConfirmationRequired() or ilCourseDefinedFieldDefinition::_hasFields($this->object->getId()))
1928            and !ilMemberAgreement::_hasAccepted($ilUser->getId(), $this->object->getId())) {
1929            return false;
1930        }
1931        // Check required fields
1932        include_once('Modules/Course/classes/Export/class.ilCourseUserData.php');
1933        if (!ilCourseUserData::_checkRequired($ilUser->getId(), $this->object->getId())) {
1934            return false;
1935        }
1936        return true;
1937    }
1938
1939
1940    /**
1941     * Handle member view
1942     * @return
1943     */
1944    public function prepareOutput($a_show_subobjects = true)
1945    {
1946        global $DIC;
1947
1948        $rbacsystem = $DIC['rbacsystem'];
1949        if (!$this->getCreationMode()) {
1950            /*
1951            include_once './Services/Container/classes/class.ilMemberViewSettings.php';
1952            $settings = ilMemberViewSettings::getInstance();
1953            if($settings->isActive() and $settings->getContainer() != $this->object->getRefId())
1954            {
1955                $settings->setContainer($this->object->getRefId());
1956                $rbacsystem->initMemberView();
1957            }
1958            */
1959        }
1960        parent::prepareOutput($a_show_subobjects);
1961    }
1962
1963    /**
1964     * Create a course mail signature
1965     * @return string
1966     */
1967    public function createMailSignature()
1968    {
1969        $link = chr(13) . chr(10) . chr(13) . chr(10);
1970        $link .= $this->lng->txt('grp_mail_permanent_link');
1971        $link .= chr(13) . chr(10) . chr(13) . chr(10);
1972        include_once 'Services/Link/classes/class.ilLink.php';
1973        $link .= ilLink::_getLink($this->object->getRefId());
1974        return rawurlencode(base64_encode($link));
1975    }
1976
1977    protected function initHeaderAction($a_sub_type = null, $a_sub_id = null)
1978    {
1979        global $DIC;
1980
1981        $ilSetting = $DIC['ilSetting'];
1982        $ilUser = $DIC['ilUser'];
1983
1984        $lg = parent::initHeaderAction($a_sub_type, $a_sub_id);
1985
1986        include_once('./Modules/Group/classes/class.ilGroupParticipants.php');
1987        if (ilGroupParticipants::_isParticipant($this->ref_id, $ilUser->getId())) {
1988            include_once "Services/Membership/classes/class.ilMembershipNotifications.php";
1989            if (ilMembershipNotifications::isActive()) {
1990                $noti = new ilMembershipNotifications($this->ref_id);
1991                if (!$noti->isCurrentUserActive()) {
1992                    $lg->addHeaderIcon(
1993                        "not_icon",
1994                        ilUtil::getImagePath("notification_off.svg"),
1995                        $this->lng->txt("grp_notification_deactivated")
1996                    );
1997
1998                    $this->ctrl->setParameter($this, "grp_ntf", 1);
1999                    $caption = "grp_activate_notification";
2000                } else {
2001                    $lg->addHeaderIcon(
2002                        "not_icon",
2003                        ilUtil::getImagePath("notification_on.svg"),
2004                        $this->lng->txt("grp_notification_activated")
2005                    );
2006
2007                    $this->ctrl->setParameter($this, "grp_ntf", 0);
2008                    $caption = "grp_deactivate_notification";
2009                }
2010
2011                if ($noti->canCurrentUserEdit()) {
2012                    $lg->addCustomCommand(
2013                        $this->ctrl->getLinkTarget($this, "saveNotification"),
2014                        $caption
2015                    );
2016                }
2017
2018                $this->ctrl->setParameter($this, "grp_ntf", "");
2019            }
2020        }
2021
2022        return $lg;
2023    }
2024
2025
2026    /**
2027     *
2028     * @param array $a_data
2029     */
2030    public function addCustomData($a_data)
2031    {
2032        // object defined fields
2033        include_once('Modules/Course/classes/Export/class.ilCourseUserData.php');
2034        $odfs = ilCourseUserData::_getValuesByObjId($this->object->getId());
2035
2036        $res_data = array();
2037        foreach ($a_data as $usr_id => $user_data) {
2038            $res_data[$usr_id] = $user_data;
2039
2040            // udf
2041            include_once './Services/User/classes/class.ilUserDefinedData.php';
2042            $udf_data = new ilUserDefinedData($usr_id);
2043            foreach ($udf_data->getAll() as $field => $value) {
2044                list($f, $field_id) = explode('_', $field);
2045                $res_data[$usr_id]['udf_' . $field_id] = (string) $value;
2046            }
2047
2048            foreach ((array) $odfs[$usr_id] as $cdf_field => $cdf_value) {
2049                $res_data[$usr_id]['cdf_' . $cdf_field] = (string) $cdf_value;
2050            }
2051        }
2052
2053        return $res_data;
2054    }
2055
2056    /**
2057     * returns all local roles [role_id] => title
2058     * @return array
2059     */
2060    public function getLocalRoles()
2061    {
2062        $local_roles = $this->object->getLocalGroupRoles(false);
2063        $grp_member = $this->object->getDefaultMemberRole();
2064        $grp_roles = array();
2065
2066        //put the group member role to the top of the crs_roles array
2067        if (in_array($grp_member, $local_roles)) {
2068            $grp_roles[$grp_member] = ilObjRole::_getTranslation(array_search($grp_member, $local_roles));
2069            unset($local_roles[$grp_roles[$grp_member]]);
2070        }
2071
2072        foreach ($local_roles as $title => $role_id) {
2073            $grp_roles[$role_id] = ilObjRole::_getTranslation($title);
2074        }
2075        return $grp_roles;
2076    }
2077
2078    /**
2079     *
2080     */
2081    protected function jump2UsersGalleryObject()
2082    {
2083        $this->ctrl->redirectByClass('ilUsersGalleryGUI');
2084    }
2085
2086    /**
2087     * Set return point for side column actions
2088     */
2089    public function setSideColumnReturn()
2090    {
2091        $this->ctrl->setReturn($this, "view");
2092    }
2093} // END class.ilObjGroupGUI
2094