1<?php
2/* Copyright (c) 1998-2017 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4/**
5 * Class ilForumSettingsGUI
6 * @author Nadia Matuschek <nmatuschek@databay.de>
7 */
8class ilForumSettingsGUI
9{
10    private $ctrl;
11    private $tpl;
12    private $lng;
13    private $settings;
14    private $tabs;
15    private $access;
16    private $tree;
17    private $parent_obj;
18
19    /**
20     * @var ilPropertyFormGUI
21     */
22    protected $form;
23
24    /**
25     * @var ilPropertyFormGUI
26     */
27    private $notificationSettingsForm;
28
29    /**
30     * ilForumSettingsGUI constructor.
31     * @param $parent_obj
32     */
33    public function __construct(ilObjForumGUI $parent_obj)
34    {
35        global $DIC;
36
37        $this->parent_obj = $parent_obj;
38        $this->ctrl = $DIC->ctrl();
39        $this->tpl = $DIC->ui()->mainTemplate();
40        $this->lng = $DIC->language();
41        $this->settings = $DIC->settings();
42        $this->tabs = $DIC->tabs();
43        $this->access = $DIC->access();
44        $this->tree = $DIC->repositoryTree();
45        $this->obj_service = $DIC->object();
46    }
47
48    /**
49     *
50     */
51    public function executeCommand()
52    {
53        $cmd = $this->ctrl->getCmd();
54        switch (true) {
55            case method_exists($this, $cmd):
56                $this->settingsTabs();
57                $this->{$cmd}();
58                break;
59
60            default:
61                $this->ctrl->redirect($this->parent_obj);
62                break;
63        }
64    }
65
66    /**
67     * @param ilPropertyFormGUI $a_form
68     */
69    public function getCustomForm(&$a_form)
70    {
71        $this->settingsTabs();
72        $this->tabs->activateSubTab("basic_settings");
73        $a_form->setTitle($this->lng->txt('frm_settings_form_header'));
74
75        $presentationHeader = new ilFormSectionHeaderGUI();
76        $presentationHeader->setTitle($this->lng->txt('frm_settings_presentation_header'));
77        $a_form->addItem($presentationHeader);
78
79        $this->obj_service->commonSettings()->legacyForm($a_form, $this->parent_obj->object)->addTileImage();
80
81        $rg_pro = new ilRadioGroupInputGUI($this->lng->txt('frm_default_view'), 'default_view');
82        $rg_pro->addOption(new ilRadioOption($this->lng->txt('sort_by_posts'), ilForumProperties::VIEW_TREE));
83        $rg_sort_by_date = new ilRadioOption($this->lng->txt('sort_by_date'), ilForumProperties::VIEW_DATE);
84        $rg_pro->addOption($rg_sort_by_date);
85        $view_direction_group_gui = new ilRadioGroupInputGUI('', 'default_view_sort_dir');
86        $view_desc = new ilRadioOption($this->lng->txt('descending_order'), ilForumProperties::VIEW_DATE_DESC);
87        $view_asc = new ilRadioOption($this->lng->txt('ascending_order'), ilForumProperties::VIEW_DATE_ASC);
88        $view_direction_group_gui->addOption($view_desc);
89        $view_direction_group_gui->addOption($view_asc);
90        $rg_sort_by_date->addSubItem($view_direction_group_gui);
91        $a_form->addItem($rg_pro);
92
93        $userFunctionsHeader = new \ilFormSectionHeaderGUI();
94        $userFunctionsHeader->setTitle($this->lng->txt('frm_settings_user_functions_header'));
95        $a_form->addItem($userFunctionsHeader);
96
97        $frm_subject = new ilRadioGroupInputGUI($this->lng->txt('frm_subject_setting'), 'subject_setting');
98        $frm_subject->addOption(new ilRadioOption($this->lng->txt('preset_subject'), 'preset_subject'));
99        $frm_subject->addOption(new ilRadioOption($this->lng->txt('add_re_to_subject'), 'add_re_to_subject'));
100        $frm_subject->addOption(new ilRadioOption($this->lng->txt('empty_subject'), 'empty_subject'));
101        $a_form->addItem($frm_subject);
102
103        $cb_prop = new ilCheckboxInputGUI($this->lng->txt('enable_thread_ratings'), 'thread_rating');
104        $cb_prop->setValue(1);
105        $cb_prop->setInfo($this->lng->txt('enable_thread_ratings_info'));
106        $a_form->addItem($cb_prop);
107
108        if (!ilForumProperties::isFileUploadGloballyAllowed()) {
109            $frm_upload = new ilCheckboxInputGUI($this->lng->txt('file_upload_allowed'), 'file_upload_allowed');
110            $frm_upload->setValue(1);
111            $frm_upload->setInfo($this->lng->txt('allow_file_upload_desc'));
112            $a_form->addItem($frm_upload);
113        }
114
115        $moderatorFunctionsHeader = new \ilFormSectionHeaderGUI();
116        $moderatorFunctionsHeader->setTitle($this->lng->txt('frm_settings_mod_functions_header'));
117        $a_form->addItem($moderatorFunctionsHeader);
118
119        $cb_prop = new ilCheckboxInputGUI($this->lng->txt('activate_new_posts'), 'post_activation');
120        $cb_prop->setValue(1);
121        $cb_prop->setInfo($this->lng->txt('post_activation_desc'));
122        $a_form->addItem($cb_prop);
123
124        $cb_prop = new ilCheckboxInputGUI($this->lng->txt('mark_moderator_posts'), 'mark_mod_posts');
125        $cb_prop->setValue(1);
126        $cb_prop->setInfo($this->lng->txt('mark_moderator_posts_desc'));
127        $a_form->addItem($cb_prop);
128
129
130        $stickyThreadSorting = new ilRadioGroupInputGUI($this->lng->txt('sorting_manual_sticky'), 'thread_sorting');
131        $latestAtTop = new ilRadioOption($this->lng->txt('frm_sticky_threads_latest_at_top'), 0);
132        $latestAtTop->setInfo($this->lng->txt('frm_sticky_threads_latest_at_top_info'));
133        $latestAtTop->setValue(0);
134        $stickyThreadSorting->addOption($latestAtTop);
135        $manualSorting = new ilRadioOption($this->lng->txt('frm_sticky_threads_manual_sorting'), 1);
136        $manualSorting->setInfo($this->lng->txt('frm_sticky_threads_manual_sorting_info'));
137        $stickyThreadSorting->addOption($manualSorting);
138        $a_form->addItem($stickyThreadSorting);
139
140        if ($this->settings->get('enable_anonymous_fora') || $this->settings->get('enable_fora_statistics', false)) {
141            $privacyHeader = new \ilFormSectionHeaderGUI();
142            $privacyHeader->setTitle($this->lng->txt('frm_settings_privacy_header'));
143            $a_form->addItem($privacyHeader);
144        }
145
146        if ($this->settings->get('enable_fora_statistics', false)) {
147            $cb_prop = new ilCheckboxInputGUI($this->lng->txt('frm_statistics_enabled'), 'statistics_enabled');
148            $cb_prop->setValue(1);
149            $cb_prop->setInfo($this->lng->txt('frm_statistics_enabled_desc'));
150            $a_form->addItem($cb_prop);
151        }
152
153        if ($this->settings->get('enable_anonymous_fora') || $this->parent_obj->objProperties->isAnonymized()) {
154            $cb_prop = new ilCheckboxInputGUI($this->lng->txt('frm_anonymous_posting'), 'anonymized');
155            $cb_prop->setValue(1);
156            $cb_prop->setInfo($this->lng->txt('frm_anonymous_posting_desc'));
157            $a_form->addItem($cb_prop);
158        }
159    }
160
161    /**
162     * @return bool
163     */
164    public function settingsTabs()
165    {
166        $this->tabs->activateTab('settings');
167        $this->tabs->addSubTabTarget('basic_settings', $this->ctrl->getLinkTarget($this->parent_obj, 'edit'), '', ['ilobjforumgui', 'ilObjForumGUI']);
168
169        if ($this->settings->get('forum_notification') > 0) {
170            // check if there a parent-node is a grp or crs
171            $grp_ref_id = $this->tree->checkForParentType($this->parent_obj->ref_id, 'grp');
172            $crs_ref_id = $this->tree->checkForParentType($this->parent_obj->ref_id, 'crs');
173
174            if ((int) $grp_ref_id > 0 || (int) $crs_ref_id > 0) {
175                #show member-tab for notification if forum-notification is enabled in administration
176                if ($this->access->checkAccess('write', '', $this->parent_obj->ref_id)) {
177                    $mem_active = array('showMembers', 'forums_notification_settings');
178                    (in_array($_GET['cmd'], $mem_active)) ? $force_mem_active = true : $force_mem_active = false;
179
180                    $this->tabs->addSubTabTarget('notifications', $this->ctrl->getLinkTarget($this, 'showMembers'), '', '', '', $force_mem_active);
181                }
182            }
183        }
184
185        $this->lng->loadLanguageModule('cont');
186        $this->tabs->addSubTabTarget('cont_news_settings', $this->ctrl->getLinkTargetByClass('ilcontainernewssettingsgui'), '', 'ilcontainernewssettingsgui');
187
188        return true;
189    }
190
191    /**
192     * @param array $a_values
193     */
194    public function getCustomValues(array &$a_values)
195    {
196        $a_values['default_view'] = $this->parent_obj->objProperties->getDefaultView();
197        $a_values['anonymized'] = $this->parent_obj->objProperties->isAnonymized();
198        $a_values['statistics_enabled'] = $this->parent_obj->objProperties->isStatisticEnabled();
199        $a_values['post_activation'] = $this->parent_obj->objProperties->isPostActivationEnabled();
200        $a_values['subject_setting'] = $this->parent_obj->objProperties->getSubjectSetting();
201        $a_values['mark_mod_posts'] = $this->parent_obj->objProperties->getMarkModeratorPosts();
202        $a_values['thread_sorting'] = $this->parent_obj->objProperties->getThreadSorting();
203        $a_values['thread_rating'] = $this->parent_obj->objProperties->isIsThreadRatingEnabled();
204
205        $default_view = (int) $this->parent_obj->objProperties->getDefaultView() > ilForumProperties::VIEW_TREE
206            ? ilForumProperties::VIEW_DATE
207            : ilForumProperties::VIEW_TREE;
208
209        $default_view_sort_dir = (int) $this->parent_obj->objProperties->getDefaultView() > ilForumProperties::VIEW_DATE_ASC
210            ? ilForumProperties::VIEW_DATE_DESC
211            : ilForumProperties::VIEW_DATE_ASC;
212
213        $a_values['default_view'] = $default_view;
214        $a_values['default_view_sort_dir'] = $default_view_sort_dir;
215        $a_values['file_upload_allowed'] = (bool) $this->parent_obj->objProperties->getFileUploadAllowed();
216    }
217
218    /**
219     * @param ilPropertyFormGUI $a_form
220     */
221    public function updateCustomValues(ilPropertyFormGUI $a_form)
222    {
223        $default_view = (int) $a_form->getInput('default_view') > ilForumProperties::VIEW_TREE
224            ? ilForumProperties::VIEW_DATE
225            : ilForumProperties::VIEW_TREE;
226
227        if ($default_view == ilForumProperties::VIEW_DATE) {
228            (int) $a_form->getInput('default_view_sort_dir') > ilForumProperties::VIEW_DATE_ASC
229                ? $default_view = ilForumProperties::VIEW_DATE_DESC
230                : $default_view = ilForumProperties::VIEW_DATE_ASC;
231        }
232
233        $this->parent_obj->objProperties->setDefaultView($default_view);
234
235        // BUGFIX FOR 11271
236        if (isset($_SESSION['viewmode'])) {
237            $_SESSION['viewmode'] = $default_view;
238        }
239
240        if ($this->settings->get('enable_anonymous_fora') || $this->parent_obj->objProperties->isAnonymized()) {
241            $this->parent_obj->objProperties->setAnonymisation((int) $a_form->getInput('anonymized'));
242        }
243        if ($this->settings->get('enable_fora_statistics', false)) {
244            $this->parent_obj->objProperties->setStatisticsStatus((int) $a_form->getInput('statistics_enabled'));
245        }
246        $this->parent_obj->objProperties->setPostActivation((int) $a_form->getInput('post_activation'));
247        $this->parent_obj->objProperties->setSubjectSetting($a_form->getInput('subject_setting'));
248        $this->parent_obj->objProperties->setMarkModeratorPosts((int) $a_form->getInput('mark_mod_posts'));
249        $this->parent_obj->objProperties->setThreadSorting((int) $a_form->getInput('thread_sorting'));
250        $this->parent_obj->objProperties->setIsThreadRatingEnabled((bool) $a_form->getInput('thread_rating'));
251        if (!ilForumProperties::isFileUploadGloballyAllowed()) {
252            $this->parent_obj->objProperties->setFileUploadAllowed((bool) $a_form->getInput('file_upload_allowed'));
253        }
254        $this->parent_obj->objProperties->update();
255        $this->obj_service->commonSettings()->legacyForm($a_form, $this->parent_obj->object)->saveTileImage();
256    }
257
258    public function showMembers()
259    {
260        if (!$this->access->checkAccess('write', '', $this->parent_obj->ref_id)) {
261            $this->parent_obj->error->raiseError($this->lng->txt('msg_no_perm_read'), $this->parent_obj->error->MESSAGE);
262        }
263
264        $this->tpl->addBlockFile('ADM_CONTENT', 'adm_content', 'tpl.forums_members_list.html', 'Modules/Forum');
265
266        // instantiate the property form
267        if (!$this->initNotificationSettingsForm()) {
268            // if the form was just created set the values fetched from database
269            $this->notificationSettingsForm->setValuesByArray(array(
270                'notification_type' => $this->parent_obj->objProperties->getNotificationType(),
271                'adm_force' => (bool) $this->parent_obj->objProperties->isAdminForceNoti(),
272                'usr_toggle' => (bool) $this->parent_obj->objProperties->isUserToggleNoti()
273            ));
274        }
275
276        // set form html into template
277        $this->tpl->setVariable('NOTIFICATIONS_SETTINGS_FORM', $this->notificationSettingsForm->getHTML());
278
279        $frm_noti = new ilForumNotification($this->parent_obj->object->getRefId());
280        $oParticipants = $this->getParticipants();
281
282        $moderator_ids = ilForum::_getModerators($this->parent_obj->object->getRefId());
283
284        $admin_ids = $oParticipants->getAdmins();
285        $member_ids = $oParticipants->getMembers();
286        $tutor_ids = $oParticipants->getTutors();
287
288        if ($this->parent_obj->objProperties->getNotificationType() == 'default') {
289            // update forum_notification table
290            $forum_noti = new ilForumNotification($this->parent_obj->object->getRefId());
291            $forum_noti->setAdminForce($this->parent_obj->objProperties->isAdminForceNoti());
292            $forum_noti->setUserToggle($this->parent_obj->objProperties->isUserToggleNoti());
293            $forum_noti->setForumId($this->parent_obj->objProperties->getObjId());
294        } elseif ($this->parent_obj->objProperties->getNotificationType() == 'per_user') {
295            $moderators = $this->getUserNotificationTableData($moderator_ids, $frm_noti);
296            $admins = $this->getUserNotificationTableData($admin_ids, $frm_noti);
297            $members = $this->getUserNotificationTableData($member_ids, $frm_noti);
298            $tutors = $this->getUserNotificationTableData($tutor_ids, $frm_noti);
299
300            $this->__showMembersTable($moderators, $admins, $members, $tutors);
301        }
302    }
303
304    protected function getIcon($user_toggle_noti)
305    {
306        $icon = $user_toggle_noti
307            ? "<img src=\"" . ilUtil::getImagePath("icon_ok.svg") . "\" alt=\"" . $this->lng->txt("enabled") . "\" title=\"" . $this->lng->txt("enabled") . "\" border=\"0\" vspace=\"0\"/>"
308            : "<img src=\"" . ilUtil::getImagePath("icon_not_ok.svg") . "\" alt=\"" . $this->lng->txt("disabled") . "\" title=\"" . $this->lng->txt("disabled") . "\" border=\"0\" vspace=\"0\"/>";
309        return $icon;
310    }
311
312    private function getUserNotificationTableData($user_ids, ilForumNotification $frm_noti)
313    {
314        $counter = 0;
315        $users = array();
316        foreach ($user_ids as $user_id) {
317            $frm_noti->setUserId($user_id);
318            $user_toggle_noti = $frm_noti->isUserToggleNotification();
319            $icon_ok = $this->getIcon(!$user_toggle_noti);
320
321            $users[$counter]['user_id'] = ilUtil::formCheckbox(0, 'user_id[]', $user_id);
322            $users[$counter]['login'] = ilObjUser::_lookupLogin($user_id);
323            $name = ilObjUser::_lookupName($user_id);
324            $users[$counter]['firstname'] = $name['firstname'];
325            $users[$counter]['lastname'] = $name['lastname'];
326            $users[$counter]['user_toggle_noti'] = $icon_ok;
327            $counter++;
328        }
329        return $users;
330    }
331
332    private function __showMembersTable(array $moderators, array $admins, array $members, array $tutors)
333    {
334        foreach (array_filter([
335                    'moderators' => $moderators,
336                    'administrator' => $admins,
337                    'tutors' => $tutors,
338                    'members' => $members
339                ]) as $type => $data) {
340            $tbl_mod = new ilTable2GUI($this, 'showMembers');
341            $tbl_mod->setId('tbl_id_mod');
342            $tbl_mod->setFormAction($this->ctrl->getFormAction($this, 'showMembers'));
343            $tbl_mod->setTitle($this->lng->txt(strtolower($type)));
344
345            $tbl_mod->addColumn('', '', '1%', true);
346            $tbl_mod->addColumn($this->lng->txt('login'), '', '10%');
347            $tbl_mod->addColumn($this->lng->txt('firstname'), '', '10%');
348            $tbl_mod->addColumn($this->lng->txt('lastname'), '', '10%');
349            $tbl_mod->addColumn($this->lng->txt('allow_user_toggle_noti'), '', '10%');
350            $tbl_mod->setSelectAllCheckbox('user_id');
351
352            $tbl_mod->setRowTemplate('tpl.forums_members_row.html', 'Modules/Forum');
353            $tbl_mod->setData($data);
354
355            $tbl_mod->addMultiCommand('enableHideUserToggleNoti', $this->lng->txt('enable_hide_user_toggle'));
356            $tbl_mod->addMultiCommand('disableHideUserToggleNoti', $this->lng->txt('disable_hide_user_toggle'));
357
358            $this->tpl->setCurrentBlock(strtolower($type) . '_table');
359            $this->tpl->setVariable(strtoupper($type), $tbl_mod->getHTML());
360        }
361    }
362
363    public function enableAdminForceNoti()
364    {
365        if (!$this->access->checkAccess('write', '', $this->parent_obj->ref_id)) {
366            $this->parent_obj->error->raiseError($this->lng->txt('msg_no_perm_read'), $this->parent_obj->error->MESSAGE);
367        }
368
369        if (!isset($_POST['user_id']) || !is_array($_POST['user_id'])) {
370            ilUtil::sendInfo($this->lng->txt('time_limit_no_users_selected'), true);
371        } else {
372            $frm_noti = new ilForumNotification($this->parent_obj->object->getRefId());
373
374            foreach ($_POST['user_id'] as $user_id) {
375                $frm_noti->setUserId((int) $user_id);
376                $is_enabled = $frm_noti->isAdminForceNotification();
377
378                $frm_noti->setUserToggle(0);
379                if (!$is_enabled) {
380                    $frm_noti->setAdminForce(1);
381                    $frm_noti->insertAdminForce();
382                }
383            }
384
385            ilUtil::sendSuccess($this->lng->txt('saved_successfully'));
386        }
387
388        $this->showMembers();
389    }
390
391    public function disableAdminForceNoti()
392    {
393        if (!$this->access->checkAccess('write', '', $this->parent_obj->ref_id)) {
394            $this->parent_obj->error->raiseError($this->lng->txt('msg_no_perm_read'), $this->parent_obj->error->MESSAGE);
395        }
396
397        if (!isset($_POST['user_id']) || !is_array($_POST['user_id'])) {
398            ilUtil::sendInfo($this->lng->txt('time_limit_no_users_selected'));
399        } else {
400            $frm_noti = new ilForumNotification($this->parent_obj->object->getRefId());
401
402            foreach ($_POST['user_id'] as $user_id) {
403                $frm_noti->setUserId((int) $user_id);
404                $is_enabled = $frm_noti->isAdminForceNotification();
405
406                if ($is_enabled) {
407                    $frm_noti->deleteAdminForce();
408                }
409            }
410
411            ilUtil::sendSuccess($this->lng->txt('saved_successfully'));
412        }
413
414        $this->showMembers();
415    }
416
417    public function enableHideUserToggleNoti()
418    {
419        if (!$this->access->checkAccess('write', '', $this->parent_obj->ref_id)) {
420            $this->parent_obj->error->raiseError($this->lng->txt('msg_no_perm_read'), $this->parent_obj->error->MESSAGE);
421        }
422        if (!isset($_POST['user_id']) || !is_array($_POST['user_id'])) {
423            ilUtil::sendInfo($this->lng->txt('time_limit_no_users_selected'));
424        } else {
425            $frm_noti = new ilForumNotification($this->parent_obj->object->getRefId());
426
427            foreach ($_POST['user_id'] as $user_id) {
428                $frm_noti->setUserId((int) $user_id);
429                $is_enabled = $frm_noti->isAdminForceNotification();
430                $frm_noti->setUserToggle(1);
431
432                if (!$is_enabled) {
433                    $frm_noti->setAdminForce(1);
434                    $frm_noti->insertAdminForce();
435                } else {
436                    $frm_noti->updateUserToggle();
437                }
438            }
439
440            ilUtil::sendSuccess($this->lng->txt('saved_successfully'));
441        }
442
443        $this->showMembers();
444    }
445
446    public function disableHideUserToggleNoti()
447    {
448        if (!$this->access->checkAccess('write', '', $this->parent_obj->ref_id)) {
449            $this->parent_obj->error->raiseError($this->lng->txt('msg_no_perm_read'), $this->parent_obj->error->MESSAGE);
450        }
451
452        if (!isset($_POST['user_id']) || !is_array($_POST['user_id'])) {
453            ilUtil::sendInfo($this->lng->txt('time_limit_no_users_selected'));
454        } else {
455            $frm_noti = new ilForumNotification($this->parent_obj->object->getRefId());
456
457            foreach ($_POST['user_id'] as $user_id) {
458                $frm_noti->setUserId((int) $user_id);
459                $is_enabled = $frm_noti->isAdminForceNotification();
460                $frm_noti->setUserToggle(0);
461                if ($is_enabled) {
462                    $frm_noti->updateUserToggle();
463                } else {
464                    $frm_noti->setAdminForce(1);
465                    $frm_noti->insertAdminForce();
466                }
467            }
468
469            ilUtil::sendSuccess($this->lng->txt('saved_successfully'));
470        }
471
472        $this->showMembers();
473    }
474
475
476
477    /**
478     * @return ilParticipants for course or group
479     */
480    public function getParticipants()
481    {
482        if ($this->parent_obj->isParentObjectCrsOrGrp() == false) {
483            $this->parent_obj->error->raiseError($this->lng->txt('msg_no_perm_read'), $this->parent_obj->error->MESSAGE);
484        }
485
486        /**
487         * @var $oParticipants ilParticipants
488         */
489        $oParticipants = null;
490
491        $grp_ref_id = $this->tree->checkForParentType($this->parent_obj->object->getRefId(), 'grp');
492        $crs_ref_id = $this->tree->checkForParentType($this->parent_obj->object->getRefId(), 'crs');
493        if ($grp_ref_id > 0) {
494            $parent_obj = ilObjectFactory::getInstanceByRefId($grp_ref_id);
495            $oParticipants = ilGroupParticipants::_getInstanceByObjId($parent_obj->getId());
496            return $oParticipants;
497        } elseif ($crs_ref_id > 0) {
498            $parent_obj = ilObjectFactory::getInstanceByRefId($crs_ref_id);
499
500            $oParticipants = ilCourseParticipants::_getInstanceByObjId($parent_obj->getId());
501            return $oParticipants;
502        }
503
504        return $oParticipants;
505    }
506
507
508
509    private function updateUserNotifications($update_all_users = false)
510    {
511        $oParticipants = $this->getParticipants();
512
513        $frm_noti = new ilForumNotification($this->parent_obj->object->getRefId());
514        $moderator_ids = ilForum::_getModerators($this->parent_obj->object->getRefId());
515
516        $admin_ids = $oParticipants->getAdmins();
517        $member_ids = $oParticipants->getMembers();
518        $tutor_ids = $oParticipants->getTutors();
519
520        $all_forum_users = array_merge($moderator_ids, $admin_ids, $member_ids, $tutor_ids);
521        $all_forum_users = array_unique($all_forum_users);
522
523        $all_notis = $frm_noti->read();
524
525        foreach ($all_forum_users as $user_id) {
526            $frm_noti->setUserId($user_id);
527
528            $frm_noti->setAdminForce(1);
529            $frm_noti->setUserToggle($this->parent_obj->objProperties->isUserToggleNoti());
530
531            if (array_key_exists($user_id, $all_notis) && $update_all_users) {
532                $frm_noti->update();
533            } elseif ($frm_noti->existsNotification() == false) {
534                $frm_noti->insertAdminForce();
535            }
536        }
537    }
538
539    private function initNotificationSettingsForm()
540    {
541        if (null === $this->notificationSettingsForm) {
542            $form = new ilPropertyFormGUI();
543            $form->setFormAction($this->ctrl->getFormAction($this, 'updateNotificationSettings'));
544            $form->setTitle($this->lng->txt('forums_notification_settings'));
545
546            $radio_grp = new ilRadioGroupInputGUI('', 'notification_type');
547            $radio_grp->setValue('default');
548
549            $opt_default = new ilRadioOption($this->lng->txt("user_decides_notification"), 'default');
550            $opt_0 = new ilRadioOption($this->lng->txt("settings_for_all_members"), 'all_users');
551            $opt_1 = new ilRadioOption($this->lng->txt("settings_per_users"), 'per_user');
552
553            $radio_grp->addOption($opt_default);
554            $radio_grp->addOption($opt_0);
555            $radio_grp->addOption($opt_1);
556
557            $chb_2 = new ilCheckboxInputGUI($this->lng->txt('user_toggle_noti'), 'usr_toggle');
558            $chb_2->setValue(1);
559
560            $opt_0->addSubItem($chb_2);
561            $form->addItem($radio_grp);
562
563            $form->addCommandButton('updateNotificationSettings', $this->lng->txt('save'));
564
565            $this->notificationSettingsForm = $form;
566
567            return false;
568        }
569
570        return true;
571    }
572
573    public function updateNotificationSettings()
574    {
575        if (!$this->access->checkAccess('write', '', $this->parent_obj->ref_id)) {
576            $this->parent_obj->error->raiseError($this->lng->txt('msg_no_perm_read'), $this->parent_obj->error->MESSAGE);
577        }
578
579        // instantiate the property form
580        $this->initNotificationSettingsForm();
581
582        // check input
583        if ($this->notificationSettingsForm->checkInput()) {
584            if (isset($_POST['notification_type']) && $_POST['notification_type'] == 'all_users') {
585                // set values and call update
586                $this->parent_obj->objProperties->setAdminForceNoti(1);
587                $this->parent_obj->objProperties->setUserToggleNoti((int) $this->notificationSettingsForm->getInput('usr_toggle'));
588                $this->parent_obj->objProperties->setNotificationType('all_users');
589                $this->updateUserNotifications(true);
590            } elseif ($_POST['notification_type'] == 'per_user') {
591                $this->parent_obj->objProperties->setNotificationType('per_user');
592                $this->parent_obj->objProperties->setAdminForceNoti(1);
593                $this->parent_obj->objProperties->setUserToggleNoti(0);
594                $this->updateUserNotifications();
595            } else { //  if($_POST['notification_type'] == 'default')
596                $this->parent_obj->objProperties->setNotificationType('default');
597                $this->parent_obj->objProperties->setAdminForceNoti(0);
598                $this->parent_obj->objProperties->setUserToggleNoti(0);
599                $frm_noti = new ilForumNotification($this->parent_obj->object->getRefId());
600                $frm_noti->deleteNotificationAllUsers();
601            }
602
603            $this->parent_obj->objProperties->update();
604
605            // print success message
606            ilUtil::sendSuccess($this->lng->txt('saved_successfully'));
607        }
608        $this->notificationSettingsForm->setValuesByPost();
609
610        $this->showMembers();
611        return;
612    }
613}
614