ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilDclFieldEditGUI.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 {
23  protected int $obj_id;
24  protected int $table_id;
25 
27  protected ilDclTable $table;
31  private ilLanguage $lng;
32  protected ilHelpGUI $help;
35  protected int $field_id;
36 
40  public function __construct(ilDclTableListGUI $a_parent_obj)
41  {
42  global $DIC;
43  $this->main_tpl = $DIC->ui()->mainTemplate();
44  $ilCtrl = $DIC['ilCtrl'];
45 
46  $this->obj_id = $a_parent_obj->getObjId();
47  $this->parent_obj = $a_parent_obj;
48  $this->help = $DIC->help();
49  $this->http = $DIC->http();
50  $this->refinery = $DIC->refinery();
51  $this->lng = $DIC->language();
52 
53  $this->table_id = $this->http->wrapper()->query()->retrieve('table_id', $this->refinery->kindlyTo()->int());
54 
55  $hasFieldId = $this->http->wrapper()->query()->has('field_id');
56  if ($hasFieldId) {
57  $this->field_id = $this->http->wrapper()->query()->retrieve('field_id', $this->refinery->kindlyTo()->int());
58  } else {
59  $this->field_id = 0;
60  }
61 
62  if ($this->field_id) {
63  $this->field_obj = ilDclCache::getFieldCache($this->field_id);
64  } else {
65  $datatype = null;
66 
67  $has_datatype = $this->http->wrapper()->post()->has('datatype');
68 
69  if ($has_datatype) {
70  $datatype_value = $this->http->wrapper()->post()->retrieve(
71  'datatype',
72  $this->refinery->kindlyTo()->int()
73  );
74  if (in_array(
75  $datatype_value,
76  array_keys(ilDclDatatype::getAllDatatype())
77  )) {
78  $datatype = $datatype_value;
79  }
80  }
81  $this->field_obj = ilDclFieldFactory::getFieldModelInstance($this->field_id, $datatype);
82  if (!$this->table_id) {
83  $ilCtrl->redirectByClass("ilDclTableListGUI", "listFields");
84  }
85  $this->field_obj->setTableId($this->table_id);
86  $ilCtrl->saveParameter($this, "table_id");
87  }
88 
89  $this->table = ilDclCache::getTableCache($this->table_id);
90  }
91 
95  public function executeCommand(): void
96  {
97  global $DIC;
98  $ilCtrl = $DIC['ilCtrl'];
99  $ilCtrl->saveParameter($this, 'field_id');
100 
101  $cmd = $ilCtrl->getCmd();
102 
103  if (!$this->checkAccess()) {
104  $this->permissionDenied();
105  return;
106  }
107 
108  switch ($cmd) {
109  case "update":
110  $this->save("update");
111  break;
112  default:
113  $this->$cmd();
114  break;
115  }
116  }
117 
121  public function create(): void
122  {
123  $this->help->setSubScreenId('create');
124 
125  $this->initForm();
126  $this->main_tpl->setContent($this->form->getHTML());
127  }
128 
132  public function edit(): void
133  {
134  $this->help->setSubScreenId('edit');
135 
136  $this->initForm("edit");
137  $this->field_obj->fillPropertiesForm($this->form);
138  $this->main_tpl->setContent($this->form->getHTML());
139  }
140 
141  /*
142  * permissionDenied
143  */
144  public function permissionDenied(): void
145  {
146  global $DIC;
147  $tpl = $DIC['tpl'];
148  $tpl->setContent("Permission denied");
149  }
150 
154  public function confirmDelete(): void
155  {
156  global $DIC;
157  $ilCtrl = $DIC['ilCtrl'];
158  $lng = $DIC['lng'];
159  $tpl = $DIC['tpl'];
160 
161  $conf = new ilConfirmationGUI();
162  $conf->setFormAction($ilCtrl->getFormAction($this));
163  $conf->setHeaderText($lng->txt('dcl_confirm_delete_field'));
164 
165  $conf->addItem('field_id', $this->field_obj->getId(), $this->field_obj->getTitle());
166 
167  $conf->setConfirm($lng->txt('delete'), 'delete');
168  $conf->setCancel($lng->txt('cancel'), 'cancelDelete');
169 
170  $tpl->setContent($conf->getHTML());
171  }
172 
176  public function cancelDelete(): void
177  {
178  global $DIC;
179  $ilCtrl = $DIC['ilCtrl'];
180 
181  $ilCtrl->redirectByClass("ildclfieldlistgui", "listFields");
182  }
183 
184  /*
185  * delete
186  */
187  public function delete(): void
188  {
189  global $DIC;
190  $ilCtrl = $DIC['ilCtrl'];
191 
192  $this->table->deleteField((int) $this->field_obj->getId());
193  $ilCtrl->redirectByClass("ildclfieldlistgui", "listFields");
194  }
195 
196  /*
197  * cancel
198  */
199  public function cancel(): void
200  {
201  global $DIC;
202  $ilCtrl = $DIC['ilCtrl'];
203  $ilCtrl->redirectByClass("ildclfieldlistgui", "listFields");
204  }
205 
210  public function initForm(string $a_mode = "create"): void
211  {
212  global $DIC;
213  $ilCtrl = $DIC['ilCtrl'];
214  $lng = $DIC['lng'];
215 
216  $this->form = new ilPropertyFormGUI();
217 
218  if ($a_mode == "edit") {
219  $this->form->setTitle($lng->txt('dcl_edit_field'));
220  $hidden_prop = new ilHiddenInputGUI("field_id");
221  $this->form->addItem($hidden_prop);
222 
223  $this->form->setFormAction($ilCtrl->getFormAction($this));
224 
225  $this->form->addCommandButton('update', $lng->txt('dcl_update_field'));
226  } else {
227  $this->form->setTitle($lng->txt('dcl_new_field'));
228  $hidden_prop = new ilHiddenInputGUI("table_id");
229  $hidden_prop->setValue((string) $this->field_obj->getTableId());
230  $this->form->addItem($hidden_prop);
231 
232  $this->form->setFormAction($ilCtrl->getFormAction($this));
233 
234  $this->form->addCommandButton('save', $lng->txt('dcl_create_field'));
235  }
236  $this->form->addCommandButton('cancel', $lng->txt('cancel'));
237 
238  $text_prop = new ilTextInputGUI($lng->txt("title"), "title");
239  $text_prop->setRequired(true);
240  $text_prop->setInfo(sprintf(
241  $lng->txt('fieldtitle_allow_chars'),
243  ));
244  $text_prop->setValidationRegexp(ilDclBaseFieldModel::_getTitleInvalidChars());
245  $this->form->addItem($text_prop);
246 
247  // Description
248  $text_prop = new ilTextAreaInputGUI($lng->txt("dcl_field_description"), "description");
249  $text_prop->setInfo($lng->txt('dcl_field_description_desc'));
250  $this->form->addItem($text_prop);
251 
252  $edit_datatype = new ilRadioGroupInputGUI($lng->txt('dcl_datatype'), 'datatype');
253 
254  if ($a_mode === 'edit') {
255  $field_representation = ilDclFieldFactory::getFieldRepresentationInstance($this->field_obj);
256  $field_representation->addFieldCreationForm($edit_datatype, $this->getDataCollectionObject(), $a_mode);
257  $edit_datatype->setDisabled(true);
258  } else {
259  foreach (ilDclDatatype::getAllDatatype() as $datatype) {
260  $model = new ilDclBaseFieldModel();
261  $model->setDatatypeId($datatype->getId());
263  $field_representation = ilDclFieldFactory::getFieldRepresentationInstance($model);
264  $field_representation->addFieldCreationForm($edit_datatype, $this->getDataCollectionObject());
265  }
266  }
267  $edit_datatype->setRequired(true);
268  $this->form->addItem($edit_datatype);
269 
270  }
271 
276  public function save(string $a_mode = "create"): void
277  {
278  global $DIC;
279  $ilCtrl = $DIC['ilCtrl'];
280  $lng = $DIC['lng'];
281  $tpl = $DIC['tpl'];
282 
283  $this->initForm($a_mode == "update" ? "edit" : "create");
284 
285  if ($this->checkInput($a_mode)) {
286 
287  // check if confirmation is needed and if so, fetch and render confirmationGUI
288  if (($a_mode == "update") && !($this->form->getInput('confirmed')) && $this->field_obj->isConfirmationRequired($this->form)) {
289  $ilConfirmationGUI = $this->field_obj->getConfirmationGUI($this->form);
290  $tpl->setContent($ilConfirmationGUI->getHTML());
291 
292  return;
293  }
294 
295  $title = $this->form->getInput("title");
296  if ($a_mode != "create" && $title != $this->field_obj->getTitle()) {
297  $this->main_tpl->setOnScreenMessage('info', $lng->txt("dcl_field_title_change_warning"), true);
298  }
299 
300  $this->field_obj->setTitle($title);
301  $this->field_obj->setDescription($this->form->getInput("description"));
302  $this->field_obj->setDatatypeId((int) $this->form->getInput("datatype"));
303 
304  if ($a_mode == "update") {
305  $this->field_obj->doUpdate();
306  } else {
307  $this->field_obj->setOrder($this->table->getNewFieldOrder());
308  $this->field_obj->doCreate();
309  }
310 
311  // Get possible properties and save them
312  $this->field_obj->storePropertiesFromForm($this->form);
313 
314  $ilCtrl->setParameter($this, "field_id", $this->field_obj->getId());
315 
316  if ($a_mode == "update") {
317  $this->main_tpl->setOnScreenMessage('success', $lng->txt("dcl_msg_field_modified"), true);
318  } else {
319  $this->table->addField($this->field_obj);
320  $this->table->buildOrderFields();
321  $this->main_tpl->setOnScreenMessage('success', $lng->txt("msg_field_created"));
322  }
323  $ilCtrl->redirectByClass(strtolower("ilDclFieldListGUI"), "listFields");
324  } else {
325  $this->form->setValuesByPost();
326  $tpl->setContent($this->form->getHTML());
327  }
328  }
329 
335  protected function checkInput(string $a_mode): bool
336  {
337  global $DIC;
338  $lng = $DIC['lng'];
339  $return = $this->form->checkInput();
340 
341  if (!$this->field_obj->checkFieldCreationInput($this->form)) {
342  $return = false;
343  }
344 
345  // Don't allow multiple fields with the same title in this table
346  if ($a_mode == 'create') {
347  if ($title = $this->form->getInput('title')) {
348  if (ilDclTable::_hasFieldByTitle($title, $this->table_id)) {
349  $inputObj = $this->form->getItemByPostVar('title');
350  $inputObj->setAlert($lng->txt("dcl_field_title_unique"));
351  $return = false;
352  }
353  }
354  }
355 
356  if (!$return) {
357  $this->main_tpl->setOnScreenMessage('failure', $lng->txt("form_input_not_valid"));
358  }
359 
360  return $return;
361  }
362 
366  protected function checkAccess(): bool
367  {
368  if ($field_id = $this->field_obj->getId()) {
370  $this->getDataCollectionObject()->getRefId(),
371  $this->table_id,
372  (int) $field_id
373  );
374  } else {
376  $this->getDataCollectionObject()->getRefId(),
377  $this->table_id
378  );
379  }
380  }
381 
386  {
387  return $this->parent_obj->getDataCollectionObject();
388  }
389 }
checkInput(string $a_mode)
Check input of form.
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
static getFieldRepresentationInstance(ilDclBaseFieldModel $field)
Help GUI class.
static getFieldCache(int $field_id=0)
ILIAS HTTP Services $http
ilDclTableListGUI $parent_obj
save(string $a_mode="create")
save Field
edit()
create field edit form
ilDclTableListGUI: ilDclFieldListGUI, ilDclFieldEditGUI, ilDclTableViewGUI, ilDclTableEditGUI ...
create()
create field add form
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static hasAccessToFields(int $ref_id, int $table_id)
This class represents a hidden form property in a property form.
__construct(ilDclTableListGUI $a_parent_obj)
Constructor.
executeCommand()
execute command
static http()
Fetches the global http state from ILIAS.
This class represents a property in a property form.
static getFieldModelInstanceByClass(ilDclBaseFieldModel $field, ?int $field_id=null)
Gets the correct instance of a fieldModel class Checks if a field is a plugin a replaces the fieldMod...
static getFieldModelInstance(int $field_id, ?int $datatype=null)
Get FieldModel from field-id and datatype.
static getAllDatatype(bool $force=false)
Get all possible Datatypes.
global $DIC
Definition: shib_login.php:26
static getTableCache(?int $table_id=null)
static hasAccessToField(int $ref_id, int $table_id, int $field_id)
ILIAS Refinery Factory $refinery
ilGlobalTemplateInterface $main_tpl
static _hasFieldByTitle(string $title, int $obj_id)
Checks if a table has a field with the given title.
form( $class_path, string $cmd, string $submit_caption="")
ilDclBaseFieldModel $field_obj
This class represents a text area property in a property form.
initForm(string $a_mode="create")
initEditCustomForm
static _getTitleInvalidChars(bool $a_as_regex=true)
All valid chars for filed titles.