ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilObjTermsOfServiceGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
27use ILIAS\Data\Factory as DataFactory;
29
39{
43 private readonly Config $config;
44 private readonly UI $ui;
45 private readonly Settings $tos_settings;
46
47 public function __construct(int $a_id = 0, int $a_id_type = self::REPOSITORY_NODE_ID, int $a_parent_node_id = 0)
48 {
49 global $DIC;
50
51 $this->dic = $DIC;
52 $this->lng = $DIC->language();
53 $this->error = $DIC['ilErr'];
54
55 parent::__construct($a_id, $a_id_type, $a_parent_node_id);
56
57 $this->lng->loadLanguageModule('tos');
58 $this->lng->loadLanguageModule('meta');
59 $config = new Config($this->dic['legalDocuments']->provide(Consumer::ID));
60 if ($this->rbac_system->checkAccess('write', $this->object->getRefId())) {
62 }
63 $this->config = $config;
64 $this->legal_documents = new ilLegalDocumentsAdministrationGUI(self::class, $this->config, $this->afterDocumentDeletion(...));
65 $this->ui = new UI(Consumer::ID, $this->dic->ui(), $this->dic->language());
66 $this->tos_settings = $this->createSettings();
67 }
68
69 public function getType(): string
70 {
71 return 'tos';
72 }
73
74 public function executeCommand(): void
75 {
76 if (!$this->rbac_system->checkAccess('read', $this->object->getRefId())) {
77 $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE);
78 }
79 $this->prepareOutput();
80 $next_class = $this->ctrl->getNextClass($this) ?? '';
81 $cmd = $this->ctrl->getCmd() ?? '';
82
83 switch (strtolower($next_class)) {
84 case strtolower(ilLegalDocumentsAdministrationGUI::class):
85 switch ($cmd) {
86 case 'documents': $this->documents();
87 // no break.
88 default: $this->ctrl->forwardCommand($this->legal_documents);
89 }
90 return;
91 case strtolower(ilPermissionGUI::class):
92 $this->tabs_gui->activateTab('permissions');
93 $this->ctrl->forwardCommand(new ilPermissionGUI($this));
94 return;
95 default:
96 switch ($cmd) {
97 case 'documents':
98 $this->ctrl->redirectByClass([self::class, ilLegalDocumentsAdministrationGUI::class], 'documents');
99 return;
100 case 'confirmReset': $this->confirmReset();
101 return;
102 case 'resetNow': $this->resetNow();
103 return;
104 case 'documents':
105 $this->ctrl->redirectByClass([self::class, get_class($this->legal_documents)], 'documents');
106 return;
107 default: $this->settings();
108 return;
109 }
110 }
111 }
112
113 public function getAdminTabs(): void
114 {
115 $can_edit_permissions = $this->rbac_system->checkAccess('edit_permission', $this->object->getRefId());
116
117 // Read right is already required by self::executeCommand.
118 $this->legal_documents->tabs([
119 'documents' => fn() => $this->tabs_gui->addTab('settings', $this->lng->txt('settings'), $this->ctrl->getLinkTarget($this, 'settings')),
120 ]);
121
122 if ($can_edit_permissions) {
123 $this->tabs_gui->addTab(
124 'permissions',
125 $this->lng->txt('perm_settings'),
126 $this->ctrl->getLinkTargetByClass([self::class, ilPermissionGUI::class], 'perm')
127 );
128 }
129 }
130
131 public function form(): Form
132 {
133 $read_only = !$this->rbac_system->checkAccess('write', $this->object->getRefId());
134
135 $no_documents = $this->config->legalDocuments()->document()->repository()->countAll() === 0;
136 if ($no_documents) {
137 $this->tpl->setOnScreenMessage('info', $this->lng->txt('tos_no_documents_exist'));
138 }
139
140 $enabled = $this->dic->ui()->factory()->input()->field()->optionalGroup(
141 [
142 'reeval_on_login' => $this->dic->ui()->factory()->input()->field()->checkbox(
143 $this->ui->txt('reevaluate_on_login'),
144 $this->ui->txt('reevaluate_on_login_desc')
145 )
146 ],
147 $this->lng->txt('tos_status_enable'),
148 $this->lng->txt('tos_status_desc')
149 );
150 $enabled = $enabled->withValue($this->tos_settings->enabled()->value() ? ['reeval_on_login' => $this->tos_settings->validateOnLogin()->value()] : null);
151 $enabled = $enabled->withDisabled($read_only);
152
153 $form = $this->dic->ui()->factory()->input()->container()->form()->standard(
154 $this->ctrl->getFormAction($this, 'saveSettings'),
155 ['enabled' => $enabled]
156 );
157
158 if ($read_only) {
159 $form = $form->withSubmitLabel($this->lng->txt('refresh'));
160 return $this->legal_documents->admin()->withFormData($form, function () {
161 $this->ctrl->redirect($this, 'settings');
162 });
163 }
164
165 return $this->legal_documents->admin()->withFormData($form, function (array $data) use ($no_documents): void {
166 if ($no_documents && $data['enabled']) {
167 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('tos_no_documents_exist_cant_save'), true);
168 $this->ctrl->redirect($this, 'settings');
169 }
170 $this->tos_settings->enabled()->update(isset($data['enabled']));
171 $this->tos_settings->validateOnLogin()->update($data['enabled']['reeval_on_login'] ?? false);
172 $this->tpl->setOnScreenMessage('success', $this->lng->txt('msg_obj_modified'), true);
173 $this->ctrl->redirect($this, 'settings');
174 });
175 }
176
177 public function afterDocumentDeletion(): void
178 {
179 if ($this->config->legalDocuments()->document()->repository()->countAll() === 0) {
180 $this->tos_settings->enabled()->update(false);
181 }
182 }
183
184 protected function settings(): void
185 {
186 if (!$this->rbac_system->checkAccess('read', $this->object->getRefId())) {
187 $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE);
188 }
189
190 $this->tabs_gui->activateTab('settings');
191
192 $components = [];
193
194 if ($this->tos_settings->enabled()->value() && $this->config->legalDocuments()->document()->repository()->countAll() === 0) {
195 $components[] = $this->ui->create()->messageBox()->info(
196 $this->ui->txt('no_documents_exist')
197 );
198 }
199
200 $components[] = $this->legal_documents->admin()->externalSettingsMessage($this->tos_settings->deleteUserOnWithdrawal()->value());
201
202 $components[] = $this->form();
203 $this->tpl->setContent($this->dic->ui()->renderer()->render($components));
204 }
205
206 private function documents(): void
207 {
208 $buttons = $this->config->editable() ?
209 [$this->legal_documents->admin()->resetButton($this->dic->ctrl()->getLinkTarget($this, 'confirmReset'))] :
210 [];
211
212 $reset_date = new DateTimeImmutable('@' . $this->dic->settings()->get('tos_last_reset', '0'));
213
214 $this->tpl->setCurrentBlock('mess');
215 $this->legal_documents->admin()->setVariable('MESSAGE', $this->legal_documents->admin()->resetBox($reset_date, $buttons));
216 $this->tpl->parseCurrentBlock('mess');
217 }
218
219 private function confirmReset(): void
220 {
221 $this->legal_documents->admin()->requireEditable();
222 $this->legal_documents->admin()->setContent((new Confirmation($this->dic->language()))->render(
223 $this->dic->ctrl()->getFormAction($this, 'resetNow'),
224 'resetNow',
225 'documents',
226 $this->dic->language()->txt('tos_sure_reset_tos')
227 ));
228 }
229
230 private function resetNow(): void
231 {
232 $this->legal_documents->admin()->requireEditable();
233 $in = $this->dic->database()->in('usr_id', [ANONYMOUS_USER_ID, SYSTEM_USER_ID], true, 'integer');
234 $this->dic->database()->manipulate("UPDATE usr_data SET agree_date = NULL WHERE $in");
235 $this->tos_settings->lastResetDate()->update((new DataFactory())->clock()->system()->now());
236 $this->tpl->setOnScreenMessage('success', $this->lng->txt('msg_obj_modified'), true);
237 $this->dic->ctrl()->redirectByClass([self::class, $this->legal_documents::class], 'documents');
238 }
239
240 private function createSettings(): Settings
241 {
242 $blocks = new Blocks($this->config->legalDocuments()->id(), $this->dic, $this->config->legalDocuments());
243 return new Settings($blocks->selectSettingsFrom($blocks->globalStore()));
244 }
245}
$components
Customizing of pimple-DIC for ILIAS.
Definition: Container.php:36
Builds data types.
Definition: Factory.php:36
error(string $a_errmsg)
Error Handling & global info handling.
getType()
Functions that must be overwritten.
readonly ilLegalDocumentsAdministrationGUI $legal_documents
__construct(int $a_id=0, int $a_id_type=self::REPOSITORY_NODE_ID, int $a_parent_node_id=0)
getAdminTabs()
administration tabs show only permissions and trash folder
New implementation of ilObjectGUI.
prepareOutput(bool $show_sub_objects=true)
const SYSTEM_USER_ID
This file contains constants for PHPStan analyis, see: https://phpstan.org/config-reference#constants...
Definition: constants.php:26
const ANONYMOUS_USER_ID
Definition: constants.php:27
This describes commonalities between all forms.
Definition: Form.php:33
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $DIC
Definition: shib_login.php:26