ILIAS  release_8 Revision v8.24
class.ilCustomUserFieldsGUI.php
Go to the documentation of this file.
1<?php
24{
25 protected \ILIAS\User\StandardGUIRequest $request;
26 protected int $ref_id = 0;
27 protected bool $confirm_change = false;
28 protected int $field_id = 0;
32 protected array $field_definition = [];
34 private \ilGlobalTemplateInterface $main_tpl;
35
36 public function __construct(
37 int $ref_id,
38 int $requested_field_id
39 ) {
40 global $DIC;
41 $this->main_tpl = $DIC->ui()->mainTemplate();
42
43 $lng = $DIC['lng'];
44 $ilCtrl = $DIC['ilCtrl'];
45 $this->ref_id = $ref_id;
46
47 $lng->loadLanguageModule("user");
48 $lng->loadLanguageModule("administration");
49
50 $this->field_id = $requested_field_id;
51 $ilCtrl->saveParameter($this, "field_id", $this->field_id);
52
53 if ($this->field_id) {
54 $user_field_definitions = ilUserDefinedFields::_getInstance();
55 $this->field_definition = $user_field_definitions->getDefinition($this->field_id);
56 }
57
58 $this->permissions = ilUDFPermissionHelper::getInstance(
59 $DIC->user()->getId(),
61 );
62 $this->request = new \ILIAS\User\StandardGUIRequest(
63 $DIC->http(),
64 $DIC->refinery()
65 );
66 }
67
69 {
70 return $this->permissions;
71 }
72
73 public function executeCommand(): void
74 {
75 global $DIC;
76
77 $ilCtrl = $DIC['ilCtrl'];
78
79 $next_class = $ilCtrl->getNextClass($this);
80 $cmd = $ilCtrl->getCmd();
81
82 switch ($next_class) {
83 default:
84 if (!$cmd) {
85 $cmd = "listUserDefinedFields";
86 }
87 $this->$cmd();
88 break;
89 }
90 }
91
92 public function listUserDefinedFields(): void
93 {
94 global $DIC;
95
96 $lng = $DIC['lng'];
97 $tpl = $DIC['tpl'];
98 $ilToolbar = $DIC['ilToolbar'];
99 $ilCtrl = $DIC['ilCtrl'];
100
101 if ($this->getPermissions()->hasPermission(
103 (string) $this->ref_id,
105 )) {
106 $ilToolbar->addButton(
107 $lng->txt("add_user_defined_field"),
108 $ilCtrl->getLinkTarget($this, "addField")
109 );
110 }
111
112 $tab = new ilCustomUserFieldSettingsTableGUI($this, "listUserDefinedFields", $this->getPermissions());
113 if ($this->confirm_change) {
114 $tab->setConfirmChange();
115 }
116 $tpl->setContent($tab->getHTML());
117 }
118
119 public function addField(ilPropertyFormGUI $a_form = null): void
120 {
121 global $DIC;
122
123 $tpl = $DIC['tpl'];
124
125 if (!$a_form) {
126 $a_form = $this->initForm('create');
127 }
128
129 $tpl->setContent($a_form->getHTML());
130 }
131
136 public function getAccessOptions(): array
137 {
138 global $DIC;
139
140 $lng = $DIC['lng'];
141
142 $opts = array();
143 $opts["visible"] = $lng->txt("user_visible_in_profile");
144 $opts["visib_reg"] = $lng->txt("visible_registration");
145 $opts["visib_lua"] = $lng->txt("usr_settings_visib_lua");
146 $opts["course_export"] = $lng->txt("course_export");
147 $opts["group_export"] = $lng->txt("group_export");
148 $opts["changeable"] = $lng->txt("changeable");
149 $opts["changeable_lua"] = $lng->txt("usr_settings_changeable_lua");
150 $opts["required"] = $lng->txt("required_field");
151 $opts["export"] = $lng->txt("export");
152 $opts["searchable"] = $lng->txt("header_searchable");
153 $opts["certificate"] = $lng->txt("certificate");
154 return $opts;
155 }
156
160 public static function getAccessPermissions(): array
161 {
173 );
174 }
175
176 protected function initFieldDefinition(): array // Missing array type.
177 {
178 global $DIC;
179
180 $lng = $DIC['lng'];
181
183 $lng->loadLanguageModule("ps");
184 $this->main_tpl->setOnScreenMessage('info', $lng->txt("ps_warning_modify"));
185 }
186
187 $perms = array();
188 if ($this->field_definition) {
189 $perms = $this->permissions->hasPermissions(
191 (string) $this->field_definition["field_id"],
192 array(
219 )
220 );
221 }
222 return $perms;
223 }
224
225 protected function initForm(string $a_mode = 'create'): ilPropertyFormGUI
226 {
227 global $ilCtrl, $lng;
228
229 $perms = [];
230 $se_mu = null;
231 $perm_map = [];
232 $udf_type = null;
233
235 $lng->loadLanguageModule("ps");
236 $this->main_tpl->setOnScreenMessage('info', $lng->txt("ps_warning_modify"));
237 }
238
239 if ($this->field_definition) {
240 $perms = $this->initFieldDefinition();
241 $perm_map = self::getAccessPermissions();
242 }
243
244 $form = new ilPropertyFormGUI();
245 $form->setFormAction($ilCtrl->getFormAction($this));
246
247 $name = new ilTextInputGUI($lng->txt("field_name"), "name");
248 $name->setRequired(true);
249 $form->addItem($name);
250
252 $name->setDisabled(true);
253 }
254
255 // type
256 $radg = new ilRadioGroupInputGUI($lng->txt("field_type"), "field_type");
257 $radg->setRequired(true);
258 foreach (ilCustomUserFieldsHelper::getInstance()->getUDFTypes() as $udf_type => $udf_name) {
259 $op = new ilRadioOption($udf_name, $udf_type);
260 $radg->addOption($op);
261
262 switch ($udf_type) {
263 case UDF_TYPE_TEXT:
264 case UDF_TYPE_WYSIWYG:
265 // do nothing
266 break;
267 case UDF_TYPE_SELECT:
268 // select values
269 $se_mu = new ilTextWizardInputGUI($lng->txt("value"), "selvalue");
270 $se_mu->setRequired(true);
271 $se_mu->setSize(32);
272 $se_mu->setMaxLength(128);
273 $se_mu->setValues(array(''));
274 $op->addSubItem($se_mu);
275 break;
276
277 default:
278 $plugin = ilCustomUserFieldsHelper::getInstance()->getPluginForType($udf_type);
279 if ($plugin instanceof ilUDFDefinitionPlugin) {
280 $plugin->addDefinitionTypeOptionsToRadioOption($op, $this->field_id);
281 }
282 break;
283 }
284 }
285
286 $form->addItem($radg);
287
289 $se_mu->setDisabled(true);
290 $se_mu->setRequired(false);
291 }
292
293
294 // access
295 $acc = new ilCheckboxGroupInputGUI($lng->txt("access"), "access");
296
297 $acc_values = array();
298 foreach ($this->getAccessOptions() as $id => $caption) {
299 $opt = new ilCheckboxOption($caption, $id);
300 $acc->addOption($opt);
301
302 if ($this->field_definition && $this->field_definition[$id]) {
303 $acc_values[] = $id;
304 }
305
306 if ($perms && !$perms[ilUDFPermissionHelper::ACTION_FIELD_EDIT_ACCESS][$perm_map[$id]]) {
307 $opt->setDisabled(true);
308 }
309 }
310
311 $form->addItem($acc);
312
313
314 if ($a_mode == 'create') {
315 $radg->setValue(UDF_TYPE_TEXT);
316 $form->setTitle($lng->txt('add_new_user_defined_field'));
317 $form->addCommandButton("create", $lng->txt("save"));
318 } else {
319 $name->setValue($this->field_definition["field_name"]);
320 $radg->setValue($this->field_definition["field_type"]);
321 $radg->setDisabled(true);
322 $acc->setValue($acc_values);
323
324 switch ($this->field_definition["field_type"]) {
325 case UDF_TYPE_SELECT:
326 $values = $this->field_definition["field_values"];
327 if (!is_array($values) || $values === []) {
328 $values = [''];
329 }
330 $se_mu->setValue($values);
331 $form->setTitle($lng->txt("udf_update_select_field"));
332 break;
333
334 case UDF_TYPE_TEXT:
335 $form->setTitle($lng->txt("udf_update_text_field"));
336 break;
337
338 case UDF_TYPE_WYSIWYG:
339 $form->setTitle($lng->txt("udf_update_wysiwyg_field"));
340 break;
341
342 default:
343 $plugin = ilCustomUserFieldsHelper::getInstance()->getPluginForType($udf_type);
344 if ($plugin instanceof ilUDFDefinitionPlugin) {
345 $form->setTitle($plugin->getDefinitionUpdateFormTitle());
346 }
347 break;
348 }
349 $form->addCommandButton("update", $lng->txt("save"));
350 }
351 $form->addCommandButton("listUserDefinedFields", $lng->txt("cancel"));
352 return $form;
353 }
354
355 protected function validateForm(
356 ilPropertyFormGUI $form,
357 ilUserDefinedFields $user_field_definitions,
358 array &$access,
359 array $a_field_permissions = null
360 ): bool {
361 global $DIC;
362
363 $lng = $DIC['lng'];
364 $perm_map = [];
365
366 if ($form->checkInput()) {
367 $valid = true;
368
369 $incoming = (array) $form->getInput("access");
370
371 if ($a_field_permissions) {
372 $perm_map = self::getAccessPermissions();
373 }
374
375 $access = array();
376 foreach (array_keys($this->getAccessOptions()) as $id) {
377 $access[$id] = in_array($id, $incoming);
378
379 // disabled fields
380 if ($a_field_permissions && !$a_field_permissions[ilUDFPermissionHelper::ACTION_FIELD_EDIT_ACCESS][$perm_map[$id]]) {
381 $access[$id] = $this->field_definition[$id];
382 }
383 }
384
385 if ($access['required'] && !$access['visib_reg']) {
386 $this->confirm_change = true;
387 $form->getItemByPostVar("access")->setAlert($lng->txt('udf_required_requires_visib_reg'));
388 $valid = false;
389 }
390
391 if (!$this->field_id && $user_field_definitions->nameExists($form->getInput("name"))) {
392 $form->getItemByPostVar("name")->setAlert($lng->txt('udf_name_already_exists'));
393 $valid = false;
394 }
395
396 if ($form->getInput("field_type") == UDF_TYPE_SELECT &&
398 $user_field_definitions->setFieldValues($form->getInput("selvalue"));
399 if ($error = $user_field_definitions->validateValues()) {
400 switch ($error) {
402 $form->getItemByPostVar("selvalue")->setAlert($lng->txt('udf_duplicate_entries'));
403 $valid = false;
404 break;
405 }
406 }
407 }
408
409 if (!$valid) {
410 $this->main_tpl->setOnScreenMessage('failure', $lng->txt("form_input_not_valid"));
411 }
412 return $valid;
413 }
414
415 return false;
416 }
417
418 public function create(): void
419 {
420 global $DIC;
421
422 $lng = $DIC['lng'];
423 $ilCtrl = $DIC['ilCtrl'];
424
425 $user_field_definitions = ilUserDefinedFields::_getInstance();
426 $user_field_definitions->setFieldType(
427 $this->request->getFieldType()
428 );
429
430 $access = array();
431 $form = $this->initForm('create');
432 if ($this->validateForm($form, $user_field_definitions, $access)) {
433 $user_field_definitions->setFieldName($form->getInput("name"));
434 $user_field_definitions->enableVisible($access['visible']);
435 $user_field_definitions->enableVisibleRegistration((int) $access['visib_reg']);
436 $user_field_definitions->enableVisibleLocalUserAdministration($access['visib_lua']);
437 $user_field_definitions->enableCourseExport($access['course_export']);
438 $user_field_definitions->enableGroupExport($access['group_export']);
439 $user_field_definitions->enableChangeable($access['changeable']);
440 $user_field_definitions->enableChangeableLocalUserAdministration($access['changeable_lua']);
441 $user_field_definitions->enableRequired($access['required']);
442 $user_field_definitions->enableExport($access['export']);
443 $user_field_definitions->enableSearchable($access['searchable']);
444 $user_field_definitions->enableCertificate($access['certificate']);
445 $new_id = $user_field_definitions->add();
446
447 if ($user_field_definitions->isPluginType()) {
448 $plugin = ilCustomUserFieldsHelper::getInstance()->getPluginForType($user_field_definitions->getFieldType());
449 if ($plugin instanceof ilUDFDefinitionPlugin) {
450 $plugin->updateDefinitionFromForm($form, $new_id);
451 }
452 }
453 if ($access['course_export']) {
455 }
456
457 $this->main_tpl->setOnScreenMessage('success', $lng->txt('udf_added_field'), true);
458 $ilCtrl->redirect($this);
459 }
460
461 $form->setValuesByPost();
462 $this->addField($form);
463 }
464
465 public function edit(ilPropertyFormGUI $a_form = null): void
466 {
467 global $DIC;
468
469 $tpl = $DIC['tpl'];
470
471 if (!$a_form) {
472 $a_form = $this->initForm("edit");
473 }
474
475 $tpl->setContent($a_form->getHTML());
476 }
477
478 public function update(): void
479 {
480 global $DIC;
481
482 $lng = $DIC['lng'];
483 $ilCtrl = $DIC['ilCtrl'];
484 $perms = [];
485
486 $user_field_definitions = ilUserDefinedFields::_getInstance();
487 $user_field_definitions->setFieldType($this->field_definition["field_type"]);
488
489 // gather old select options
490 $old_options = null;
491 if ($this->field_id) {
492 $old_values = $user_field_definitions->getDefinition($this->field_id);
493 if ($old_values["field_type"] == UDF_TYPE_SELECT) {
494 $old_options = $old_values["field_values"];
495 }
496
497 $perms = $this->permissions->hasPermissions(
499 (string) $this->field_id,
500 array(
527 )
528 );
529 }
530
531 $access = array();
532 $form = $this->initForm("edit");
533 if ($this->validateForm($form, $user_field_definitions, $access, $perms) && $this->field_id) {
534 // field values are set in validateForm()...
535
537 // diff old select options against new to handle deleted values properly
538 if (is_array($old_options)) {
539 foreach ($old_options as $old_option) {
540 if (!in_array($old_option, $user_field_definitions->getFieldValues())) {
541 ilUserDefinedData::deleteFieldValue($this->field_id, $old_option);
542 }
543 }
544 }
545 }
546 // disabled fields
547 elseif (is_array($old_options)) {
548 $user_field_definitions->setFieldValues($old_options);
549 }
550
552 $user_field_definitions->setFieldName($form->getInput("name"));
553 } else {
554 $user_field_definitions->setFieldName($this->field_definition["field_name"]);
555 }
556
557 $user_field_definitions->enableVisible($access['visible']);
558 $user_field_definitions->enableVisibleRegistration((int) $access['visib_reg']);
559 $user_field_definitions->enableVisibleLocalUserAdministration($access['visib_lua']);
560 $user_field_definitions->enableCourseExport($access['course_export']);
561 $user_field_definitions->enableGroupExport($access['group_export']);
562 $user_field_definitions->enableChangeable($access['changeable']);
563 $user_field_definitions->enableChangeableLocalUserAdministration($access['changeable_lua']);
564 $user_field_definitions->enableRequired($access['required']);
565 $user_field_definitions->enableExport($access['export']);
566 $user_field_definitions->enableSearchable($access['searchable']);
567 $user_field_definitions->enableCertificate($access['certificate']);
568 $user_field_definitions->update($this->field_id);
569
570 if ($user_field_definitions->isPluginType()) {
571 $plugin = ilCustomUserFieldsHelper::getInstance()->getPluginForType($user_field_definitions->getFieldType());
572 if ($plugin instanceof ilUDFDefinitionPlugin) {
573 $plugin->updateDefinitionFromForm($form, $this->field_id);
574 }
575 }
576
577 if ($access['course_export']) {
579 }
580
581 $this->main_tpl->setOnScreenMessage('success', $lng->txt('settings_saved'), true);
582 $ilCtrl->redirect($this);
583 }
584
585 $form->setValuesByPost();
586 $this->edit($form);
587 }
588
589 public function askDeleteField(): bool
590 {
591 global $DIC;
592
593 $ilCtrl = $DIC['ilCtrl'];
594 $lng = $DIC['lng'];
595 $tpl = $DIC['tpl'];
596
597 $fields = $this->request->getFields();
598 if (count($fields) == 0) {
599 $this->main_tpl->setOnScreenMessage('failure', $lng->txt("select_one"));
600 $this->listUserDefinedFields();
601 return false;
602 }
603
604 $confirmation_gui = new ilConfirmationGUI();
605 $confirmation_gui->setFormAction($ilCtrl->getFormAction($this));
606 $confirmation_gui->setHeaderText($lng->txt("udf_delete_sure"));
607 $confirmation_gui->setCancel($lng->txt("cancel"), "listUserDefinedFields");
608 $confirmation_gui->setConfirm($lng->txt("delete"), "deleteField");
609
610 $user_field_definitions = ilUserDefinedFields::_getInstance();
611 foreach ($fields as $id) {
612 $definition = $user_field_definitions->getDefinition($id);
613 $confirmation_gui->addItem("fields[]", $id, $definition["field_name"]);
614 }
615
616 $tpl->setContent($confirmation_gui->getHTML());
617
618 return true;
619 }
620
621 public function deleteField(): void
622 {
623 global $DIC;
624
625 $lng = $DIC['lng'];
626 $ilCtrl = $DIC['ilCtrl'];
627
628 $user_field_definitions = ilUserDefinedFields::_getInstance();
629 $fields = $this->request->getFields();
630
631 // all fields have to be deletable
632 $fail = array();
633 foreach ($fields as $id) {
634 if (!$this->getPermissions()->hasPermission(
636 (string) $id,
638 )) {
639 $field = $user_field_definitions->getDefinition($id);
640 $fail[] = $field["field_name"];
641 }
642 }
643 if ($fail) {
644 $this->main_tpl->setOnScreenMessage('failure', $lng->txt('msg_no_perm_delete') . " " . implode(", ", $fail), true);
645 $ilCtrl->redirect($this, "listUserDefinedFields");
646 }
647
648 foreach ($fields as $id) {
649 $user_field_definitions->delete($id);
650 }
651
652 $this->main_tpl->setOnScreenMessage('success', $lng->txt('udf_field_deleted'), true);
653 $ilCtrl->redirect($this);
654 }
655
659 public function updateFields(string $action = ""): void
660 {
661 global $DIC;
662
663 $lng = $DIC['lng'];
664 $ilCtrl = $DIC['ilCtrl'];
665
666 $user_field_definitions = ilUserDefinedFields::_getInstance();
667 $a_fields = $user_field_definitions->getDefinitions();
668
669 $checked = $this->request->getChecked();
670
671 $perm_map = self::getAccessPermissions();
672
673 foreach ($a_fields as $field_id => $definition) {
674 $perms = $this->permissions->hasPermissions(
676 (string) $field_id,
677 array(
700 )
701 );
702
703 // disabled field
704 foreach ($perm_map as $prop => $perm) {
706 $checked[$prop . '_' . $field_id] = $definition[$prop];
707 }
708 }
709 }
710
711 $valid = true;
712 foreach ($a_fields as $field_id => $definition) {
713 if (isset($checked['required_' . $field_id]) && (int) $checked['required_' . $field_id] &&
714 (!isset($checked['visib_reg_' . $field_id]) || !(int) $checked['visib_reg_' . $field_id])) {
715 $this->confirm_change = true;
716
717 $this->main_tpl->setOnScreenMessage('failure', $lng->txt('invalid_visible_required_options_selected'));
718 $valid = false;
719 }
720 }
721
722 if (!$valid) {
723 $this->listUserDefinedFields();
724 return;
725 }
726
727 foreach ($a_fields as $field_id => $definition) {
728 $user_field_definitions->setFieldName($definition['field_name']);
729 $user_field_definitions->setFieldType($definition['field_type']);
730 $user_field_definitions->setFieldValues($definition['field_values']);
731 $user_field_definitions->enableVisible((bool) ($checked['visible_' . $field_id] ?? false));
732 $user_field_definitions->enableChangeable((bool) ($checked['changeable_' . $field_id] ?? false));
733 $user_field_definitions->enableRequired((bool) ($checked['required_' . $field_id] ?? false));
734 $user_field_definitions->enableSearchable((bool) ($checked['searchable_' . $field_id] ?? false));
735 $user_field_definitions->enableExport((bool) ($checked['export_' . $field_id] ?? false));
736 $user_field_definitions->enableCourseExport((bool) ($checked['course_export_' . $field_id] ?? false));
737 $user_field_definitions->enableVisibleLocalUserAdministration((bool) ($checked['visib_lua_' . $field_id] ?? false));
738 $user_field_definitions->enableChangeableLocalUserAdministration((bool) ($checked['changeable_lua_' . $field_id] ?? false));
739 $user_field_definitions->enableGroupExport((bool) ($checked['group_export_' . $field_id] ?? false));
740 $user_field_definitions->enableVisibleRegistration((bool) ($checked['visib_reg_' . $field_id] ?? false));
741 $user_field_definitions->enableCertificate((bool) ($checked['certificate_' . $field_id] ?? false));
742
743 $user_field_definitions->update($field_id);
744 }
745
746 $this->main_tpl->setOnScreenMessage('success', $lng->txt('settings_saved'), true);
747 $ilCtrl->redirect($this);
748 }
749}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
const UDF_TYPE_SELECT
const UDF_TYPE_WYSIWYG
const UDF_TYPE_TEXT
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const UDF_DUPLICATE_VALUES
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...
static getInstance(int $a_user_id, int $a_ref_id)
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...
addField(ilPropertyFormGUI $a_form=null)
initForm(string $a_mode='create')
__construct(int $ref_id, int $requested_field_id)
ilClaimingPermissionHelper $permissions
validateForm(ilPropertyFormGUI $form, ilUserDefinedFields $user_field_definitions, array &$access, array $a_field_permissions=null)
edit(ilPropertyFormGUI $a_form=null)
updateFields(string $action="")
Update custom fields properties (from table gui)
ilGlobalTemplateInterface $main_tpl
getAccessOptions()
Get all access options, order is kept in forms.
ILIAS User StandardGUIRequest $request
static _hasAgreements()
Check if there is any user agreement.
static _reset()
Reset all.
This class represents a property form user interface.
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-...
getItemByPostVar(string $a_post_var)
This class represents a property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This class represents a text property in a property form.
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...
static deleteFieldValue(int $a_field_id, string $a_value)
Delete data of particular value of a (selection) field.
Additional user data fields definition.
enableVisibleLocalUserAdministration(bool $a_visible)
enableChangeableLocalUserAdministration(bool $a_changeable)
nameExists(string $a_field_name)
enableGroupExport(bool $a_group_export)
enableSearchable(bool $a_searchable)
enableVisibleRegistration(bool $a_visible_registration)
enableCourseExport(bool $a_course_export)
enableChangeable(bool $a_changeable)
$valid
global $DIC
Definition: feed.php:28
if($DIC->http() ->request() ->getMethod()=="GET" &&isset($DIC->http() ->request() ->getQueryParams()['tex'])) $tpl
Definition: latex.php:41
if($format !==null) $name
Definition: metadata.php:247
$lng