ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilPCDataTableGUI.php
Go to the documentation of this file.
1 <?php
2 
25 {
26  protected \ILIAS\HTTP\Services $http;
28 
29  public function __construct(
30  ilPageObject $a_pg_obj,
31  ?ilPageContent $a_content_obj,
32  string $a_hier_id,
33  string $a_pc_id = ""
34  ) {
35  global $DIC;
36 
37  $this->main_tpl = $DIC->ui()->mainTemplate();
38  $this->lng = $DIC->language();
39  $this->ctrl = $DIC->ctrl();
40  $this->tabs = $DIC->tabs();
41  parent::__construct($a_pg_obj, $a_content_obj, $a_hier_id, $a_pc_id);
42  $this->setCharacteristics(array("StandardTable" => $this->lng->txt("cont_StandardTable")));
43  $this->tool_context = $DIC->globalScreen()->tool()->context();
44  $this->http = $DIC->http();
45  }
46 
47  protected function getFormTitle(string $a_mode = "edit"): string
48  {
49  if ($a_mode === "create") {
50  return $this->lng->txt("cont_ed_insert_dtab");
51  }
52  return $this->lng->txt("cont_table_properties");
53  }
54 
59  public function executeCommand()
60  {
61  $this->getCharacteristicsOfCurrentStyle(["table"]); // scorm-2004
62 
63  // get next class that processes or forwards current command
64  $next_class = $this->ctrl->getNextClass($this);
65 
66  // get current command
67  $cmd = $this->ctrl->getCmd();
68 
69  switch ($next_class) {
70  default:
71  $ret = $this->$cmd();
72  break;
73  }
74 
75  return $ret;
76  }
77 
78 
82 
86  public function update(bool $a_redirect = true): void
87  {
88  $lng = $this->lng;
89 
90  // handle input data
91  $data = array();
92  $cell = $this->request->getArrayArray("cell");
93  if (is_array($cell)) {
94  foreach ($cell as $i => $row) {
95  if (is_array($row)) {
96  foreach ($row as $j => $cell) {
97  $data[$i][$j] =
99  $cell,
100  $this->content_obj->getLanguage()
101  );
102  }
103  }
104  }
105  }
106 
107  $this->updated = $this->content_obj->setData($data);
108 
109  if ($this->updated !== true) {
110  $this->editData();
111  return;
112  }
113 
114  $this->updated = $this->pg_obj->update();
115 
116  if ($a_redirect) {
117  $this->main_tpl->setOnScreenMessage('success', $lng->txt("msg_obj_modified"), true);
118  $this->ctrl->redirect($this, "editData");
119  }
120  }
121 
125  public function updateJS(): void
126  {
127  $lng = $this->lng;
128  $ilCtrl = $this->ctrl;
129 
130  if ($this->request->getString("cancel_update") != "") {
131  // $this->ctrl->redirect($this, "editData");
132  $this->ctrl->returnToParent($this, "jump" . $this->hier_id);
133  }
134 
135  // handle input data
136  $data = array();
137  $post = $this->http->request()->getParsedBody();
138  foreach ($post as $k => $content) {
139  if (substr($k, 0, 5) != "cell_") {
140  continue;
141  }
142 
143  // determine cell content
144  $div = ilUtil::stripSlashes($content, false);
145  $p1 = strpos($div, '>');
146  $div = substr($div, $p1 + 1);
147  $div = "<div class='ilc_text_block_TableContent'>" . $div;
148  $text = ilPCParagraph::handleAjaxContent($div);
149  if ($text === false) {
150  $ilCtrl->returnToParent($this, "jump" . $this->hier_id);
151  }
152  $text = $text["text"];
153 
155  $text,
156  $this->content_obj->getLanguage(),
157  true,
158  false
159  );
161 
162  // set content in data array
163  $id = explode("_", $k);
164  $data[(int) $id[1]][(int) $id[2]] = $text;
165  }
166 
167  // update data
168  $this->updated = $this->content_obj->setData($data);
169 
170  if ($this->updated !== true) {
171  $this->editData();
172  return;
173  }
174 
175  $this->updated = $this->pg_obj->update();
176 
177  $tab_cmd_id = $this->request->getInt("tab_cmd_id");
178  $tab_cmd_type = $this->request->getString("tab_cmd_type");
179  $tab_cmd = $this->request->getString("tab_cmd");
180 
181  // perform table action? (move...?)
182  //$this->update(false);
183  $this->pg_obj->addHierIDs();
184  $failed = false;
185  if ($tab_cmd != "") {
186  $cell_hier_id = ($tab_cmd_type == "col")
187  ? $this->hier_id . "_1_" . ($tab_cmd_id + 1)
188  : $this->hier_id . "_" . ($tab_cmd_id + 1) . "_1";
189  $cell_obj = $this->pg_obj->getContentObject($cell_hier_id);
190  if (is_object($cell_obj)) {
191  $cell_obj->$tab_cmd();
192  $ret = $this->pg_obj->update();
193  if ($ret !== true) {
194  $this->main_tpl->setOnScreenMessage('failure', $ret[0][1], true);
195  $failed = true;
196  }
197  }
198  }
199 
200  if (!$failed) {
201  $this->main_tpl->setOnScreenMessage('success', $lng->txt("msg_obj_modified"), true);
202  }
203  if ($this->request->getString("save_return") != "") {
204  $this->ctrl->returnToParent($this, "jump" . $this->hier_id);
205  } else {
206  $this->ctrl->redirect($this, "editData");
207  }
208  }
209 
210 
214  public function getNewTableObject(): ilPCDataTable
215  {
216  return new ilPCDataTable($this->getPage());
217  }
218 
222  public function afterCreation(): void
223  {
224  $ilCtrl = $this->ctrl;
225 
226  $this->pg_obj->stripHierIDs();
227  $this->pg_obj->addHierIDs();
228  $ilCtrl->setParameter($this, "hier_id", $this->content_obj->readHierId());
229  $ilCtrl->setParameter($this, "pc_id", $this->content_obj->readPCId());
230  $ilCtrl->redirect($this, "editData");
231  }
232 
236  public function tableAction(): void
237  {
238  $ilCtrl = $this->ctrl;
239 
240  $this->update(false);
241  $this->pg_obj->addHierIDs();
242 
243  $type = $this->request->getString("type");
244  $action = $this->request->getString("action");
245  $id = $this->request->getInt("id");
246 
247  $cell_hier_id = ($type == "col")
248  ? $this->hier_id . "_1_" . ($id + 1)
249  : $this->hier_id . "_" . ($id + 1) . "_1";
250  $cell_obj = $this->pg_obj->getContentObject($cell_hier_id);
251  if (is_object($cell_obj)) {
252  $cell_obj->$action();
253  $this->edit_repo->setPageError($this->pg_obj->update());
254  }
255  $ilCtrl->redirect($this, "editData");
256  }
257 
261  public function setTabs(string $data_tab_txt_key = ""): void
262  {
263  parent::setTabs("cont_ed_edit_data");
264  }
265 
266  protected function getCellContent(int $i, int $j): string
267  {
268  $cmd = $this->ctrl->getCmd();
269  if ($cmd == "update") {
270  $s_text = ilUtil::stripSlashes("cell_" . $i . "_" . $j, false);
271  } else {
272  $s_text = ilPCParagraph::xml2output(
273  $this->content_obj->getCellText($i, $j),
274  true,
275  false
276  );
278  $s_text,
279  "TableContent",
280  $this->content_obj->readPCId() . "_" . $i . "_" . $j
281  );
282  }
283 
284  // #20628
285  $s_text = str_replace("{", "&#123;", $s_text);
286  $s_text = str_replace("}", "&#125;", $s_text);
287  return $s_text;
288  }
289 
290  public function initCreationForm(
291  ): ilPropertyFormGUI {
292 
293  $a_seleted_value = "";
294  $ilCtrl = $this->ctrl;
295  $lng = $this->lng;
296  $ilUser = $this->user;
297 
298  $form = new ilPropertyFormGUI();
299  $form->setFormAction($ilCtrl->getFormAction($this));
300  $form->setShowTopButtons(false);
301  $form->setTitle($this->getFormTitle("create"));
302 
303  $nr = array();
304  for ($i = 1; $i <= 20; $i++) {
305  $nr[$i] = $i;
306  }
307 
308  // cols
309  $cols = new ilSelectInputGUI($this->lng->txt("cont_nr_cols"), "nr_cols");
310  $cols->setOptions($nr);
311  $cols->setValue(2);
312  $form->addItem($cols);
313 
314  // rows
315  $rows = new ilSelectInputGUI($this->lng->txt("cont_nr_rows"), "nr_rows");
316  $rows->setOptions($nr);
317  $rows->setValue(2);
318  $form->addItem($rows);
319 
320  // table templates and table classes
321  $char_prop = new ilSelectInputGUI(
322  $this->lng->txt("cont_table_style"),
323  "characteristic"
324  );
325  $chars = $this->getCharacteristics();
326  $templates = $this->getTemplateOptions();
327  $chars = array_merge($templates, $chars);
328  if (is_object($this->content_obj)) {
329  if (($chars[$a_seleted_value] ?? "") == "" && ($this->content_obj->getClass() != "")) {
330  $chars = array_merge(
331  array($this->content_obj->getClass() => $this->content_obj->getClass()),
332  $chars
333  );
334  }
335  }
336  $options = [];
337  foreach ($chars as $k => $char) {
338  if (strpos($k, ":") > 0) {
339  $t = explode(":", $k);
340  $html = $this->style->lookupTemplatePreview($t[1]) . '<div style="clear:both;" class="small">' . $char . "</div>";
341  } else {
342  $html = '<table class="ilc_table_' . $k . '"><tr><td class="small">' .
343  $char . '</td></tr></table>';
344  }
345  //$char_prop->addOption($k, $char, $html);
346  $options[$k] = $char;
347  }
348  if (count($chars) > 1) {
349  $char_prop->setOptions($options);
350  $char_prop->setValue("StandardTable");
351  $form->addItem($char_prop);
352  }
353 
354  // row header
355  $cb = new ilCheckboxInputGUI($lng->txt("cont_has_row_header"), "has_row_header");
356  $form->addItem($cb);
357 
358  $form->addCommandButton("create", $lng->txt("save"));
359  $form->addCommandButton("cancelCreate", $lng->txt("cancel"));
360 
361  return $form;
362  }
363 
364  public function initEditingForm(
365  ): ilPropertyFormGUI {
366 
367  $a_seleted_value = "";
368  $ilCtrl = $this->ctrl;
369  $lng = $this->lng;
370  $ilUser = $this->user;
371 
372  $form = new ilPropertyFormGUI();
373  $form->setFormAction($ilCtrl->getFormAction($this));
374  $form->setShowTopButtons(false);
375  $form->setTitle($this->getFormTitle("edit"));
376 
377  // table templates and table classes
378  $char_prop = new ilSelectInputGUI(
379  $this->lng->txt("cont_table_style"),
380  "characteristic"
381  );
382  $chars = $this->getCharacteristics();
383  $templates = $this->getTemplateOptions();
384  $chars = array_merge($templates, $chars);
385  if (is_object($this->content_obj)) {
386  if (($chars[$a_seleted_value] ?? "") == "" && ($this->content_obj->getClass() != "")) {
387  $chars = array_merge(
388  array($this->content_obj->getClass() => $this->content_obj->getClass()),
389  $chars
390  );
391  }
392  }
393  $options = [];
394  foreach ($chars as $k => $char) {
395  if (strpos($k, ":") > 0) {
396  $t = explode(":", $k);
397  $html = $this->style->lookupTemplatePreview($t[1]) . '<div style="clear:both;" class="small">' . $char . "</div>";
398  } else {
399  $html = '<table class="ilc_table_' . $k . '"><tr><td class="small">' .
400  $char . '</td></tr></table>';
401  }
402  //$char_prop->addOption($k, $char, $html);
403  $options[$k] = $char;
404  }
405  $char_prop->setOptions($options);
406  if (count($chars) > 1) {
407  if ($this->content_obj->getTemplate() !== "") {
408  $val = "t:" .
409  ilObjStyleSheet::_lookupTemplateIdByName($this->getStyleId(), $this->content_obj->getTemplate()) . ":" .
410  $this->content_obj->getTemplate();
411  } else {
412  $val = $this->content_obj->getClass();
413  }
414  $char_prop->setValue($val);
415  $form->addItem($char_prop);
416  }
417 
418  // row header
419  $cb = new ilCheckboxInputGUI($lng->txt("cont_has_row_header"), "has_row_header");
420  if ($this->content_obj->getHeaderRows() > 0) {
421  $cb->setChecked(true);
422  }
423  $form->addItem($cb);
424 
425  return $form;
426  }
427 
428  public function initImportForm(
429  ): ilPropertyFormGUI {
430 
431  $a_seleted_value = "";
432  $ilCtrl = $this->ctrl;
433  $lng = $this->lng;
434  $ilUser = $this->user;
435 
436  $form = new ilPropertyFormGUI();
437  $form->setFormAction($ilCtrl->getFormAction($this));
438  $form->setShowTopButtons(false);
439  $form->setTitle($this->getFormTitle("create"));
440 
441  $hi = new ilHiddenInputGUI("import");
442  $hi->setValue("1");
443  $form->addItem($hi);
444 
445  $import_data = new ilTextAreaInputGUI("", "import_table");
446  $import_data->setInfo($this->lng->txt("cont_table_import_info"));
447  $import_data->setRows(8);
448  $import_data->setCols(50);
449  $form->addItem($import_data);
450 
451  // table templates and table classes
452  $char_prop = new ilSelectInputGUI(
453  $this->lng->txt("cont_table_style"),
454  "import_characteristic"
455  );
456  $chars = $this->getCharacteristics();
457  $templates = $this->getTemplateOptions();
458  $chars = array_merge($templates, $chars);
459  if (is_object($this->content_obj)) {
460  if (($chars[$a_seleted_value] ?? "") == "" && ($this->content_obj->getClass() != "")) {
461  $chars = array_merge(
462  array($this->content_obj->getClass() => $this->content_obj->getClass()),
463  $chars
464  );
465  }
466  }
467  $options = [];
468  foreach ($chars as $k => $char) {
469  if (strpos($k, ":") > 0) {
470  $t = explode(":", $k);
471  $html = $this->style->lookupTemplatePreview($t[1]) . '<div style="clear:both;" class="small">' . $char . "</div>";
472  } else {
473  $html = '<table class="ilc_table_' . $k . '"><tr><td class="small">' .
474  $char . '</td></tr></table>';
475  }
476  //$char_prop->addOption($k, $char, $html);
477  $options[$k] = $char;
478  }
479  if (count($chars) > 1) {
480  $char_prop->setOptions($options);
481  $char_prop->setValue("StandardTable");
482  $form->addItem($char_prop);
483  }
484 
485  // row header
486  $cb = new ilCheckboxInputGUI($lng->txt("cont_has_row_header"), "has_row_header");
487  $form->addItem($cb);
488 
489 
490  $form->addCommandButton("create", $lng->txt("save"));
491  $form->addCommandButton("cancelCreate", $lng->txt("cancel"));
492 
493  return $form;
494  }
495 
496  public function initCellPropertiesForm(
497  ): ilPropertyFormGUI {
498 
499  $ilCtrl = $this->ctrl;
500  $lng = $this->lng;
501  $ilUser = $this->user;
502 
503  $form = new ilPropertyFormGUI();
504  $form->setFormAction($ilCtrl->getFormAction($this));
505  $form->setShowTopButtons(false);
506  $form->setTitle($this->lng->txt("cont_cell_properties"));
507 
508  $style_cb = new ilCheckboxInputGUI($lng->txt("cont_change_style"), "style_cb");
509 
510  $style = new ilSelectInputGUI(
511  $this->lng->txt("cont_style"),
512  "style"
513  );
514  //$style->setPullRight(false);
515  $this->setBasicTableCellStyles();
516  $this->getCharacteristicsOfCurrentStyle(["table_cell"]); // scorm-2004
517  $chars = $this->getCharacteristics(); // scorm-2004
518  $options = array_merge(array("" => $this->lng->txt("none")), $chars); // scorm-2004
519  foreach ($options as $k => $option) {
520  $html = '<table border="0" cellspacing="0" cellpadding="0"><tr><td class="ilc_table_cell_' . $k . '">' .
521  $option . '</td></tr></table>';
522  //$style->addOption($k, $option, $html);
523  }
524 
525  if (count($options) > 1) {
526  $style->setOptions($options);
527  $style_cb->addSubItem($style);
528  $form->addItem($style_cb);
529  }
530 
531  $width_cb = new ilCheckboxInputGUI($lng->txt("cont_change_width"), "width_cb");
532  $ti = new ilTextInputGUI($lng->txt("cont_width"), "width");
533  $ti->setMaxLength(20);
534  $ti->setSize(7);
535  $width_cb->addSubItem($ti);
536  $form->addItem($width_cb);
537 
538  // alignment
539  $al_cb = new ilCheckboxInputGUI($lng->txt("cont_change_alignment"), "al_cb");
540  $options = array(
541  "" => $lng->txt("default"),
542  "Left" => $lng->txt("cont_left"),
543  "Center" => $lng->txt("cont_center"),
544  "Right" => $lng->txt("cont_right")
545  );
546  $si = new ilSelectInputGUI($lng->txt("cont_alignment"), "alignment");
547  $si->setOptions($options);
548  $al_cb->addSubItem($si);
549  $form->addItem($al_cb);
550 
551  return $form;
552  }
553 
554 }
tableAction()
Perform operation on table (adding, moving, deleting rows/cols)
editData()
Edit data of table.
static xml2outputJS(string $s_text)
Prepare content for js output.
updateJS()
Update via JavaScript.
static handleAjaxContent(string $a_content)
Handle ajax content.
executeCommand()
execute command
getCharacteristicsOfCurrentStyle(array $a_type)
Get characteristics of current style and call setCharacteristics, if style is given.
static _lookupTemplateIdByName(int $a_style_id, string $a_name)
Lookup table template preview.
This class represents a selection list property in a property 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...
getFormTitle(string $a_mode="edit")
ilPropertyFormGUI $form
ILIAS HTTP Services $http
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
ilGlobalTemplateInterface $main_tpl
static xml2output(string $a_text, bool $a_wysiwyg=false, bool $a_replace_lists=true, bool $unmask=true)
Converts xml from DB to output in edit textarea.
setTabs(string $data_tab_txt_key="")
Set tabs.
setOptions(array $a_options)
setCharacteristics(array $a_chars)
__construct(ilPageObject $a_pg_obj, ?ilPageContent $a_content_obj, string $a_hier_id, string $a_pc_id="")
Content object of ilPageObject (see ILIAS DTD).
static handleAjaxContentPost(string $text)
Post input2xml handling of ajax content.
This class represents a hidden form property in a property form.
static http()
Fetches the global http state from ILIAS.
afterCreation()
After creation processing.
setFormAction(string $a_formaction)
static _input2xml(string $a_text, string $a_lang, bool $a_wysiwyg=false, bool $a_handle_lists=true)
Converts user input to xml User input comes as bb code information, e.g.
Class ilPageObject Handles PageObjects of ILIAS Learning Modules (see ILIAS DTD)
global $DIC
Definition: shib_login.php:26
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
addCommandButton(string $a_cmd, string $a_text, string $a_id="")
getNewTableObject()
Get new table object.
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
__construct(Container $dic, ilPlugin $plugin)
getTemplateOptions(string $a_type="")
This class represents a text area property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setParameter(object $a_gui_obj, string $a_parameter, $a_value)
$post
Definition: ltitoken.php:46
getCellContent(int $i, int $j)
update(bool $a_redirect=true)
Update table data in dom and update page in db.
Class ilPCDataTable.