ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
class.ilCustomUserFieldsGUI.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
23 
30 {
33  private ilLanguage $lng;
37 
38  private int $ref_id = 0;
39  private bool $confirm_change = false;
40  private int $field_id = 0;
44  private array $field_definition = [];
46 
47  public function __construct(
48  int $ref_id,
49  int $requested_field_id
50  ) {
51  global $DIC;
52  $this->main_tpl = $DIC->ui()->mainTemplate();
53  $this->ctrl = $DIC['ilCtrl'];
54  $this->lng = $DIC['lng'];
55  $this->ui_factory = $DIC['ui.factory'];
56  $this->toolbar = $DIC['ilToolbar'];
57 
58  $this->lng->loadLanguageModule('user');
59  $this->lng->loadLanguageModule('administration');
60 
61  $this->ref_id = $ref_id;
62 
63  $this->field_id = $requested_field_id;
64  $this->ctrl->saveParameter($this, 'field_id', $this->field_id);
65 
66  if ($this->field_id) {
67  $user_field_definitions = ilUserDefinedFields::_getInstance();
68  $this->field_definition = $user_field_definitions->getDefinition($this->field_id);
69  }
70 
71  $this->permissions = ilUDFPermissionHelper::getInstance(
72  $DIC->user()->getId(),
73  $ref_id
74  );
75  $this->request = new UserGUIRequest(
76  $DIC->http(),
77  $DIC->refinery()
78  );
79  }
80 
82  {
83  return $this->permissions;
84  }
85 
86  public function executeCommand(): void
87  {
88  $next_class = $this->ctrl->getNextClass($this);
89  $cmd = $this->ctrl->getCmd();
90 
91  switch ($next_class) {
92  default:
93  if (!$cmd) {
94  $cmd = 'listUserDefinedFields';
95  }
96  $this->$cmd();
97  break;
98  }
99  }
100 
101  public function listUserDefinedFields(): void
102  {
103  if ($this->getPermissions()->hasPermission(
105  (string) $this->ref_id,
107  )) {
108  $this->toolbar->addComponent(
109  $this->ui_factory->link()->standard(
110  $this->lng->txt('add_user_defined_field'),
111  $this->ctrl->getLinkTarget($this, 'addField')
112  )
113  );
114  }
115 
116  $tab = new ilCustomUserFieldSettingsTableGUI($this, 'listUserDefinedFields', $this->getPermissions());
117  if ($this->confirm_change) {
118  $tab->setConfirmChange();
119  }
120  $this->main_tpl->setContent($tab->getHTML());
121  }
122 
123  public function addField(ilPropertyFormGUI $a_form = null): void
124  {
125  if (!$a_form) {
126  $a_form = $this->initForm('create');
127  }
128 
129  $this->main_tpl->setContent($a_form->getHTML());
130  }
131 
136  public function getAccessOptions(): array
137  {
138  $opts = [];
139  $opts['visible'] = $this->lng->txt('user_visible_in_profile');
140  $opts['visib_reg'] = $this->lng->txt('visible_registration');
141  $opts['visib_lua'] = $this->lng->txt('usr_settings_visib_lua');
142  $opts['course_export'] = $this->lng->txt('course_export');
143  $opts['group_export'] = $this->lng->txt('group_export');
144  $opts["prg_export"] = $this->lng->txt("prg_export");
145  $opts['changeable'] = $this->lng->txt('changeable');
146  $opts['changeable_lua'] = $this->lng->txt('usr_settings_changeable_lua');
147  $opts['required'] = $this->lng->txt('required_field');
148  $opts['export'] = $this->lng->txt('export');
149  $opts['searchable'] = $this->lng->txt('header_searchable');
150  $opts['certificate'] = $this->lng->txt('certificate');
151  return $opts;
152  }
153 
157  public static function getAccessPermissions(): array
158  {
159  return [
172  ];
173  }
174 
175  protected function initFieldDefinition(): array // Missing array type.
176  {
178  $this->lng->loadLanguageModule('ps');
179  $this->main_tpl->setOnScreenMessage('info', $this->lng->txt('ps_warning_modify'));
180  }
181 
182  $perms = [];
183  if ($this->field_definition) {
184  $perms = $this->permissions->hasPermissions(
186  (string) $this->field_definition['field_id'],
187  [
188  [
191  ],
192  [
195  ],
196  [
199  ],
200  [
203  ],
204  [
207  ],
208  [
211  ],
212  [
215  ],
216  [
219  ],
220  [
223  ],
224  [
227  ],
228  [
231  ],
232  [
235  ],
236  [
239  ],
240  [
243  ]
244  ]
245  );
246  }
247  return $perms;
248  }
249 
250  protected function initForm(string $a_mode = 'create'): ilPropertyFormGUI
251  {
252  $perms = [];
253  $se_mu = null;
254  $perm_map = [];
255  $udf_type = null;
256 
258  $this->lng->loadLanguageModule('ps');
259  $this->main_tpl->setOnScreenMessage('info', $this->lng->txt('ps_warning_modify'));
260  }
261 
262  if ($this->field_definition) {
263  $perms = $this->initFieldDefinition();
264  $perm_map = self::getAccessPermissions();
265  }
266 
267  $form = new ilPropertyFormGUI();
268  $form->setFormAction($this->ctrl->getFormAction($this));
269 
270  $name = new ilTextInputGUI($this->lng->txt('field_name'), 'name');
271  $name->setRequired(true);
272  $form->addItem($name);
273 
275  $name->setDisabled(true);
276  }
277 
278  // type
279  $radg = new ilRadioGroupInputGUI($this->lng->txt('field_type'), 'field_type');
280  $radg->setRequired(true);
281  foreach (ilCustomUserFieldsHelper::getInstance()->getUDFTypes() as $udf_type => $udf_name) {
282  $op = new ilRadioOption($udf_name, (string) $udf_type);
283  $radg->addOption($op);
284 
285  switch ($udf_type) {
286  case UDF_TYPE_TEXT:
287  case UDF_TYPE_WYSIWYG:
288  // do nothing
289  break;
290  case UDF_TYPE_SELECT:
291  // select values
292  $se_mu = new ilTextWizardInputGUI($this->lng->txt('value'), 'selvalue');
293  $se_mu->setRequired(true);
294  $se_mu->setSize(32);
295  $se_mu->setMaxLength(128);
296  $se_mu->setValues(['']);
297  $op->addSubItem($se_mu);
298  break;
299 
300  default:
301  $plugin = ilCustomUserFieldsHelper::getInstance()->getPluginForType($udf_type);
302  if ($plugin instanceof ilUDFDefinitionPlugin) {
303  $plugin->addDefinitionTypeOptionsToRadioOption($op, $this->field_id);
304  }
305  break;
306  }
307  }
308 
309  $form->addItem($radg);
310 
312  $se_mu->setDisabled(true);
313  $se_mu->setRequired(false);
314  }
315 
316 
317  // access
318  $acc = new ilCheckboxGroupInputGUI($this->lng->txt('access'), 'access');
319 
320  $acc_values = [];
321  foreach ($this->getAccessOptions() as $id => $caption) {
322  $opt = new ilCheckboxOption($caption, $id);
323  $acc->addOption($opt);
324 
325  if ($this->field_definition && $this->field_definition[$id]) {
326  $acc_values[] = $id;
327  }
328 
329  if ($perms && !$perms[ilUDFPermissionHelper::ACTION_FIELD_EDIT_ACCESS][$perm_map[$id]]) {
330  $opt->setDisabled(true);
331  }
332  }
333 
334  $form->addItem($acc);
335 
336 
337  if ($a_mode == 'create') {
338  $radg->setValue((string) UDF_TYPE_TEXT);
339  $form->setTitle($this->lng->txt('add_new_user_defined_field'));
340  $form->addCommandButton('create', $this->lng->txt('save'));
341  } else {
342  $name->setValue($this->field_definition['field_name']);
343  $radg->setValue((string) $this->field_definition['field_type']);
344  $radg->setDisabled(true);
345  $acc->setValue($acc_values);
346 
347  switch ($this->field_definition['field_type']) {
348  case UDF_TYPE_SELECT:
349  $values = $this->field_definition['field_values'];
350  if (!is_array($values) || $values === []) {
351  $values = [''];
352  }
353  $se_mu->setValue($values);
354  $form->setTitle($this->lng->txt('udf_update_select_field'));
355  break;
356 
357  case UDF_TYPE_TEXT:
358  $form->setTitle($this->lng->txt('udf_update_text_field'));
359  break;
360 
361  case UDF_TYPE_WYSIWYG:
362  $form->setTitle($this->lng->txt('udf_update_wysiwyg_field'));
363  break;
364 
365  default:
366  $plugin = ilCustomUserFieldsHelper::getInstance()->getPluginForType($udf_type);
367  if ($plugin instanceof ilUDFDefinitionPlugin) {
368  $form->setTitle($plugin->getDefinitionUpdateFormTitle());
369  }
370  break;
371  }
372  $form->addCommandButton('update', $this->lng->txt('save'));
373  }
374  $form->addCommandButton('listUserDefinedFields', $this->lng->txt('cancel'));
375  return $form;
376  }
377 
378  protected function validateForm(
379  ilPropertyFormGUI $form,
380  ilUserDefinedFields $user_field_definitions,
381  array &$access,
382  array $a_field_permissions = null
383  ): bool {
384  $perm_map = [];
385 
386  if ($form->checkInput()) {
387  $valid = true;
388 
389  $incoming = (array) $form->getInput('access');
390 
391  if ($a_field_permissions) {
392  $perm_map = self::getAccessPermissions();
393  }
394 
395  $access = [];
396  foreach (array_keys($this->getAccessOptions()) as $id) {
397  $access[$id] = in_array($id, $incoming);
398 
399  // disabled fields
400  if ($a_field_permissions && !$a_field_permissions[ilUDFPermissionHelper::ACTION_FIELD_EDIT_ACCESS][$perm_map[$id]]) {
401  $access[$id] = $this->field_definition[$id];
402  }
403  }
404 
405  if ($access['required'] && !$access['visib_reg']) {
406  $this->confirm_change = true;
407  $form->getItemByPostVar('access')->setAlert($this->lng->txt('udf_required_requires_visib_reg'));
408  $valid = false;
409  }
410 
411  if (!$this->field_id && $user_field_definitions->nameExists($form->getInput('name'))) {
412  $form->getItemByPostVar('name')->setAlert($this->lng->txt('udf_name_already_exists'));
413  $valid = false;
414  }
415 
416  if ($form->getInput('field_type') == UDF_TYPE_SELECT &&
418  $user_field_definitions->setFieldValues($form->getInput('selvalue'));
419  if ($error = $user_field_definitions->validateValues()) {
420  switch ($error) {
422  $form->getItemByPostVar('selvalue')->setAlert($this->lng->txt('udf_duplicate_entries'));
423  $valid = false;
424  break;
425  }
426  }
427  }
428 
429  if (!$valid) {
430  $this->main_tpl->setOnScreenMessage('failure', $this->lng->txt('form_input_not_valid'));
431  }
432  return $valid;
433  }
434 
435  return false;
436  }
437 
438  public function create(): void
439  {
440  $user_field_definitions = ilUserDefinedFields::_getInstance();
441  $user_field_definitions->setFieldType(
442  $this->request->getFieldType()
443  );
444 
445  $access = [];
446  $form = $this->initForm('create');
447  if ($this->validateForm($form, $user_field_definitions, $access)) {
448  $user_field_definitions->setFieldName($form->getInput('name'));
449  $user_field_definitions->enableVisible($access['visible']);
450  $user_field_definitions->enableVisibleRegistration((bool) $access['visib_reg']);
451  $user_field_definitions->enableVisibleLocalUserAdministration($access['visib_lua']);
452  $user_field_definitions->enableCourseExport($access['course_export']);
453  $user_field_definitions->enableGroupExport($access['group_export']);
454  $user_field_definitions->enablePrgExport($access['prg_export']);
455  $user_field_definitions->enableChangeable($access['changeable']);
456  $user_field_definitions->enableChangeableLocalUserAdministration($access['changeable_lua']);
457  $user_field_definitions->enableRequired($access['required']);
458  $user_field_definitions->enableExport($access['export']);
459  $user_field_definitions->enableSearchable($access['searchable']);
460  $user_field_definitions->enableCertificate($access['certificate']);
461  $new_id = $user_field_definitions->add();
462 
463  if ($user_field_definitions->isPluginType()) {
464  $plugin = ilCustomUserFieldsHelper::getInstance()->getPluginForType($user_field_definitions->getFieldType());
465  if ($plugin instanceof ilUDFDefinitionPlugin) {
466  $plugin->updateDefinitionFromForm($form, $new_id);
467  }
468  }
469  if ($access['course_export']) {
471  }
472 
473  $this->main_tpl->setOnScreenMessage('success', $this->lng->txt('udf_added_field'), true);
474  $this->ctrl->redirect($this);
475  }
476 
477  $form->setValuesByPost();
478  $this->addField($form);
479  }
480 
481  public function edit(ilPropertyFormGUI $a_form = null): void
482  {
483  if (!$a_form) {
484  $a_form = $this->initForm('edit');
485  }
486 
487  $this->main_tpl->setContent($a_form->getHTML());
488  }
489 
490  public function update(): void
491  {
492  $perms = [];
493 
494  $user_field_definitions = ilUserDefinedFields::_getInstance();
495  $user_field_definitions->setFieldType($this->field_definition['field_type']);
496 
497  // gather old select options
498  $old_options = null;
499  if ($this->field_id) {
500  $old_values = $user_field_definitions->getDefinition($this->field_id);
501  if ($old_values['field_type'] == UDF_TYPE_SELECT) {
502  $old_options = $old_values['field_values'];
503  }
504 
505  $perms = $this->permissions->hasPermissions(
507  (string) $this->field_id,
508  [
509  [
512  ],
513  [
516  ],
517  [
520  ],
521  [
524  ],
525  [
528  ],
529  [
532  ],
533  [
536  ],
537  [
540  ],
541  [
544  ],
545  [
548  ],
549  [
552  ],
553  [
556  ],
557  [
560  ],
561  [
564  ]
565  ]
566  );
567  }
568 
569  $access = [];
570  $form = $this->initForm('edit');
571  if ($this->validateForm($form, $user_field_definitions, $access, $perms) && $this->field_id) {
572  // field values are set in validateForm()...
573 
575  // diff old select options against new to handle deleted values properly
576  if (is_array($old_options)) {
577  foreach ($old_options as $old_option) {
578  if (!in_array($old_option, $user_field_definitions->getFieldValues())) {
579  ilUserDefinedData::deleteFieldValue($this->field_id, $old_option);
580  }
581  }
582  }
583  }
584  // disabled fields
585  elseif (is_array($old_options)) {
586  $user_field_definitions->setFieldValues($old_options);
587  }
588 
590  $user_field_definitions->setFieldName($form->getInput('name'));
591  } else {
592  $user_field_definitions->setFieldName($this->field_definition['field_name']);
593  }
594 
595  $user_field_definitions->enableVisible($access['visible']);
596  $user_field_definitions->enableVisibleRegistration($access['visib_reg']);
597  $user_field_definitions->enableVisibleLocalUserAdministration($access['visib_lua']);
598  $user_field_definitions->enableCourseExport($access['course_export']);
599  $user_field_definitions->enableGroupExport($access['group_export']);
600  $user_field_definitions->enablePrgExport($access['prg_export']);
601  $user_field_definitions->enableChangeable($access['changeable']);
602  $user_field_definitions->enableChangeableLocalUserAdministration($access['changeable_lua']);
603  $user_field_definitions->enableRequired($access['required']);
604  $user_field_definitions->enableExport($access['export']);
605  $user_field_definitions->enableSearchable($access['searchable']);
606  $user_field_definitions->enableCertificate($access['certificate']);
607  $user_field_definitions->update($this->field_id);
608 
609  if ($user_field_definitions->isPluginType()) {
610  $plugin = ilCustomUserFieldsHelper::getInstance()->getPluginForType($user_field_definitions->getFieldType());
611  if ($plugin instanceof ilUDFDefinitionPlugin) {
612  $plugin->updateDefinitionFromForm($form, $this->field_id);
613  }
614  }
615 
616  if ($access['course_export']) {
618  }
619 
620  $this->main_tpl->setOnScreenMessage('success', $this->lng->txt('settings_saved'), true);
621  $this->ctrl->redirect($this);
622  }
623 
624  $form->setValuesByPost();
625  $this->edit($form);
626  }
627 
628  public function askDeleteField(): bool
629  {
630  $fields = $this->request->getFields();
631  if (count($fields) == 0) {
632  $this->main_tpl->setOnScreenMessage('failure', $this->lng->txt('select_one'));
633  $this->listUserDefinedFields();
634  return false;
635  }
636 
637  $confirmation_gui = new ilConfirmationGUI();
638  $confirmation_gui->setFormAction($this->ctrl->getFormAction($this));
639  $confirmation_gui->setHeaderText($this->lng->txt('udf_delete_sure'));
640  $confirmation_gui->setCancel($this->lng->txt('cancel'), 'listUserDefinedFields');
641  $confirmation_gui->setConfirm($this->lng->txt('delete'), 'deleteField');
642 
643  $user_field_definitions = ilUserDefinedFields::_getInstance();
644  foreach ($fields as $id) {
645  $definition = $user_field_definitions->getDefinition($id);
646  $confirmation_gui->addItem('fields[]', (string) $id, $definition['field_name']);
647  }
648 
649  $this->main_tpl->setContent($confirmation_gui->getHTML());
650 
651  return true;
652  }
653 
654  public function deleteField(): void
655  {
656  $user_field_definitions = ilUserDefinedFields::_getInstance();
657  $fields = $this->request->getFields();
658 
659  // all fields have to be deletable
660  $fail = [];
661  foreach ($fields as $id) {
662  if (!$this->getPermissions()->hasPermission(
664  (string) $id,
666  )) {
667  $field = $user_field_definitions->getDefinition($id);
668  $fail[] = $field['field_name'];
669  }
670  }
671  if ($fail) {
672  $this->main_tpl->setOnScreenMessage('failure', $this->lng->txt('msg_no_perm_delete') . ' ' . implode(', ', $fail), true);
673  $this->ctrl->redirect($this, 'listUserDefinedFields');
674  }
675 
676  foreach ($fields as $id) {
677  $user_field_definitions->delete($id);
678  }
679 
680  $this->main_tpl->setOnScreenMessage('success', $this->lng->txt('udf_field_deleted'), true);
681  $this->ctrl->redirect($this);
682  }
683 
687  public function updateFields(string $action = ''): void
688  {
689  $user_field_definitions = ilUserDefinedFields::_getInstance();
690  $a_fields = $user_field_definitions->getDefinitions();
691 
692  $checked = $this->request->getChecked();
693 
694  $perm_map = self::getAccessPermissions();
695 
696  foreach ($a_fields as $field_id => $definition) {
697  $perms = $this->permissions->hasPermissions(
699  (string) $field_id,
700  [
701  [
704  ],
705  [
708  ],
709  [
712  ],
713  [
716  ],
717  [
720  ],
721  [
724  ],
725  [
728  ],
729  [
732  ],
733  [
736  ],
737  [
740  ],
741  [
744  ],
745  [
748  ]
749  ]
750  );
751 
752  // disabled field
753  foreach ($perm_map as $prop => $perm) {
755  $checked[$prop . '_' . $field_id] = $definition[$prop];
756  }
757  }
758  }
759 
760  $valid = true;
761  foreach ($a_fields as $field_id => $definition) {
762  if (isset($checked['required_' . $field_id]) && (int) $checked['required_' . $field_id] &&
763  (!isset($checked['visib_reg_' . $field_id]) || !(int) $checked['visib_reg_' . $field_id])) {
764  $this->confirm_change = true;
765 
766  $this->main_tpl->setOnScreenMessage('failure', $this->lng->txt('invalid_visible_required_options_selected'));
767  $valid = false;
768  }
769  }
770 
771  if (!$valid) {
772  $this->listUserDefinedFields();
773  return;
774  }
775 
776  foreach ($a_fields as $field_id => $definition) {
777  $user_field_definitions->setFieldName($definition['field_name']);
778  $user_field_definitions->setFieldType($definition['field_type']);
779  $user_field_definitions->setFieldValues($definition['field_values']);
780  $user_field_definitions->enableVisible((bool) ($checked['visible_' . $field_id] ?? false));
781  $user_field_definitions->enableChangeable((bool) ($checked['changeable_' . $field_id] ?? false));
782  $user_field_definitions->enableRequired((bool) ($checked['required_' . $field_id] ?? false));
783  $user_field_definitions->enableSearchable((bool) ($checked['searchable_' . $field_id] ?? false));
784  $user_field_definitions->enableExport((bool) ($checked['export_' . $field_id] ?? false));
785  $user_field_definitions->enableCourseExport((bool) ($checked['course_export_' . $field_id] ?? false));
786  $user_field_definitions->enableVisibleLocalUserAdministration((bool) ($checked['visib_lua_' . $field_id] ?? false));
787  $user_field_definitions->enableChangeableLocalUserAdministration((bool) ($checked['changeable_lua_' . $field_id] ?? false));
788  $user_field_definitions->enableGroupExport((bool) ($checked['group_export_' . $field_id] ?? false));
789  $user_field_definitions->enableVisibleRegistration((bool) ($checked['visib_reg_' . $field_id] ?? false));
790  $user_field_definitions->enableCertificate((bool) ($checked['certificate_' . $field_id] ?? false));
791  $user_field_definitions->enablePrgExport((bool) ($checked['prg_export_' . $field_id] ?? false));
792 
793  $user_field_definitions->update($field_id);
794  }
795 
796  $this->main_tpl->setOnScreenMessage('success', $this->lng->txt('settings_saved'), true);
797  $this->ctrl->redirect($this);
798  }
799 }
const UDF_TYPE_SELECT
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getItemByPostVar(string $a_post_var)
Additional user data fields definition.
ilGlobalTemplateInterface $main_tpl
ilClaimingPermissionHelper $permissions
$valid
edit(ilPropertyFormGUI $a_form=null)
static _reset()
Reset all.
getAccessOptions()
Get all access options, order is kept in forms.
getInput(string $a_post_var, bool $ensureValidation=true)
Returns the input of an item, if item provides getInput method and as fallback the value of the HTTP-...
global $DIC
Definition: feed.php:28
Class ilCustomUserFieldsGUI.
This class represents a property in a property form.
TableGUI class for custom defined user fields.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
nameExists(string $a_field_name)
const UDF_TYPE_TEXT
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct(int $ref_id, int $requested_field_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
validateForm(ilPropertyFormGUI $form, ilUserDefinedFields $user_field_definitions, array &$access, array $a_field_permissions=null)
static _hasAgreements()
Check if there is any user agreement.
setRequired(bool $a_required)
const UDF_TYPE_WYSIWYG
static deleteFieldValue(int $a_field_id, string $a_value)
Delete data of particular value of a (selection) field.
addField(ilPropertyFormGUI $a_form=null)
initForm(string $a_mode='create')
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
static getInstance(int $a_user_id, int $a_ref_id)
This class represents a text wizard property in a property form.
const UDF_DUPLICATE_VALUES
updateFields(string $action='')
Update custom fields properties (from table gui)