ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilObjTermsOfServiceGUI.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
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())) {
61  $config = $config->allowEditing();
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 }
This describes commonalities between all forms.
Definition: Form.php:32
const ANONYMOUS_USER_ID
Definition: constants.php:27
New implementation of ilObjectGUI.
const SYSTEM_USER_ID
This file contains constants for PHPStan analyis, see: https://phpstan.org/config-reference#constants...
Definition: constants.php:26
prepareOutput(bool $show_sub_objects=true)
$components
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
readonly ilLegalDocumentsAdministrationGUI $legal_documents
global $DIC
Definition: shib_login.php:26
__construct(int $a_id=0, int $a_id_type=self::REPOSITORY_NODE_ID, int $a_parent_node_id=0)
__construct(Container $dic, ilPlugin $plugin)