ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilTable2GUI.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 require_once("Services/Table/classes/class.ilTableGUI.php");
5 
15 class ilTable2GUI extends ilTableGUI
16 {
17  protected $close_command = "";
18  private $unique_id;
19  private $headerHTML;
20  protected $top_anchor = "il_table_top";
21  protected $filters = array();
22  protected $optional_filters = array();
23  protected $filter_cmd = 'applyFilter';
24  protected $reset_cmd = 'resetFilter';
25  protected $filter_cols = 5;
26  protected $ext_sort = false;
27  protected $ext_seg = false;
28  protected $context = "";
29 
30  protected $mi_sel_buttons = null;
31  protected $disable_filter_hiding = false;
32  protected $selected_filter = false;
33  protected $top_commands = true;
34  protected $selectable_columns = array();
35  protected $selected_column = array();
36  protected $show_templates = false;
37  protected $show_rows_selector = true; // JF, 2014-10-27
38 
39  protected $nav_determined= false;
40  protected $limit_determined = false;
41  protected $filters_determined = false;
42  protected $columns_determined = false;
43  protected $open_form_tag = true;
44  protected $close_form_tag = true;
45 
46  protected $export_formats;
47  protected $export_mode;
48  protected $print_mode;
49 
51  protected $restore_filter; // [bool]
52  protected $restore_filter_values; // [bool]
53 
54  protected $sortable_fields = array();
58  protected $prevent_double_submission = true;
59 
64 
65  const FILTER_TEXT = 1;
66  const FILTER_SELECT = 2;
67  const FILTER_DATE = 3;
68  const FILTER_LANGUAGE = 4;
70  const FILTER_DATE_RANGE = 6;
73 
74  const EXPORT_EXCEL = 1;
75  const EXPORT_CSV = 2;
76 
77  const ACTION_ALL_LIMIT = 1000;
78 
83  public function __construct($a_parent_obj, $a_parent_cmd = "", $a_template_context = "")
84  {
85  global $lng;
86 
87  parent::__construct(0, false);
88  $this->unique_id = md5(uniqid());
89  $this->parent_obj = $a_parent_obj;
90  $this->parent_cmd = $a_parent_cmd;
91  $this->buttons = array();
92  $this->header_commands = array();
93  $this->multi = array();
94  $this->hidden_inputs = array();
95  $this->formname = "table_" . $this->unique_id;
96  $this->tpl = new ilTemplate("tpl.table2.html", true, true, "Services/Table");
97 
98  $lng->loadLanguageModule('tbl');
99 
100  if(!$a_template_context)
101  {
102  $a_template_context = $this->getId();
103  }
104  $this->setContext($a_template_context);
105 
106  // activate export mode
107  if(isset($_GET[$this->prefix."_xpt"]))
108  {
109  $this->export_mode = (int)$_GET[$this->prefix."_xpt"];
110  }
111 
112  // template handling
113  if(isset($_GET[$this->prefix."_tpl"]))
114  {
115  $this->restoreTemplate($_GET[$this->prefix."_tpl"]);
116  }
117 
118  $this->determineLimit();
119  $this->setIsDataTable(true);
120  $this->setEnableNumInfo(true);
121  $this->determineSelectedColumns();
122  }
123 
129  function setOpenFormTag($a_val)
130  {
131  $this->open_form_tag = $a_val;
132  }
133 
139  function getOpenFormTag()
140  {
141  return $this->open_form_tag;
142  }
143 
149  function setCloseFormTag($a_val)
150  {
151  $this->close_form_tag = $a_val;
152  }
153 
159  function getCloseFormTag()
160  {
161  return $this->close_form_tag;
162  }
163 
167  function determineLimit()
168  {
169  global $ilUser;
170 
171  if ($this->limit_determined)
172  {
173  return;
174  }
175 
176  $limit = 0;
177  if (isset($_GET[$this->prefix."_trows"]))
178  {
179  $this->storeProperty("rows", $_GET[$this->prefix."_trows"]);
180  $limit = $_GET[$this->prefix."_trows"];
181  $this->resetOffset();
182  }
183 
184  if ($limit == 0)
185  {
186  $rows = $this->loadProperty("rows");
187  if ($rows > 0)
188  {
189  $limit = $rows;
190  }
191  else
192  {
193  if (is_object($ilUser))
194  {
195  $limit = $ilUser->getPref("hits_per_page");
196  }
197  else
198  {
199  $limit = 40;
200  }
201  }
202  }
203 
204  $this->setLimit($limit);
205  $this->limit_determined = true;
206  }
207 
214  {
215  return array();
216  }
217 
222  {
223  if ($this->columns_determined)
224  {
225  return;
226  }
227 
228  $old_sel = $this->loadProperty("selfields");
229 
230  $stored = false;
231  if ($old_sel != "")
232  {
233  $sel_fields =
234  @unserialize($old_sel);
235  $stored = true;
236  }
237  if(!is_array($sel_fields))
238  {
239  $stored = false;
240  $sel_fields = array();
241  }
242 
243  $this->selected_columns = array();
244  $set = false;
245  foreach ($this->getSelectableColumns() as $k => $c)
246  {
247  $this->selected_column[$k] = false;
248 
249  $new_column = ($sel_fields[$k] === NULL);
250 
251  if ($_POST["tblfsh".$this->getId()])
252  {
253  $set = true;
254  if (is_array($_POST["tblfs".$this->getId()]) && in_array($k, $_POST["tblfs".$this->getId()]))
255  {
256  $this->selected_column[$k] = true;
257  }
258  }
259  else if ($stored && !$new_column) // take stored values
260  {
261  $this->selected_column[$k] = $sel_fields[$k];
262  }
263  else // take default values
264  {
265  if ($new_column)
266  {
267  $set = true;
268  }
269  if ($c["default"])
270  {
271  $this->selected_column[$k] = true;
272  }
273  }
274  }
275 
276  if ($old_sel != serialize($this->selected_column) && $set)
277  {
278  $this->storeProperty("selfields", serialize($this->selected_column));
279  }
280 
281  $this->columns_determined = true;
282  }
283 
290  function isColumnSelected($a_col)
291  {
292  return $this->selected_column[$a_col];
293  }
294 
302  {
303  $scol = array();
304  foreach ($this->selected_column as $k => $v)
305  {
306  if ($v)
307  {
308  $scol[$k] = $k;
309  }
310  }
311  return $scol;
312  }
313 
317  function &executeCommand()
318  {
319  global $ilCtrl;
320 
321  $next_class = $ilCtrl->getNextClass($this);
322  $cmd = $ilCtrl->getCmd();
323 
324  switch($next_class)
325  {
326  case 'ilformpropertydispatchgui':
327  include_once './Services/Form/classes/class.ilFormPropertyDispatchGUI.php';
328  $form_prop_dispatch = new ilFormPropertyDispatchGUI();
329  $this->initFilter();
330  $item = $this->getFilterItemByPostVar($_GET["postvar"]);
331  $form_prop_dispatch->setItem($item);
332  return $ilCtrl->forwardCommand($form_prop_dispatch);
333  break;
334 
335  }
336  return false;
337  }
338 
342  function resetOffset($a_in_determination = false)
343  {
344  if (!$this->nav_determined && !$a_in_determination)
345  {
346  $this->determineOffsetAndOrder();
347  }
348  $this->nav_value = $this->getOrderField().":".$this->getOrderDirection().":0";
349  $_GET[$this->getNavParameter()] =
350  $_POST[$this->getNavParameter()."1"] =
351  $this->nav_value;
352 //echo $this->nav_value;
353  $this->setOffset(0);
354  }
355 
360  function initFilter()
361  {
362  }
363 
369  public function getParentObject()
370  {
371  return $this->parent_obj;
372  }
373 
379  public function getParentCmd()
380  {
381  return $this->parent_cmd;
382  }
383 
389  function setTopAnchor($a_val)
390  {
391  $this->top_anchor = $a_val;
392  }
393 
399  function getTopAnchor()
400  {
401  return $this->top_anchor;
402  }
403 
409  function setNoEntriesText($a_text)
410  {
411  $this->noentriestext = $a_text;
412  }
413 
419  function getNoEntriesText()
420  {
421  return $this->noentriestext;
422  }
423 
429  function setIsDataTable($a_val)
430  {
431  $this->datatable = $a_val;
432  }
433 
439  function getIsDataTable()
440  {
441  return $this->datatable;
442  }
443 
449  function setEnableTitle($a_enabletitle)
450  {
451  $this->enabled["title"] = $a_enabletitle;
452  }
453 
459  function getEnableTitle()
460  {
461  return $this->enabled["title"];
462  }
463 
469  function setEnableHeader($a_enableheader)
470  {
471  $this->enabled["header"] = $a_enableheader;
472  }
473 
479  function getEnableHeader()
480  {
481  return $this->enabled["header"];
482  }
483 
489  function setEnableNumInfo($a_val)
490  {
491  $this->num_info = $a_val;
492  }
493 
499  function getEnableNumInfo()
500  {
501  return $this->num_info;
502  }
503 
507  final public function setTitle($a_title, $a_icon = 0, $a_icon_alt = 0)
508  {
509  parent::setTitle($a_title, $a_icon, $a_icon_alt);
510  }
511 
517  function setDescription($a_val)
518  {
519  $this->description = $a_val;
520  }
521 
527  function getDescription()
528  {
529  return $this->description;
530  }
531 
537  function setOrderField($a_order_field)
538  {
539  $this->order_field = $a_order_field;
540  }
541 
542  function getOrderField()
543  {
544  return $this->order_field;
545  }
546 
547  final public function setData($a_data)
548  {
549  // check column names against given data (to ensure proper sorting)
550  if(DEVMODE &&
551  $this->enabled["header"] && $this->enabled["sort"] &&
552  $this->columns_determined && is_array($this->column) &&
553  is_array($a_data) && sizeof($a_data) && !$this->getExternalSorting())
554  {
555  $check = $a_data;
556  $check = array_keys(array_shift($check));
557  foreach($this->column as $col)
558  {
559  if($col["sort_field"] && !in_array($col["sort_field"], $check))
560  {
561  $invalid[] = $col["sort_field"];
562  }
563  }
564 
565  // this triggers an error, if some columns are not set for some rows
566  // which may just be a representation of "null" values, e.g.
567  // ilAdvancedMDValues:queryForRecords works that way.
568 /* if(sizeof($invalid))
569  {
570  trigger_error("The following columns are defined as sortable but".
571  " cannot be found in the given data: ".implode(", ", $invalid).
572  ". Sorting will not work properly.", E_USER_WARNING);
573  }*/
574  }
575 
576  $this->row_data = $a_data;
577  }
578 
579  final public function getData()
580  {
581  return $this->row_data;
582  }
583 
584  final public function dataExists()
585  {
586  if (is_array($this->row_data))
587  {
588  if (count($this->row_data) > 0)
589  {
590  return true;
591  }
592  }
593  return false;
594  }
595 
596  final public function setPrefix($a_prefix)
597  {
598  $this->prefix = $a_prefix;
599  }
600 
601  final public function getPrefix()
602  {
603  return $this->prefix;
604  }
605 
610  final function addFilterItem($a_input_item, $a_optional = false)
611  {
612  $a_input_item->setParent($this);
613  if (!$a_optional)
614  {
615  $this->filters[] = $a_input_item;
616  }
617  else
618  {
619  $this->optional_filters[] = $a_input_item;
620  }
621 
622  // restore filter values (from stored view)
623  if($this->restore_filter)
624  {
625  if(array_key_exists($a_input_item->getFieldId(), $this->restore_filter_values))
626  {
627  $this->setFilterValue($a_input_item, $this->restore_filter_values[$a_input_item->getFieldId()]);
628  }
629  else
630  {
631  $this->setFilterValue($a_input_item, null); // #14949
632  }
633  }
634  }
635 
645  function addFilterItemByMetaType($id, $type = self::FILTER_TEXT, $a_optional = false, $caption = NULL)
646  {
647  global $lng;
648 
649  if(!$caption)
650  {
651  $caption = $lng->txt($id);
652  }
653 
654  include_once("./Services/Form/classes/class.ilPropertyFormGUI.php");
655 
656  switch($type)
657  {
658  case self::FILTER_SELECT:
659  include_once("./Services/Form/classes/class.ilSelectInputGUI.php");
660  $item = new ilSelectInputGUI($caption, $id);
661  break;
662 
663  case self::FILTER_DATE:
664  include_once("./Services/Form/classes/class.ilDateTimeInputGUI.php");
665  $item = new ilDateTimeInputGUI($caption, $id);
666  $item->setMode(ilDateTimeInputGUI::MODE_INPUT);
667  break;
668 
669  case self::FILTER_TEXT:
670  include_once("./Services/Form/classes/class.ilTextInputGUI.php");
671  $item = new ilTextInputGUI($caption, $id);
672  $item->setMaxLength(64);
673  $item->setSize(20);
674  // $item->setSubmitFormOnEnter(true);
675  break;
676 
677  case self::FILTER_LANGUAGE:
678  $lng->loadLanguageModule("meta");
679  include_once("./Services/Form/classes/class.ilSelectInputGUI.php");
680  $item = new ilSelectInputGUI($caption, $id);
681  $options = array("" => $lng->txt("trac_all"));
682  foreach ($lng->getInstalledLanguages() as $lang_key)
683  {
684  $options[$lang_key] = $lng->txt("meta_l_".$lang_key);
685  }
686  $item->setOptions($options);
687  break;
688 
689  case self::FILTER_NUMBER_RANGE:
690  include_once("./Services/Form/classes/class.ilCombinationInputGUI.php");
691  include_once("./Services/Form/classes/class.ilNumberInputGUI.php");
692  $item = new ilCombinationInputGUI($caption, $id);
693  $combi_item = new ilNumberInputGUI("", $id."_from");
694  $item->addCombinationItem("from", $combi_item, $lng->txt("from"));
695  $combi_item = new ilNumberInputGUI("", $id."_to");
696  $item->addCombinationItem("to", $combi_item, $lng->txt("to"));
697  $item->setComparisonMode(ilCombinationInputGUI::COMPARISON_ASCENDING);
698  $item->setMaxLength(7);
699  $item->setSize(20);
700  break;
701 
702  case self::FILTER_DATE_RANGE:
703  include_once("./Services/Form/classes/class.ilCombinationInputGUI.php");
704  include_once("./Services/Form/classes/class.ilDateTimeInputGUI.php");
705  $item = new ilCombinationInputGUI($caption, $id);
706  $combi_item = new ilDateTimeInputGUI("", $id."_from");
707  $item->addCombinationItem("from", $combi_item, $lng->txt("from"));
708  $combi_item = new ilDateTimeInputGUI("", $id."_to");
709  $item->addCombinationItem("to", $combi_item, $lng->txt("to"));
710  $item->setComparisonMode(ilCombinationInputGUI::COMPARISON_ASCENDING);
711  $item->setMode(ilDateTimeInputGUI::MODE_INPUT);
712  break;
713 
714  case self::FILTER_DATETIME_RANGE:
715  include_once("./Services/Form/classes/class.ilCombinationInputGUI.php");
716  include_once("./Services/Form/classes/class.ilDateTimeInputGUI.php");
717  $item = new ilCombinationInputGUI($caption, $id);
718  $combi_item = new ilDateTimeInputGUI("", $id."_from");
719  $combi_item->setShowTime(true);
720  $item->addCombinationItem("from", $combi_item, $lng->txt("from"));
721  $combi_item = new ilDateTimeInputGUI("", $id."_to");
722  $combi_item->setShowTime(true);
723  $item->addCombinationItem("to", $combi_item, $lng->txt("to"));
724  $item->setComparisonMode(ilCombinationInputGUI::COMPARISON_ASCENDING);
725  $item->setMode(ilDateTimeInputGUI::MODE_INPUT);
726  break;
727 
728  case self::FILTER_DURATION_RANGE:
729  $lng->loadLanguageModule("form");
730  include_once("./Services/Form/classes/class.ilCombinationInputGUI.php");
731  include_once("./Services/Form/classes/class.ilDurationInputGUI.php");
732  $item = new ilCombinationInputGUI($caption, $id);
733  $combi_item = new ilDurationInputGUI("", $id."_from");
734  $combi_item->setShowMonths(false);
735  $combi_item->setShowDays(true);
736  $combi_item->setShowSeconds(true);
737  $item->addCombinationItem("from", $combi_item, $lng->txt("from"));
738  $combi_item = new ilDurationInputGUI("", $id."_to");
739  $combi_item->setShowMonths(false);
740  $combi_item->setShowDays(true);
741  $combi_item->setShowSeconds(true);
742  $item->addCombinationItem("to", $combi_item, $lng->txt("to"));
743  $item->setComparisonMode(ilCombinationInputGUI::COMPARISON_ASCENDING);
744  break;
745 
746  default:
747  return false;
748  }
749 
750  $this->addFilterItem($item, $a_optional);
751  $item->readFromSession();
752  return $item;
753  }
754 
758  final function getFilterItems($a_optionals = false)
759  {
760  if (!$a_optionals)
761  {
762  return $this->filters;
763  }
765  }
766 
767  final function getFilterItemByPostVar($a_post_var)
768  {
769  foreach ($this->getFilterItems() as $item)
770  {
771  if ($item->getPostVar() == $a_post_var)
772  {
773  return $item;
774  }
775  }
776  foreach ($this->getFilterItems(true) as $item)
777  {
778  if ($item->getPostVar() == $a_post_var)
779  {
780  return $item;
781  }
782  }
783  return false;
784  }
785 
791  function setFilterCols($a_val)
792  {
793  $this->filter_cols = $a_val;
794  }
795 
801  function getFilterCols()
802  {
803  return $this->filter_cols;
804  }
805 
811  function setDisableFilterHiding($a_val = true)
812  {
813  $this->disable_filter_hiding = $a_val;
814  }
815 
822  {
824  }
825 
832  function isFilterSelected($a_col)
833  {
834  return $this->selected_filter[$a_col];
835  }
836 
844  {
845  $sfil = array();
846  foreach ($this->selected_filter as $k => $v)
847  {
848  if ($v)
849  {
850  $sfil[$k] = $k;
851  }
852  }
853  return $sfil;
854  }
855 
863  {
864  if ($this->filters_determined)
865  {
866  return;
867  }
868 
869  $old_sel = $this->loadProperty("selfilters");
870  $stored = false;
871  if ($old_sel != "")
872  {
873  $sel_filters =
874  @unserialize($old_sel);
875  $stored = true;
876  }
877  if(!is_array($sel_filters))
878  {
879  $stored = false;
880  $sel_filters = array();
881  }
882 
883  $this->selected_filter = array();
884  $set = false;
885  foreach ($this->getFilterItems(true) as $item)
886  {
887  $k = $item->getPostVar();
888 
889  $this->selected_filter[$k] = false;
890 
891  if ($_POST["tblfsf".$this->getId()])
892  {
893  $set = true;
894  if (is_array($_POST["tblff".$this->getId()]) && in_array($k, $_POST["tblff".$this->getId()]))
895  {
896  $this->selected_filter[$k] = true;
897  }
898  else
899  {
900  $item->setValue(NULL);
901  $item->writeToSession();
902  }
903  }
904  else if ($stored) // take stored values
905  {
906  $this->selected_filter[$k] = $sel_filters[$k];
907  }
908  }
909 
910  if ($old_sel != serialize($this->selected_filter) && $set)
911  {
912  $this->storeProperty("selfilters", serialize($this->selected_filter));
913  }
914 
915  $this->filters_determined = true;
916  }
917 
921  function setCustomPreviousNext($a_prev_link, $a_next_link)
922  {
923  $this->custom_prev_next = true;
924  $this->custom_prev = $a_prev_link;
925  $this->custom_next = $a_next_link;
926  }
927 
934  final public function setFormAction($a_form_action, $a_multipart = false)
935  {
936  $this->form_action = $a_form_action;
937  $this->form_multipart = (bool)$a_multipart;
938  }
939 
945  final public function getFormAction()
946  {
947  return $this->form_action;
948  }
949 
955  function setFormName($a_formname)
956  {
957  $this->formname = $a_formname;
958  }
959 
965  function getFormName()
966  {
967  return $this->formname;
968  }
969 
975  function setId($a_val)
976  {
977  $this->id = $a_val;
978  if ($this->getPrefix() == "")
979  {
980  $this->setPrefix($a_val);
981  }
982  }
983 
989  function getId()
990  {
991  return $this->id;
992  }
993 
999  function setDisplayAsBlock($a_val)
1000  {
1001  $this->display_as_block = $a_val;
1002  }
1003 
1010  {
1011  return $this->display_as_block;
1012  }
1013 
1020  {
1022  }
1023 
1029  function setSelectAllCheckbox($a_select_all_checkbox)
1030  {
1031  $this->select_all_checkbox = $a_select_all_checkbox;
1032  }
1033 
1039  function setExternalSorting($a_val)
1040  {
1041  $this->ext_sort = $a_val;
1042  }
1043 
1050  {
1051  return $this->ext_sort;
1052  }
1053 
1060  function setFilterCommand($a_val, $a_caption = null)
1061  {
1062  $this->filter_cmd = $a_val;
1063  $this->filter_cmd_txt = $a_caption;
1064  }
1065 
1071  function getFilterCommand()
1072  {
1073  return $this->filter_cmd;
1074  }
1075 
1082  function setResetCommand($a_val, $a_caption = null)
1083  {
1084  $this->reset_cmd = $a_val;
1085  $this->reset_cmd_txt = $a_caption;
1086  }
1087 
1093  function getResetCommand()
1094  {
1095  return $this->reset_cmd;
1096  }
1097 
1103  function setExternalSegmentation($a_val)
1104  {
1105  $this->ext_seg = $a_val;
1106  }
1107 
1114  {
1115  return $this->ext_seg;
1116  }
1117 
1124  final public function setRowTemplate($a_template, $a_template_dir = "")
1125  {
1126  $this->row_template = $a_template;
1127  $this->row_template_dir = $a_template_dir;
1128  }
1129 
1135  function setDefaultOrderField($a_defaultorderfield)
1136  {
1137  $this->defaultorderfield = $a_defaultorderfield;
1138  }
1139 
1146  {
1147  return $this->defaultorderfield;
1148  }
1149 
1155  function setDefaultOrderDirection($a_defaultorderdirection)
1156  {
1157  $this->defaultorderdirection = $a_defaultorderdirection;
1158  }
1159 
1166  {
1167  return $this->defaultorderdirection;
1168  }
1169 
1170  /*
1171  * Removes all command buttons from the table
1172  *
1173  * @access public
1174  */
1175  public function clearCommandButtons()
1176  {
1177  $this->buttons = array();
1178  }
1179 
1186  function addCommandButton($a_cmd, $a_text, $a_onclick = '', $a_id = "", $a_class = null)
1187  {
1188  $this->buttons[] = array("cmd" => $a_cmd, "text" => $a_text, 'onclick' => $a_onclick,
1189  "id" => $a_id, "class" => $a_class);
1190  }
1191 
1198  {
1199  $this->buttons[] = $a_button;
1200  }
1201 
1212  function addSelectionButton($a_sel_var, $a_options, $a_cmd, $a_text, $a_default_selection = '')
1213  {
1214 echo "ilTabl2GUI->addSelectionButton() has been deprecated with 4.2. Please try to move the drop-down to ilToolbarGUI.";
1215 // $this->sel_buttons[] = array("sel_var" => $a_sel_var, "options" => $a_options, "selected" => $a_default_selection, "cmd" => $a_cmd, "text" => $a_text);
1216  }
1217 
1227  public function addMultiItemSelectionButton($a_sel_var, $a_options, $a_cmd, $a_text, $a_default_selection = '')
1228  {
1229  $this->mi_sel_buttons[] = array("sel_var" => $a_sel_var, "options" => $a_options, "selected" => $a_default_selection, "cmd" => $a_cmd, "text" => $a_text);
1230  $this->addHiddenInput("cmd_sv[".$a_cmd."]", $a_sel_var);
1231  }
1232 
1233 
1234 
1241  function setCloseCommand($a_link)
1242  {
1243  $this->close_command = $a_link;
1244  }
1245 
1252  function addMultiCommand($a_cmd, $a_text)
1253  {
1254  $this->multi[] = array("cmd" => $a_cmd, "text" => $a_text);
1255  }
1256 
1263  public function addHiddenInput($a_name, $a_value)
1264  {
1265  $this->hidden_inputs[] = array("name" => $a_name, "value" => $a_value);
1266  }
1267 
1274  function addHeaderCommand($a_href, $a_text, $a_target = "", $a_img = "")
1275  {
1276  $this->header_commands[] = array("href" => $a_href, "text" => $a_text,
1277  "target" => $a_target, "img" => $a_img);
1278  }
1279 
1285  function setTopCommands($a_val)
1286  {
1287  $this->top_commands = $a_val;
1288  }
1289 
1295  function getTopCommands()
1296  {
1297  return $this->top_commands;
1298  }
1299 
1307  final public function addColumn($a_text, $a_sort_field = "", $a_width = "",
1308  $a_is_checkbox_action_column = false, $a_class = "", $a_tooltip = "")
1309  {
1310  $this->column[] = array(
1311  "text" => $a_text,
1312  "sort_field" => $a_sort_field,
1313  "width" => $a_width,
1314  "is_checkbox_action_column" => $a_is_checkbox_action_column,
1315  "class" => $a_class,
1316  "tooltip" => $a_tooltip
1317  );
1318  if ($a_sort_field != "")
1319  {
1320  $this->sortable_fields[] = $a_sort_field;
1321  }
1322  $this->column_count = count($this->column);
1323  }
1324 
1325 
1326  final public function getNavParameter()
1327  {
1328  return $this->prefix."_table_nav";
1329  }
1330 
1331  function setOrderLink($sort_field, $order_dir)
1332  {
1333  global $ilCtrl, $ilUser;
1334 
1335  $hash = "";
1336  if (is_object($ilUser) && $ilUser->getPref("screen_reader_optimization"))
1337  {
1338  $hash = "#".$this->getTopAnchor();
1339  }
1340 
1341  $old = $_GET[$this->getNavParameter()];
1342 
1343  // set order link
1344  $ilCtrl->setParameter($this->parent_obj,
1345  $this->getNavParameter(),
1346  $sort_field.":".$order_dir.":".$this->offset);
1347  $this->tpl->setVariable("TBL_ORDER_LINK",
1348  $ilCtrl->getLinkTarget($this->parent_obj, $this->parent_cmd).$hash);
1349 
1350  // set old value of nav variable
1351  $ilCtrl->setParameter($this->parent_obj,
1352  $this->getNavParameter(), $old);
1353  }
1354 
1355  function fillHeader()
1356  {
1357  global $lng;
1358 
1359  $allcolumnswithwidth = true;
1360  foreach ((array) $this->column as $idx => $column)
1361  {
1362  if (!strlen($column["width"]))
1363  {
1364  $allcolumnswithwidth = false;
1365  }
1366  else if($column["width"] == "1")
1367  {
1368  // IE does not like 1 but seems to work with 1%
1369  $this->column[$idx]["width"] = "1%";
1370  }
1371  }
1372  if ($allcolumnswithwidth)
1373  {
1374  foreach ((array) $this->column as $column)
1375  {
1376  $this->tpl->setCurrentBlock("tbl_colgroup_column");
1377  $this->tpl->setVariable("COLGROUP_COLUMN_WIDTH", $column["width"]);
1378  $this->tpl->parseCurrentBlock();
1379  }
1380  }
1381  $ccnt = 0;
1382  foreach ((array) $this->column as $column)
1383  {
1384  $ccnt++;
1385 
1386  //tooltip
1387  if ($column["tooltip"] != "")
1388  {
1389  include_once("./Services/UIComponent/Tooltip/classes/class.ilTooltipGUI.php");
1390  ilTooltipGUI::addTooltip("thc_".$this->getId()."_".$ccnt, $column["tooltip"]);
1391  }
1392  if (!$this->enabled["sort"] || $column["sort_field"] == "" || $column["is_checkbox_action_column"])
1393  {
1394  $this->tpl->setCurrentBlock("tbl_header_no_link");
1395  if ($column["width"] != "")
1396  {
1397  $this->tpl->setVariable("TBL_COLUMN_WIDTH_NO_LINK"," width=\"".$column["width"]."\"");
1398  }
1399  if (!$column["is_checkbox_action_column"])
1400  {
1401  $this->tpl->setVariable("TBL_HEADER_CELL_NO_LINK",
1402  $column["text"]);
1403  }
1404  else
1405  {
1406  $this->tpl->setVariable("TBL_HEADER_CELL_NO_LINK",
1407  ilUtil::img(ilUtil::getImagePath("spacer.png"), $lng->txt("action")));
1408  }
1409  $this->tpl->setVariable("HEAD_CELL_NL_ID", "thc_".$this->getId()."_".$ccnt);
1410 
1411  if ($column["class"] != "")
1412  {
1413  $this->tpl->setVariable("TBL_HEADER_CLASS"," " . $column["class"]);
1414  }
1415  $this->tpl->parseCurrentBlock();
1416  $this->tpl->touchBlock("tbl_header_th");
1417  continue;
1418  }
1419  if (($column["sort_field"] == $this->order_field) && ($this->order_direction != ""))
1420  {
1421  $this->tpl->setCurrentBlock("tbl_order_image");
1422  if ($this->order_direction == "asc")
1423  {
1424  $this->tpl->setVariable("ORDER_CLASS", "glyphicon glyphicon-arrow-up");
1425  }
1426  else
1427  {
1428  $this->tpl->setVariable("ORDER_CLASS", "glyphicon glyphicon-arrow-down");
1429  }
1430  $this->tpl->setVariable("IMG_ORDER_ALT", $this->lng->txt("change_sort_direction"));
1431  $this->tpl->parseCurrentBlock();
1432  }
1433 
1434  $this->tpl->setCurrentBlock("tbl_header_cell");
1435  $this->tpl->setVariable("TBL_HEADER_CELL", $column["text"]);
1436  $this->tpl->setVariable("HEAD_CELL_ID", "thc_".$this->getId()."_".$ccnt);
1437 
1438  // only set width if a value is given for that column
1439  if ($column["width"] != "")
1440  {
1441  $this->tpl->setVariable("TBL_COLUMN_WIDTH"," width=\"".$column["width"]."\"");
1442  }
1443 
1444  $lng_sort_column = $this->lng->txt("sort_by_this_column");
1445  $this->tpl->setVariable("TBL_ORDER_ALT",$lng_sort_column);
1446 
1447  $order_dir = "asc";
1448 
1449  if ($column["sort_field"] == $this->order_field)
1450  {
1451  $order_dir = $this->sort_order;
1452 
1453  $lng_change_sort = $this->lng->txt("change_sort_direction");
1454  $this->tpl->setVariable("TBL_ORDER_ALT",$lng_change_sort);
1455  }
1456 
1457  if ($column["class"] != "")
1458  {
1459  $this->tpl->setVariable("TBL_HEADER_CLASS"," " . $column["class"]);
1460  }
1461  $this->setOrderLink($column["sort_field"], $order_dir);
1462  $this->tpl->parseCurrentBlock();
1463  $this->tpl->touchBlock("tbl_header_th");
1464  }
1465 
1466  $this->tpl->setCurrentBlock("tbl_header");
1467  $this->tpl->parseCurrentBlock();
1468  }
1469 
1473  protected function prepareOutput()
1474  {
1475  }
1476 
1477 
1481  function determineOffsetAndOrder($a_omit_offset = false)
1482  {
1483  global $ilUser;
1484 
1485  if ($this->nav_determined)
1486  {
1487  return true;
1488  }
1489 
1490  if ($_POST[$this->getNavParameter()."1"] != "")
1491  {
1492  if ($_POST[$this->getNavParameter()."1"] != $_POST[$this->getNavParameter()])
1493  {
1494  $this->nav_value = $_POST[$this->getNavParameter()."1"];
1495  }
1496  else if ($_POST[$this->getNavParameter()."2"] != $_POST[$this->getNavParameter()])
1497  {
1498  $this->nav_value = $_POST[$this->getNavParameter()."2"];
1499  }
1500  }
1501  elseif($_GET[$this->getNavParameter()])
1502  {
1503  $this->nav_value = $_GET[$this->getNavParameter()];
1504  }
1505  elseif($_SESSION[$this->getNavParameter()] != "")
1506  {
1507  $this->nav_value = $_SESSION[$this->getNavParameter()];
1508  }
1509 
1510  if ($this->nav_value == "" && $this->getId() != "" && $ilUser->getId() != ANONYMOUS_USER_ID)
1511  {
1512  $order = $this->loadProperty("order");
1513  if (in_array($order, $this->sortable_fields))
1514  {
1515  $direction = $this->loadProperty("direction");
1516  }
1517  else
1518  {
1519  $direction = $this->getDefaultOrderDirection();
1520  }
1521  // get order and direction from db
1522  $this->nav_value =
1523  $order.":".
1524  $direction.":".
1525  $this->loadProperty("offset");
1526  }
1527  $nav = explode(":", $this->nav_value);
1528 
1529  // $nav[0] is order by
1530  $this->setOrderField(($nav[0] != "") ? $nav[0] : $this->getDefaultOrderField());
1531  $this->setOrderDirection(($nav[1] != "") ? $nav[1] : $this->getDefaultOrderDirection());
1532 
1533  if (!$a_omit_offset)
1534  {
1535  // #8904: offset must be discarded when no limit is given
1536  if(!$this->getExternalSegmentation() && $this->limit_determined && $this->limit == 9999)
1537  {
1538  $this->resetOffset(true);
1539  }
1540  else if (!$this->getExternalSegmentation() && $nav[2] >= $this->max_count)
1541  {
1542  $this->resetOffset(true);
1543  }
1544  else
1545  {
1546  $this->setOffset($nav[2]);
1547  }
1548  }
1549 
1550  if (!$a_omit_offset)
1551  {
1552  $this->nav_determined = true;
1553  }
1554  }
1555 
1557  {
1558  if ($this->getOrderField() != "")
1559  {
1560  $this->storeProperty("order", $this->getOrderField());
1561  }
1562  if ($this->getOrderDirection() != "")
1563  {
1564  $this->storeProperty("direction", $this->getOrderDirection());
1565  }
1566 //echo "-".$this->getOffset()."-";
1567  if ($this->getOffset() !== "")
1568  {
1569  $this->storeProperty("offset", $this->getOffset());
1570  }
1571  }
1572 
1573 
1577  public function getHTML()
1578  {
1579  global $lng, $ilCtrl, $ilUser;
1580 
1581  if($this->getExportMode())
1582  {
1583  $this->exportData($this->getExportMode(), true);
1584  }
1585 
1586  $this->prepareOutput();
1587 
1588  if (is_object($ilCtrl) && $this->getId() == "")
1589  {
1590  $ilCtrl->saveParameter($this->getParentObject(), $this->getNavParameter());
1591  }
1592 
1593  if(!$this->getPrintMode())
1594  {
1595  // set form action
1596  if ($this->form_action != "" && $this->getOpenFormTag())
1597  {
1598  $hash = "";
1599  if (is_object($ilUser) && $ilUser->getPref("screen_reader_optimization"))
1600  {
1601  $hash = "#".$this->getTopAnchor();
1602  }
1603 
1604  if((bool)$this->form_multipart)
1605  {
1606  $this->tpl->touchBlock("form_multipart_bl");
1607  }
1608 
1609  if($this->getPreventDoubleSubmission())
1610  {
1611  $this->tpl->touchBlock("pdfs");
1612  }
1613 
1614  $this->tpl->setCurrentBlock("tbl_form_header");
1615  $this->tpl->setVariable("FORMACTION", $this->getFormAction().$hash);
1616  $this->tpl->setVariable("FORMNAME", $this->getFormName());
1617  $this->tpl->parseCurrentBlock();
1618  }
1619 
1620  if ($this->form_action != "" && $this->getCloseFormTag())
1621  {
1622  $this->tpl->touchBlock("tbl_form_footer");
1623  }
1624  }
1625 
1626  if(!$this->enabled['content'])
1627  {
1628  return $this->render();
1629  }
1630 
1631  if (!$this->getExternalSegmentation())
1632  {
1633  $this->setMaxCount(count($this->row_data));
1634  }
1635 
1636  $this->determineOffsetAndOrder();
1637 
1638  $this->setFooter("tblfooter",$this->lng->txt("previous"),$this->lng->txt("next"));
1639 
1640  $data = $this->getData();
1641  if($this->dataExists())
1642  {
1643  // sort
1644  if (!$this->getExternalSorting() && $this->enabled["sort"])
1645  {
1646  $data = ilUtil::sortArray($data, $this->getOrderField(),
1647  $this->getOrderDirection(), $this->numericOrdering($this->getOrderField()));
1648  }
1649 
1650  // slice
1651  if (!$this->getExternalSegmentation())
1652  {
1653  $data = array_slice($data, $this->getOffset(), $this->getLimit());
1654  }
1655  }
1656 
1657  // fill rows
1658  if($this->dataExists())
1659  {
1660  if($this->getPrintMode())
1661  {
1663  }
1664 
1665  $this->tpl->addBlockFile("TBL_CONTENT", "tbl_content", $this->row_template,
1666  $this->row_template_dir);
1667 
1668  foreach($data as $set)
1669  {
1670  $this->tpl->setCurrentBlock("tbl_content");
1671  $this->css_row = ($this->css_row != "tblrow1")
1672  ? "tblrow1"
1673  : "tblrow2";
1674  $this->tpl->setVariable("CSS_ROW", $this->css_row);
1675 
1676  $this->fillRow($set);
1677  $this->tpl->setCurrentBlock("tbl_content");
1678  $this->tpl->parseCurrentBlock();
1679  }
1680  }
1681  else
1682  {
1683  // add standard no items text (please tell me, if it messes something up, alex, 29.8.2008)
1684  $no_items_text = (trim($this->getNoEntriesText()) != '')
1685  ? $this->getNoEntriesText()
1686  : $lng->txt("no_items");
1687 
1688  $this->css_row = ($this->css_row != "tblrow1")
1689  ? "tblrow1"
1690  : "tblrow2";
1691 
1692  $this->tpl->setCurrentBlock("tbl_no_entries");
1693  $this->tpl->setVariable('TBL_NO_ENTRY_CSS_ROW', $this->css_row);
1694  $this->tpl->setVariable('TBL_NO_ENTRY_COLUMN_COUNT', $this->column_count);
1695  $this->tpl->setVariable('TBL_NO_ENTRY_TEXT', trim($no_items_text));
1696  $this->tpl->parseCurrentBlock();
1697  }
1698 
1699 
1700  if(!$this->getPrintMode())
1701  {
1702  $this->fillFooter();
1703 
1704  $this->fillHiddenRow();
1705 
1706  $this->fillActionRow();
1707 
1708  $this->storeNavParameter();
1709  }
1710 
1711  return $this->render();
1712  }
1713 
1719  function numericOrdering($a_field)
1720  {
1721  return false;
1722  }
1723 
1728  function render()
1729  {
1730  global $lng, $ilCtrl;
1731 
1732  $this->tpl->setVariable("CSS_TABLE",$this->getStyle("table"));
1733  $this->tpl->setVariable("DATA_TABLE", (int) $this->getIsDataTable());
1734  if ($this->getId() != "")
1735  {
1736  $this->tpl->setVariable("ID", 'id="'.$this->getId().'"');
1737  }
1738 
1739  // description
1740  if ($this->getDescription() != "")
1741  {
1742  $this->tpl->setCurrentBlock("tbl_header_description");
1743  $this->tpl->setVariable("TBL_DESCRIPTION", $this->getDescription());
1744  $this->tpl->parseCurrentBlock();
1745  }
1746 
1747  if(!$this->getPrintMode())
1748  {
1749  $this->renderFilter();
1750  }
1751 
1752  if ($this->getDisplayAsBlock())
1753  {
1754  $this->tpl->touchBlock("outer_start_1");
1755  $this->tpl->touchBlock("outer_end_1");
1756  }
1757  else
1758  {
1759  $this->tpl->touchBlock("outer_start_2");
1760  $this->tpl->touchBlock("outer_end_2");
1761  }
1762 
1763  // table title and icon
1764  if ($this->enabled["title"] && ($this->title != ""
1765  || $this->icon != "" || count($this->header_commands) > 0 ||
1766  $this->headerHTML != "" || $this->close_command != ""))
1767  {
1768  if ($this->enabled["icon"])
1769  {
1770  $this->tpl->setCurrentBlock("tbl_header_title_icon");
1771  $this->tpl->setVariable("TBL_TITLE_IMG",ilUtil::getImagePath($this->icon));
1772  $this->tpl->setVariable("TBL_TITLE_IMG_ALT",$this->icon_alt);
1773  $this->tpl->parseCurrentBlock();
1774  }
1775 
1776  if(!$this->getPrintMode())
1777  {
1778  foreach($this->header_commands as $command)
1779  {
1780  if ($command["img"] != "")
1781  {
1782  $this->tpl->setCurrentBlock("tbl_header_img_link");
1783  if ($command["target"] != "")
1784  {
1785  $this->tpl->setVariable("TARGET_IMG_LINK",
1786  'target="'.$command["target"].'"');
1787  }
1788  $this->tpl->setVariable("ALT_IMG_LINK", $command["text"]);
1789  $this->tpl->setVariable("HREF_IMG_LINK", $command["href"]);
1790  $this->tpl->setVariable("SRC_IMG_LINK",
1791  $command["img"]);
1792  $this->tpl->parseCurrentBlock();
1793  }
1794  else
1795  {
1796  $this->tpl->setCurrentBlock("head_cmd");
1797  $this->tpl->setVariable("TXT_HEAD_CMD", $command["text"]);
1798  $this->tpl->setVariable("HREF_HEAD_CMD", $command["href"]);
1799  $this->tpl->parseCurrentBlock();
1800  }
1801  }
1802  }
1803 
1804  if (isset ($this->headerHTML)) {
1805  $this->tpl->setCurrentBlock("tbl_header_html");
1806  $this->tpl->setVariable ("HEADER_HTML", $this->headerHTML);
1807  $this->tpl->parseCurrentBlock();
1808  }
1809 
1810  // close command
1811  if ($this->close_command != "")
1812  {
1813  $this->tpl->setCurrentBlock("tbl_header_img_link");
1814  $this->tpl->setVariable("ALT_IMG_LINK",$lng->txt("close"));
1815  $this->tpl->setVariable("HREF_IMG_LINK",$this->close_command);
1816  $this->tpl->parseCurrentBlock();
1817  }
1818 
1819  $this->tpl->setCurrentBlock("tbl_header_title");
1820  $this->tpl->setVariable("TBL_TITLE",$this->title);
1821  $this->tpl->setVariable("TOP_ANCHOR",$this->getTopAnchor());
1822  if ($this->getDisplayAsBlock())
1823  {
1824  $this->tpl->setVariable("BLK_CLASS", "Block");
1825  }
1826  $this->tpl->parseCurrentBlock();
1827  }
1828 
1829  // table header
1830  if ($this->enabled["header"])
1831  {
1832  $this->fillHeader();
1833  }
1834 
1835  $this->tpl->touchBlock("tbl_table_end");
1836 
1837  return $this->tpl->get();
1838  }
1839 
1843  private function renderFilter()
1844  {
1845  global $lng, $tpl;
1846 
1847  $filter = $this->getFilterItems();
1848  $opt_filter = $this->getFilterItems(true);
1849 
1850  $tpl->addJavascript("./Services/Table/js/ServiceTable.js");
1851 
1852  if (count($filter) == 0 && count($opt_filter) == 0)
1853  {
1854  return;
1855  }
1856 
1857  include_once("./Services/YUI/classes/class.ilYuiUtil.php");
1859 
1860  $ccnt = 0;
1861 
1862  // render standard filter
1863  if (count($filter) > 0)
1864  {
1865  foreach ($filter as $item)
1866  {
1867  if ($ccnt >= $this->getFilterCols())
1868  {
1869  $this->tpl->setCurrentBlock("filter_row");
1870  $this->tpl->parseCurrentBlock();
1871  $ccnt = 0;
1872  }
1873  $this->tpl->setCurrentBlock("filter_item");
1874  $this->tpl->setVariable("OPTION_NAME",
1875  $item->getTitle());
1876  $this->tpl->setVariable("F_INPUT_ID",
1877  $item->getFieldId());
1878  $this->tpl->setVariable("INPUT_HTML",
1879  $item->getTableFilterHTML());
1880  $this->tpl->parseCurrentBlock();
1881  $ccnt++;
1882  }
1883  }
1884 
1885  // render optional filter
1886  if (count($opt_filter) > 0)
1887  {
1888  $this->determineSelectedFilters();
1889 
1890  foreach ($opt_filter as $item)
1891  {
1892  if($this->isFilterSelected($item->getPostVar()))
1893  {
1894  if ($ccnt >= $this->getFilterCols())
1895  {
1896  $this->tpl->setCurrentBlock("filter_row");
1897  $this->tpl->parseCurrentBlock();
1898  $ccnt = 0;
1899  }
1900  $this->tpl->setCurrentBlock("filter_item");
1901  $this->tpl->setVariable("OPTION_NAME",
1902  $item->getTitle());
1903  $this->tpl->setVariable("F_INPUT_ID",
1904  $item->getFieldId());
1905  $this->tpl->setVariable("INPUT_HTML",
1906  $item->getTableFilterHTML());
1907  $this->tpl->parseCurrentBlock();
1908  $ccnt++;
1909  }
1910  }
1911 
1912  // filter selection
1913  $items = array();
1914  foreach ($opt_filter as $item)
1915  {
1916  $k = $item->getPostVar();
1917  $items[$k] = array("txt" => $item->getTitle(),
1918  "selected" => $this->isFilterSelected($k));
1919  }
1920 
1921  include_once("./Services/UIComponent/CheckboxListOverlay/classes/class.ilCheckboxListOverlayGUI.php");
1922  $cb_over = new ilCheckboxListOverlayGUI("tbl_filters_".$this->getId());
1923  $cb_over->setLinkTitle($lng->txt("optional_filters"));
1924  $cb_over->setItems($items);
1925 
1926  $cb_over->setFormCmd($this->getParentCmd());
1927  $cb_over->setFieldVar("tblff".$this->getId());
1928  $cb_over->setHiddenVar("tblfsf".$this->getId());
1929 
1930  $cb_over->setSelectionHeaderClass("ilTableMenuItem");
1931  $this->tpl->setCurrentBlock("filter_select");
1932 
1933  // apply should be the first submit because of enter/return, inserting hidden submit
1934  $this->tpl->setVariable("HIDDEN_CMD_APPLY", $this->filter_cmd);
1935 
1936  $this->tpl->setVariable("FILTER_SELECTOR", $cb_over->getHTML());
1937  $this->tpl->parseCurrentBlock();
1938  }
1939 
1940  // if any filter
1941  if($ccnt > 0 || count($opt_filter) > 0)
1942  {
1943  $this->tpl->setVariable("TXT_FILTER", $lng->txt("filter"));
1944 
1945  if($ccnt > 0)
1946  {
1947  if ($ccnt < $this->getFilterCols())
1948  {
1949  for($i = $ccnt; $i<=$this->getFilterCols(); $i++)
1950  {
1951  $this->tpl->touchBlock("filter_empty_cell");
1952  }
1953  }
1954  $this->tpl->setCurrentBlock("filter_row");
1955  $this->tpl->parseCurrentBlock();
1956 
1957  $this->tpl->setCurrentBlock("filter_buttons");
1958  $this->tpl->setVariable("CMD_APPLY", $this->filter_cmd);
1959  $this->tpl->setVariable("TXT_APPLY", $this->filter_cmd_txt
1960  ? $this->filter_cmd_txt
1961  : $lng->txt("apply_filter"));
1962  $this->tpl->setVariable("CMD_RESET", $this->reset_cmd);
1963  $this->tpl->setVariable("TXT_RESET", $this->reset_cmd_txt
1964  ? $this->reset_cmd_txt
1965  : $lng->txt("reset_filter"));
1966  }
1967  else if(count($opt_filter) > 0)
1968  {
1969  $this->tpl->setCurrentBlock("optional_filter_hint");
1970  $this->tpl->setVariable('TXT_OPT_HINT', $lng->txt('optional_filter_hint'));
1971  $this->tpl->parseCurrentBlock();
1972  }
1973 
1974  $this->tpl->setCurrentBlock("filter_section");
1975  $this->tpl->setVariable("FIL_ID", $this->getId());
1976  $this->tpl->parseCurrentBlock();
1977 
1978  // (keep) filter hidden?
1979  if ($this->loadProperty("filter") != 1)
1980  {
1981  if (!$this->getDisableFilterHiding())
1982  {
1983  $this->tpl->setCurrentBlock("filter_hidden");
1984  $this->tpl->setVariable("FI_ID", $this->getId());
1985  $this->tpl->parseCurrentBlock();
1986  }
1987  }
1988  }
1989  }
1990 
1994  public function writeFilterToSession()
1995  {
1996  global $lng;
1997 
1998  $filter = $this->getFilterItems();
1999  $opt_filter = $this->getFilterItems(true);
2000 
2001  foreach ($filter as $item)
2002  {
2003  if ($item->checkInput())
2004  {
2005  $item->setValueByArray($_POST);
2006  $item->writeToSession();
2007  }
2008  }
2009  foreach ($opt_filter as $item)
2010  {
2011  if ($item->checkInput())
2012  {
2013  $item->setValueByArray($_POST);
2014  $item->writeToSession();
2015  }
2016  }
2017 
2018  // #13209
2019  unset($_REQUEST["tbltplcrt"]);
2020  unset($_REQUEST["tbltpldel"]);
2021  }
2022 
2026  public function resetFilter()
2027  {
2028  global $lng;
2029 
2030  $filter = $this->getFilterItems();
2031  $opt_filter = $this->getFilterItems(true);
2032 
2033  foreach ($filter as $item)
2034  {
2035  if ($item->checkInput())
2036  {
2037  $item->setValueByArray($_POST);
2038  $item->clearFromSession();
2039  }
2040  }
2041  foreach ($opt_filter as $item)
2042  {
2043  if ($item->checkInput())
2044  {
2045  $item->setValueByArray($_POST);
2046  $item->clearFromSession();
2047  }
2048  }
2049 
2050  // #13209
2051  unset($_REQUEST["tbltplcrt"]);
2052  unset($_REQUEST["tbltpldel"]);
2053  }
2054 
2061  protected function fillRow($a_set)
2062  {
2063  foreach ($a_set as $key => $value)
2064  {
2065  $this->tpl->setVariable("VAL_".strtoupper($key), $value);
2066  }
2067  }
2068 
2072  function fillFooter()
2073  {
2074  global $lng, $ilCtrl, $ilUser;
2075 
2076  $footer = false;
2077 
2078  // select all checkbox
2079  if ((strlen($this->getFormName())) && (strlen($this->getSelectAllCheckbox())) && $this->dataExists())
2080  {
2081  $this->tpl->setCurrentBlock("select_all_checkbox");
2082  $this->tpl->setVariable("SELECT_ALL_TXT_SELECT_ALL", $lng->txt("select_all"));
2083  $this->tpl->setVariable("SELECT_ALL_CHECKBOX_NAME", $this->getSelectAllCheckbox());
2084  $this->tpl->setVariable("SELECT_ALL_FORM_NAME", $this->getFormName());
2085  $this->tpl->setVariable("CHECKBOXNAME", "chb_select_all_" . $this->unique_id);
2086  $this->tpl->parseCurrentBlock();
2087  }
2088 
2089  // table footer numinfo
2090  if ($this->enabled["numinfo"] && $this->enabled["footer"])
2091  {
2092  $start = $this->offset + 1; // compute num info
2093  if (!$this->dataExists())
2094  {
2095  $start = 0;
2096  }
2097  $end = $this->offset + $this->limit;
2098 
2099  if ($end > $this->max_count or $this->limit == 0)
2100  {
2101  $end = $this->max_count;
2102  }
2103 
2104  if ($this->max_count > 0)
2105  {
2106  if ($this->lang_support)
2107  {
2108  $numinfo = "(".$start." - ".$end." ".strtolower($this->lng->txt("of"))." ".$this->max_count.")";
2109  }
2110  else
2111  {
2112  $numinfo = "(".$start." - ".$end." of ".$this->max_count.")";
2113  }
2114  }
2115  if ($this->max_count > 0)
2116  {
2117  if ($this->getEnableNumInfo())
2118  {
2119  $this->tpl->setCurrentBlock("tbl_footer_numinfo");
2120  $this->tpl->setVariable("NUMINFO", $numinfo);
2121  $this->tpl->parseCurrentBlock();
2122  }
2123  }
2124  $footer = true;
2125  }
2126 
2127  // table footer linkbar
2128  if ($this->enabled["linkbar"] && $this->enabled["footer"] && $this->limit != 0
2129  && $this->max_count > 0)
2130  {
2131  $layout = array(
2132  "link" => $this->footer_style,
2133  "prev" => $this->footer_previous,
2134  "next" => $this->footer_next,
2135  );
2136  //if (!$this->getDisplayAsBlock())
2137  //{
2138  $linkbar = $this->getLinkbar("1");
2139  $this->tpl->setCurrentBlock("tbl_footer_linkbar");
2140  $this->tpl->setVariable("LINKBAR", $linkbar);
2141  $this->tpl->parseCurrentBlock();
2142  $linkbar = true;
2143  //}
2144  $footer = true;
2145  }
2146 
2147  // column selector
2148  if (count($this->getSelectableColumns()) > 0)
2149  {
2150  $items = array();
2151  foreach ($this->getSelectableColumns() as $k => $c)
2152  {
2153  $items[$k] = array("txt" => $c["txt"],
2154  "selected" => $this->isColumnSelected($k));
2155  }
2156  include_once("./Services/UIComponent/CheckboxListOverlay/classes/class.ilCheckboxListOverlayGUI.php");
2157  $cb_over = new ilCheckboxListOverlayGUI("tbl_".$this->getId());
2158  $cb_over->setLinkTitle($lng->txt("columns"));
2159  $cb_over->setItems($items);
2160  //$cb_over->setUrl("./ilias.php?baseClass=ilTablePropertiesStorage&table_id=".
2161  // $this->getId()."&cmd=saveSelectedFields&user_id=".$ilUser->getId());
2162  $cb_over->setFormCmd($this->getParentCmd());
2163  $cb_over->setFieldVar("tblfs".$this->getId());
2164  $cb_over->setHiddenVar("tblfsh".$this->getId());
2165  $cb_over->setSelectionHeaderClass("ilTableMenuItem");
2166  $column_selector = $cb_over->getHTML();
2167  $footer = true;
2168  }
2169 
2170  if($this->getShowTemplates() && is_object($ilUser))
2171  {
2172  // template handling
2173  if(isset($_REQUEST["tbltplcrt"]) && $_REQUEST["tbltplcrt"])
2174  {
2175  if($this->saveTemplate($_REQUEST["tbltplcrt"]))
2176  {
2177  ilUtil::sendSuccess($lng->txt("tbl_template_created"));
2178  }
2179  }
2180  else if(isset($_REQUEST["tbltpldel"]) && $_REQUEST["tbltpldel"])
2181  {
2182  if($this->deleteTemplate($_REQUEST["tbltpldel"]))
2183  {
2184  ilUtil::sendSuccess($lng->txt("tbl_template_deleted"));
2185  }
2186  }
2187 
2188  $create_id = "template_create_overlay_".$this->getId();
2189  $delete_id = "template_delete_overlay_".$this->getId();
2190  $list_id = "template_stg_".$this->getId();
2191 
2192  include_once("./Services/Table/classes/class.ilTableTemplatesStorage.php");
2193  $storage = new ilTableTemplatesStorage();
2194  $templates = $storage->getNames($this->getContext(), $ilUser->getId());
2195 
2196  include_once("./Services/UIComponent/Overlay/classes/class.ilOverlayGUI.php");
2197 
2198  // form to delete template
2199  if(sizeof($templates))
2200  {
2201  $overlay = new ilOverlayGUI($delete_id);
2202  $overlay->setTrigger($list_id."_delete");
2203  $overlay->setAnchor("ilAdvSelListAnchorElement_".$list_id);
2204  $overlay->setAutoHide(false);
2205  $overlay->add();
2206 
2207  $lng->loadLanguageModule("form");
2208  $this->tpl->setCurrentBlock("template_editor_delete_item");
2209  $this->tpl->setVariable("TEMPLATE_DELETE_OPTION_VALUE", "");
2210  $this->tpl->setVariable("TEMPLATE_DELETE_OPTION", "- ".$lng->txt("form_please_select")." -");
2211  $this->tpl->parseCurrentBlock();
2212  foreach($templates as $name)
2213  {
2214  $this->tpl->setVariable("TEMPLATE_DELETE_OPTION_VALUE", $name);
2215  $this->tpl->setVariable("TEMPLATE_DELETE_OPTION", $name);
2216  $this->tpl->parseCurrentBlock();
2217  }
2218 
2219  $this->tpl->setCurrentBlock("template_editor_delete");
2220  $this->tpl->setVariable("TEMPLATE_DELETE_ID", $delete_id);
2221  $this->tpl->setVariable("TXT_TEMPLATE_DELETE", $lng->txt("tbl_template_delete"));
2222  $this->tpl->setVariable("TXT_TEMPLATE_DELETE_SUBMIT", $lng->txt("delete"));
2223  $this->tpl->setVariable("TEMPLATE_DELETE_CMD", $this->parent_cmd);
2224  $this->tpl->parseCurrentBlock();
2225  }
2226 
2227 
2228  // form to save new template
2229  $overlay = new ilOverlayGUI($create_id);
2230  $overlay->setTrigger($list_id."_create");
2231  $overlay->setAnchor("ilAdvSelListAnchorElement_".$list_id);
2232  $overlay->setAutoHide(false);
2233  $overlay->add();
2234 
2235  $this->tpl->setCurrentBlock("template_editor");
2236  $this->tpl->setVariable("TEMPLATE_CREATE_ID", $create_id);
2237  $this->tpl->setVariable("TXT_TEMPLATE_CREATE", $lng->txt("tbl_template_create"));
2238  $this->tpl->setVariable("TXT_TEMPLATE_CREATE_SUBMIT", $lng->txt("save"));
2239  $this->tpl->setVariable("TEMPLATE_CREATE_CMD", $this->parent_cmd);
2240  $this->tpl->parseCurrentBlock();
2241 
2242  // load saved template
2243  include_once("./Services/UIComponent/AdvancedSelectionList/classes/class.ilAdvancedSelectionListGUI.php");
2244  $alist = new ilAdvancedSelectionListGUI();
2245  $alist->setId($list_id);
2246  $alist->addItem($lng->txt("tbl_template_create"), "create", "#");
2247  if(sizeof($templates))
2248  {
2249  $alist->addItem($lng->txt("tbl_template_delete"), "delete", "#");
2250  foreach($templates as $name)
2251  {
2252  $ilCtrl->setParameter($this->parent_obj, $this->prefix."_tpl", urlencode($name));
2253  $alist->addItem($name, $name, $ilCtrl->getLinkTarget($this->parent_obj, $this->parent_cmd));
2254  $ilCtrl->setParameter($this->parent_obj, $this->prefix."_tpl", "");
2255  }
2256  }
2257  $alist->setListTitle($lng->txt("tbl_templates"));
2259  $this->tpl->setVariable("TEMPLATE_SELECTOR", "&nbsp;".$alist->getHTML());
2260  }
2261 
2262  if ($footer)
2263  {
2264  $this->tpl->setCurrentBlock("tbl_footer");
2265  $this->tpl->setVariable("COLUMN_COUNT", $this->getColumnCount());
2266  if ($this->getDisplayAsBlock())
2267  {
2268  $this->tpl->setVariable("BLK_CLASS", "Block");
2269  }
2270  $this->tpl->parseCurrentBlock();
2271 
2272  // top navigation, if number info or linkbar given
2273  if ($numinfo != "" || $linkbar != "" || $column_selector != "" ||
2274  count($this->filters) > 0 || count($this->optional_filters) > 0)
2275  {
2276  if (is_object($ilUser) && (count($this->filters) || count($this->optional_filters)))
2277  {
2278  $this->tpl->setCurrentBlock("filter_activation");
2279  $this->tpl->setVariable("TXT_ACTIVATE_FILTER", $lng->txt("show_filter"));
2280  $this->tpl->setVariable("FILA_ID", $this->getId());
2281  if ($this->getId() != "")
2282  {
2283  $this->tpl->setVariable("SAVE_URLA", "./ilias.php?baseClass=ilTablePropertiesStorage&table_id=".
2284  $this->getId()."&cmd=showFilter&user_id=".$ilUser->getId());
2285  }
2286  $this->tpl->parseCurrentBlock();
2287 
2288 
2289  if (!$this->getDisableFilterHiding())
2290  {
2291  $this->tpl->setCurrentBlock("filter_deactivation");
2292  $this->tpl->setVariable("TXT_HIDE", $lng->txt("hide_filter"));
2293  if ($this->getId() != "")
2294  {
2295  $this->tpl->setVariable("SAVE_URL", "./ilias.php?baseClass=ilTablePropertiesStorage&table_id=".
2296  $this->getId()."&cmd=hideFilter&user_id=".$ilUser->getId());
2297  $this->tpl->setVariable("FILD_ID", $this->getId());
2298  }
2299  $this->tpl->parseCurrentBlock();
2300  }
2301 
2302  }
2303 
2304  if ($numinfo != "" && $this->getEnableNumInfo())
2305  {
2306  $this->tpl->setCurrentBlock("top_numinfo");
2307  $this->tpl->setVariable("NUMINFO", $numinfo);
2308  $this->tpl->parseCurrentBlock();
2309  }
2310  if ($linkbar != "" && !$this->getDisplayAsBlock())
2311  {
2312  $linkbar = $this->getLinkbar("2");
2313  $this->tpl->setCurrentBlock("top_linkbar");
2314  $this->tpl->setVariable("LINKBAR", $linkbar);
2315  $this->tpl->parseCurrentBlock();
2316  }
2317 
2318  // column selector
2319  $this->tpl->setVariable("COLUMN_SELECTOR", $column_selector);
2320 
2321  // row selector
2322  if ($this->getShowRowsSelector() &&
2323  is_object($ilUser) &&
2324  $this->getId() &&
2325  $this->getLimit() < 9999) // JF, 2014-10-27
2326  {
2327  include_once("./Services/UIComponent/AdvancedSelectionList/classes/class.ilAdvancedSelectionListGUI.php");
2328  $alist = new ilAdvancedSelectionListGUI();
2330  $alist->setId("sellst_rows_".$this->getId());
2331  $hpp = ($ilUser->getPref("hits_per_page") != 9999)
2332  ? $ilUser->getPref("hits_per_page")
2333  : $lng->txt("unlimited");
2334 
2335  $options = array(0 => $lng->txt("default")." (".$hpp.")",5 => 5, 10 => 10, 15 => 15, 20 => 20,
2336  30 => 30, 40 => 40, 50 => 50,
2337  100 => 100, 200 => 200, 400 => 400, 800 => 800);
2338  foreach ($options as $k => $v)
2339  {
2340  $ilCtrl->setParameter($this->parent_obj, $this->prefix."_trows", $k);
2341  $alist->addItem($v, $k, $ilCtrl->getLinkTarget($this->parent_obj, $this->parent_cmd));
2342  $ilCtrl->setParameter($this->parent_obj, $this->prefix."_trows", "");
2343  }
2344  $alist->setListTitle($this->getRowSelectorLabel() ? $this->getRowSelectorLabel() : $lng->txt("rows"));
2345  $this->tpl->setVariable("ROW_SELECTOR", $alist->getHTML());
2346  }
2347 
2348  // export
2349  if(sizeof($this->export_formats) && $this->dataExists())
2350  {
2351  include_once("./Services/UIComponent/AdvancedSelectionList/classes/class.ilAdvancedSelectionListGUI.php");
2352  $alist = new ilAdvancedSelectionListGUI();
2354  $alist->setId("sellst_xpt");
2355  foreach($this->export_formats as $format => $caption_lng_id)
2356  {
2357  $ilCtrl->setParameter($this->parent_obj, $this->prefix."_xpt", $format);
2358  $url = $ilCtrl->getLinkTarget($this->parent_obj, $this->parent_cmd);
2359  $ilCtrl->setParameter($this->parent_obj, $this->prefix."_xpt", "");
2360  $alist->addItem($lng->txt($caption_lng_id), $format, $url);
2361  }
2362  $alist->setListTitle($lng->txt("export"));
2363  $this->tpl->setVariable("EXPORT_SELECTOR", "&nbsp;".$alist->getHTML());
2364  }
2365 
2366  $this->tpl->setCurrentBlock("top_navigation");
2367  $this->tpl->setVariable("COLUMN_COUNT", $this->getColumnCount());
2368  if ($this->getDisplayAsBlock())
2369  {
2370  $this->tpl->setVariable("BLK_CLASS", "Block");
2371  }
2372  $this->tpl->parseCurrentBlock();
2373  }
2374  }
2375  }
2376 
2384  function getLinkbar($a_num)
2385  {
2386  global $ilCtrl, $lng, $ilUser;
2387 
2388  $hash = "";
2389  if (is_object($ilUser) && $ilUser->getPref("screen_reader_optimization"))
2390  {
2391  $hash = "#".$this->getTopAnchor();
2392  }
2393 
2394  $link = $ilCtrl->getLinkTargetByClass(get_class($this->parent_obj), $this->parent_cmd).
2395  "&".$this->getNavParameter()."=".
2396  $this->getOrderField().":".$this->getOrderDirection().":";
2397 
2398  $LinkBar = "";
2399  $layout_prev = $lng->txt("previous");
2400  $layout_next = $lng->txt("next");
2401 
2402  // if more entries then entries per page -> show link bar
2403  if ($this->max_count > $this->getLimit() || $this->custom_prev_next)
2404  {
2405  $sep = "<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>";
2406 
2407  // calculate number of pages
2408  $pages = intval($this->max_count / $this->getLimit());
2409 
2410  // add a page if a rest remains
2411  if (($this->max_count % $this->getLimit()))
2412  $pages++;
2413 
2414  // links to other pages
2415  $offset_arr = array();
2416  for ($i = 1 ;$i <= $pages ; $i++)
2417  {
2418  $newoffset = $this->getLimit() * ($i-1);
2419 
2420  $nav_value = $this->getOrderField().":".$this->getOrderDirection().":".$newoffset;
2421  $offset_arr[$nav_value] = $i;
2422  }
2423 
2424  $sep = "<span>&nbsp;&nbsp;&nbsp;&nbsp;</span>";
2425 
2426  // previous link
2427  if ($this->custom_prev_next && $this->custom_prev != "")
2428  {
2429  if ($LinkBar != "")
2430  $LinkBar .= $sep;
2431  $LinkBar .= "<a href=\"".$this->custom_prev.$hash."\">".$layout_prev."</a>";
2432  }
2433  else if ($this->getOffset() >= 1 && !$this->custom_prev_next)
2434  {
2435  if ($LinkBar != "")
2436  $LinkBar .= $sep;
2437  $prevoffset = $this->getOffset() - $this->getLimit();
2438  $LinkBar .= "<a href=\"".$link.$prevoffset.$hash."\">".$layout_prev."</a>";
2439  }
2440  else
2441  {
2442  if ($LinkBar != "")
2443  $LinkBar .= $sep;
2444  $LinkBar .= '<span class="ilTableFootLight">'.$layout_prev."</span>";
2445  }
2446 
2447  // current value
2448  if ($a_num == "1")
2449  {
2450  $LinkBar .= '<input type="hidden" name="'.$this->getNavParameter().
2451  '" value="'.$this->getOrderField().":".$this->getOrderDirection().":".$this->getOffset().'" />';
2452  }
2453 
2454  $sep = "<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>";
2455 
2456  // show next link (if not last page)
2457  if ($this->custom_prev_next && $this->custom_next != "")
2458  {
2459  if ($LinkBar != "")
2460  $LinkBar .= $sep;
2461  $LinkBar .= "<a href=\"".$this->custom_next.$hash."\">".$layout_next."</a>";
2462  }
2463  else if (! ( ($this->getOffset() / $this->getLimit())==($pages-1) ) && ($pages!=1) &&
2464  !$this->custom_prev_next)
2465  {
2466  if ($LinkBar != "")
2467  $LinkBar .= $sep;
2468  $newoffset = $this->getOffset() + $this->getLimit();
2469  $LinkBar .= "<a href=\"".$link.$newoffset.$hash."\">".$layout_next."</a>";
2470  }
2471  else
2472  {
2473  if ($LinkBar != "")
2474  $LinkBar .= $sep;
2475  $LinkBar .= '<span class="ilTableFootLight">'.$layout_next."</span>";
2476  }
2477 
2478  $sep = "<span>&nbsp;&nbsp;&nbsp;&nbsp;</span>";
2479 
2480  if (count($offset_arr) && !$this->getDisplayAsBlock() && !$this->custom_prev_next)
2481  {
2482  if ($LinkBar != "")
2483  $LinkBar .= $sep;
2484  $LinkBar .= "".
2485  '<label for="tab_page_sel_'.$a_num.'">'.$lng->txt("page").'</label> '.
2486  ilUtil::formSelect($this->nav_value,
2487  $this->getNavParameter().$a_num, $offset_arr, false, true, 0, "small",
2488  array("id" => "tab_page_sel_".$a_num,
2489  "onchange" => "ilTablePageSelection(this, 'cmd[".$this->parent_cmd."]')"));
2490  //' <input class="submit" type="submit" name="cmd['.$this->parent_cmd.']" value="'.
2491  //$lng->txt("ok").'" />';
2492  }
2493 
2494  return $LinkBar;
2495  }
2496  else
2497  {
2498  return false;
2499  }
2500  }
2501 
2502  function fillHiddenRow()
2503  {
2504  $hidden_row = false;
2505  if(count($this->hidden_inputs))
2506  {
2507  foreach ($this->hidden_inputs as $hidden_input)
2508  {
2509  $this->tpl->setCurrentBlock("tbl_hidden_field");
2510  $this->tpl->setVariable("FIELD_NAME", $hidden_input["name"]);
2511  $this->tpl->setVariable("FIELD_VALUE", $hidden_input["value"]);
2512  $this->tpl->parseCurrentBlock();
2513  }
2514 
2515  $this->tpl->setCurrentBlock("tbl_hidden_row");
2516  $this->tpl->parseCurrentBlock();
2517  }
2518  }
2519 
2523  function fillActionRow()
2524  {
2525  global $lng;
2526 
2527  // action row
2528  $action_row = false;
2529  $arrow = false;
2530 
2531  // add selection buttons
2532  if (count($this->sel_buttons) > 0)
2533  {
2534  foreach ($this->sel_buttons as $button)
2535  {
2536  $this->tpl->setCurrentBlock("sel_button");
2537  $this->tpl->setVariable("SBUTTON_SELECT",
2538  ilUtil::formSelect($button["selected"], $button["sel_var"],
2539  $button["options"], false, true));
2540  $this->tpl->setVariable("SBTN_NAME", $button["cmd"]);
2541  $this->tpl->setVariable("SBTN_VALUE", $button["text"]);
2542  $this->tpl->parseCurrentBlock();
2543 
2544  if ($this->getTopCommands())
2545  {
2546  $this->tpl->setCurrentBlock("sel_top_button");
2547  $this->tpl->setVariable("SBUTTON_SELECT",
2548  ilUtil::formSelect($button["selected"], $button["sel_var"],
2549  $button["options"], false, true));
2550  $this->tpl->setVariable("SBTN_NAME", $button["cmd"]);
2551  $this->tpl->setVariable("SBTN_VALUE", $button["text"]);
2552  $this->tpl->parseCurrentBlock();
2553  }
2554  }
2555  $buttons = true;
2556  $action_row = true;
2557  }
2558  $this->sel_buttons[] = array("options" => $a_options, "cmd" => $a_cmd, "text" => $a_text);
2559 
2560  // add buttons
2561  if (count($this->buttons) > 0)
2562  {
2563  foreach ($this->buttons as $button)
2564  {
2565  if(!is_array($button))
2566  {
2567  if($button instanceof ilButton)
2568  {
2569  $this->tpl->setVariable('BUTTON_OBJ', $button->render());
2570 
2571  // this will remove id - should be unique
2572  $button = clone $button;
2573 
2574  $this->tpl->setVariable('BUTTON_TOP_OBJ', $button->render());
2575  }
2576  continue;
2577  }
2578 
2579  if (strlen($button['onclick']))
2580  {
2581  $this->tpl->setCurrentBlock('cmdonclick');
2582  $this->tpl->setVariable('CMD_ONCLICK', $button['onclick']);
2583  $this->tpl->parseCurrentBlock();
2584  }
2585  $this->tpl->setCurrentBlock("plain_button");
2586  if ($button["id"] != "")
2587  {
2588  $this->tpl->setVariable("PBID", ' id="'.$button["id"].'" ');
2589  }
2590  if ($button["class"] != "")
2591  {
2592  $this->tpl->setVariable("PBBT_CLASS", ' '.$button["class"]);
2593  }
2594  $this->tpl->setVariable("PBTN_NAME", $button["cmd"]);
2595  $this->tpl->setVariable("PBTN_VALUE", $button["text"]);
2596  $this->tpl->parseCurrentBlock();
2597 
2598  if ($this->getTopCommands())
2599  {
2600  if (strlen($button['onclick']))
2601  {
2602  $this->tpl->setCurrentBlock('top_cmdonclick');
2603  $this->tpl->setVariable('CMD_ONCLICK', $button['onclick']);
2604  $this->tpl->parseCurrentBlock();
2605  }
2606  $this->tpl->setCurrentBlock("plain_top_button");
2607  $this->tpl->setVariable("PBTN_NAME", $button["cmd"]);
2608  $this->tpl->setVariable("PBTN_VALUE", $button["text"]);
2609  if ($button["class"] != "")
2610  {
2611  $this->tpl->setVariable("PBBT_CLASS", ' '.$button["class"]);
2612  }
2613  $this->tpl->parseCurrentBlock();
2614  }
2615  }
2616 
2617  $buttons = true;
2618  $action_row = true;
2619  }
2620 
2621  // multi selection
2622  if(count($this->mi_sel_buttons))
2623  {
2624  foreach ($this->mi_sel_buttons as $button)
2625  {
2626  $this->tpl->setCurrentBlock("mi_sel_button");
2627  $this->tpl->setVariable("MI_BUTTON_SELECT",
2628  ilUtil::formSelect($button["selected"], $button["sel_var"],
2629  $button["options"], false, true));
2630  $this->tpl->setVariable("MI_BTN_NAME", $button["cmd"]);
2631  $this->tpl->setVariable("MI_BTN_VALUE", $button["text"]);
2632  $this->tpl->parseCurrentBlock();
2633 
2634  if ($this->getTopCommands())
2635  {
2636  $this->tpl->setCurrentBlock("mi_top_sel_button");
2637  $this->tpl->setVariable("MI_BUTTON_SELECT",
2638  ilUtil::formSelect($button["selected"], $button["sel_var"]."_2",
2639  $button["options"], false, true));
2640  $this->tpl->setVariable("MI_BTN_NAME", $button["cmd"]);
2641  $this->tpl->setVariable("MI_BTN_VALUE", $button["text"]);
2642  $this->tpl->parseCurrentBlock();
2643  }
2644 
2645  }
2646  $arrow = true;
2647  $action_row = true;
2648  }
2649 
2650 
2651  if (count($this->multi) > 1 && $this->dataExists())
2652  {
2653  if($this->enable_command_for_all && $this->max_count <= self::getAllCommandLimit())
2654  {
2655  $this->tpl->setCurrentBlock("tbl_cmd_select_all");
2656  $this->tpl->setVariable("TXT_SELECT_CMD_ALL", $lng->txt("all_objects"));
2657  $this->tpl->parseCurrentBlock();
2658  }
2659 
2660  $this->tpl->setCurrentBlock("tbl_cmd_select");
2661  $sel = array();
2662  foreach ($this->multi as $mc)
2663  {
2664  $sel[$mc["cmd"]] = $mc["text"];
2665  }
2666  $this->tpl->setVariable("SELECT_CMDS",
2667  ilUtil::formSelect("", "selected_cmd", $sel, false, true));
2668  $this->tpl->setVariable("TXT_EXECUTE", $lng->txt("execute"));
2669  $this->tpl->parseCurrentBlock();
2670  $arrow = true;
2671  $action_row = true;
2672 
2673  if ($this->getTopCommands())
2674  {
2675  if($this->enable_command_for_all && $this->max_count <= self::getAllCommandLimit())
2676  {
2677  $this->tpl->setCurrentBlock("tbl_top_cmd_select_all");
2678  $this->tpl->setVariable("TXT_SELECT_CMD_ALL", $lng->txt("all_objects"));
2679  $this->tpl->parseCurrentBlock();
2680  }
2681 
2682  $this->tpl->setCurrentBlock("tbl_top_cmd_select");
2683  $sel = array();
2684  foreach ($this->multi as $mc)
2685  {
2686  $sel[$mc["cmd"]] = $mc["text"];
2687  }
2688  $this->tpl->setVariable("SELECT_CMDS",
2689  ilUtil::formSelect("", "selected_cmd2", $sel, false, true));
2690  $this->tpl->setVariable("TXT_EXECUTE", $lng->txt("execute"));
2691  $this->tpl->parseCurrentBlock();
2692  }
2693  }
2694  elseif(count($this->multi) == 1 && $this->dataExists())
2695  {
2696  $this->tpl->setCurrentBlock("tbl_single_cmd");
2697  $sel = array();
2698  foreach ($this->multi as $mc)
2699  {
2700  $cmd = $mc['cmd'];
2701  $txt = $mc['text'];
2702  }
2703  $this->tpl->setVariable("TXT_SINGLE_CMD",$txt);
2704  $this->tpl->setVariable("SINGLE_CMD",$cmd);
2705  $this->tpl->parseCurrentBlock();
2706  $arrow = true;
2707  $action_row = true;
2708 
2709  if ($this->getTopCommands())
2710  {
2711  $this->tpl->setCurrentBlock("tbl_top_single_cmd");
2712  $sel = array();
2713  foreach ($this->multi as $mc)
2714  {
2715  $cmd = $mc['cmd'];
2716  $txt = $mc['text'];
2717  }
2718  $this->tpl->setVariable("TXT_SINGLE_CMD",$txt);
2719  $this->tpl->setVariable("SINGLE_CMD",$cmd);
2720  $this->tpl->parseCurrentBlock();
2721  }
2722  }
2723 
2724  if ($arrow)
2725  {
2726  $this->tpl->setCurrentBlock("tbl_action_img_arrow");
2727  $this->tpl->setVariable("IMG_ARROW", ilUtil::getImagePath("arrow_downright.svg"));
2728  $this->tpl->setVariable("ALT_ARROW", $lng->txt("action"));
2729  $this->tpl->parseCurrentBlock();
2730 
2731  if ($this->getTopCommands())
2732  {
2733  $this->tpl->setCurrentBlock("tbl_top_action_img_arrow");
2734  $this->tpl->setVariable("IMG_ARROW", ilUtil::getImagePath("arrow_upright.svg"));
2735  $this->tpl->setVariable("ALT_ARROW", $lng->txt("action"));
2736  $this->tpl->parseCurrentBlock();
2737  }
2738  }
2739 
2740  if ($action_row)
2741  {
2742  $this->tpl->setCurrentBlock("tbl_action_row");
2743  $this->tpl->parseCurrentBlock();
2744  if ($this->getTopCommands())
2745  {
2746  $this->tpl->setCurrentBlock("tbl_top_action_row");
2747  $this->tpl->parseCurrentBlock();
2748  }
2749  }
2750  }
2751 
2757  public function setHeaderHTML($html)
2758  {
2759  $this->headerHTML = $html;
2760  }
2761 
2768  function storeProperty($type, $value)
2769  {
2770  global $ilUser;
2771 
2772  if(is_object($ilUser) && $this->getId() != "")
2773  {
2774  include_once("./Services/Table/classes/class.ilTablePropertiesStorage.php");
2775  $tab_prop = new ilTablePropertiesStorage();
2776 
2777  $tab_prop->storeProperty($this->getId(), $ilUser->getId(), $type, $value);
2778  }
2779  }
2780 
2787  function loadProperty($type)
2788  {
2789  global $ilUser;
2790 
2791  if(is_object($ilUser) && $this->getId() != "")
2792  {
2793  include_once("./Services/Table/classes/class.ilTablePropertiesStorage.php");
2794  $tab_prop = new ilTablePropertiesStorage();
2795 
2796  return $tab_prop->getProperty($this->getId(), $ilUser->getId(), $type);
2797  }
2798  }
2799 
2805  public function getCurrentState()
2806  {
2807  $this->determineOffsetAndOrder();
2808  $this->determineLimit();
2809  $this->determineSelectedColumns();
2810  $this->determineSelectedFilters();
2811 
2812  // "filter" show/hide is not saved
2813 
2814  $result = array();
2815  $result["order"] = $this->getOrderField();
2816  $result["direction"] = $this->getOrderDirection();
2817  $result["offset"] = $this->getOffset();
2818  $result["rows"] = $this->getLimit();
2819  $result["selfilters"] = $this->getSelectedFilters();
2820 
2821  // #9514 - $this->getSelectedColumns() will omit deselected, leading to
2822  // confusion on restoring template
2823  $result["selfields"] = $this->selected_column;
2824 
2825  // gather filter values
2826  if($this->filters)
2827  {
2828  foreach($this->filters as $item)
2829  {
2830  $result["filter_values"][$item->getFieldId()] = $this->getFilterValue($item);
2831  }
2832  }
2833  if($this->optional_filters && $result["selfilters"])
2834  {
2835  foreach($this->optional_filters as $item)
2836  {
2837  if(in_array($item->getFieldId(), $result["selfilters"]))
2838  {
2839  $result["filter_values"][$item->getFieldId()] = $this->getFilterValue($item);
2840  }
2841  }
2842  }
2843 
2844  return $result;
2845  }
2846 
2853  protected function getFilterValue(ilFormPropertyGUI $a_item)
2854  {
2855  if(method_exists($a_item, "getChecked"))
2856  {
2857  return $a_item->getChecked();
2858  }
2859  else if(method_exists($a_item, "getValue"))
2860  {
2861  return $a_item->getValue();
2862  }
2863  else if(method_exists($a_item, "getDate"))
2864  {
2865  return $a_item->getDate()->get(IL_CAL_DATE);
2866  }
2867  }
2868 
2875  protected function SetFilterValue(ilFormPropertyGUI $a_item, $a_value)
2876  {
2877  if(method_exists($a_item, "setChecked"))
2878  {
2879  $a_item->setChecked($a_value);
2880  }
2881  else if(method_exists($a_item, "setValue"))
2882  {
2883  $a_item->setValue($a_value);
2884  }
2885  else if(method_exists($a_item, "setDate"))
2886  {
2887  $a_item->setDate(new ilDate($a_value, IL_CAL_DATE));
2888  }
2889  $a_item->writeToSession();
2890  }
2891 
2897  public function setContext($id)
2898  {
2899  if(trim($id))
2900  {
2901  $this->context = $id;
2902  }
2903  }
2904 
2910  public function getContext()
2911  {
2912  return $this->context;
2913  }
2914 
2920  public function setShowRowsSelector($a_value)
2921  {
2922  $this->show_rows_selector = (bool)$a_value;
2923  }
2924 
2930  public function getShowRowsSelector()
2931  {
2933  }
2934 
2940  public function setShowTemplates($a_value)
2941  {
2942  $this->show_templates = (bool)$a_value;
2943  }
2944 
2950  public function getShowTemplates()
2951  {
2952  return $this->show_templates;
2953  }
2954 
2961  public function restoreTemplate($a_name)
2962  {
2963  global $ilUser;
2964 
2965  $a_name = ilUtil::stripSlashes($a_name);
2966 
2967  if(trim($a_name) && $this->getContext() != "" && is_object($ilUser) && $ilUser->getId() != ANONYMOUS_USER_ID)
2968  {
2969  include_once("./Services/Table/classes/class.ilTableTemplatesStorage.php");
2970  $storage = new ilTableTemplatesStorage();
2971 
2972  $data = $storage->load($this->getContext(), $ilUser->getId(), $a_name);
2973  if(is_array($data))
2974  {
2975  foreach($data as $property => $value)
2976  {
2977  $this->storeProperty($property, $value);
2978  }
2979  }
2980 
2981  $data["filter_values"] = unserialize($data["filter_values"]);
2982  if($data["filter_values"])
2983  {
2984  $this->restore_filter_values = $data["filter_values"];
2985  }
2986 
2987  $this->restore_filter = true;
2988 
2989  return true;
2990  }
2991  return false;
2992  }
2993 
3000  public function saveTemplate($a_name)
3001  {
3002  global $ilUser;
3003 
3004  $a_name = ilUtil::prepareFormOutput($a_name, true);
3005 
3006  if(trim($a_name) && $this->getContext() != "" && is_object($ilUser) && $ilUser->getId() != ANONYMOUS_USER_ID)
3007  {
3008  include_once("./Services/Table/classes/class.ilTableTemplatesStorage.php");
3009  $storage = new ilTableTemplatesStorage();
3010 
3011  $state = $this->getCurrentState();
3012  $state["filter_values"] = serialize($state["filter_values"]);
3013  $state["selfields"] = serialize($state["selfields"]);
3014  $state["selfilters"] = serialize($state["selfilters"]);
3015 
3016  $storage->store($this->getContext(), $ilUser->getId(), $a_name, $state);
3017  return true;
3018  }
3019  return false;
3020  }
3021 
3028  public function deleteTemplate($a_name)
3029  {
3030  global $ilUser;
3031 
3032  $a_name = ilUtil::prepareFormOutput($a_name, true);
3033 
3034  if(trim($a_name) && $this->getContext() != "" && is_object($ilUser) && $ilUser->getId() != ANONYMOUS_USER_ID)
3035  {
3036  include_once("./Services/Table/classes/class.ilTableTemplatesStorage.php");
3037  $storage = new ilTableTemplatesStorage();
3038  $storage->delete($this->getContext(), $ilUser->getId(), $a_name);
3039  return true;
3040  }
3041  return false;
3042  }
3043 
3047  function getLimit()
3048  {
3049  if($this->getExportMode() || $this->getPrintMode())
3050  {
3051  return 9999;
3052  }
3053  return parent::getLimit();
3054  }
3055 
3059  function getOffset()
3060  {
3061  if($this->getExportMode() || $this->getPrintMode())
3062  {
3063  return 0;
3064  }
3065  return parent::getOffset();
3066  }
3067 
3073  public function setExportFormats(array $formats)
3074  {
3075  $this->export_formats = array();
3076 
3077  // #11339
3078  $valid = array(self::EXPORT_EXCEL => "tbl_export_excel",
3079  self::EXPORT_CSV => "tbl_export_csv");
3080 
3081  foreach($formats as $format)
3082  {
3083  if(array_key_exists($format, $valid))
3084  {
3085  $this->export_formats[$format] = $valid[$format];
3086  }
3087  }
3088  }
3089 
3094  public function setPrintMode($a_value = false)
3095  {
3096  $this->print_mode = (bool)$a_value;
3097  }
3098 
3103  public function getPrintMode()
3104  {
3105  return $this->print_mode;
3106  }
3107 
3113  public function getExportMode()
3114  {
3115  return $this->export_mode;
3116  }
3117 
3123  public function exportData($format, $send = false)
3124  {
3125  if($this->dataExists())
3126  {
3127  // #9640: sort
3128  if (!$this->getExternalSorting() && $this->enabled["sort"])
3129  {
3130  $this->determineOffsetAndOrder(true);
3131 
3132  $this->row_data = ilUtil::sortArray($this->row_data, $this->getOrderField(),
3133  $this->getOrderDirection(), $this->numericOrdering($this->getOrderField()));
3134  }
3135 
3136  $filename = "export";
3137 
3138  switch($format)
3139  {
3140  case self::EXPORT_EXCEL:
3141  include_once "./Services/Excel/classes/class.ilExcelUtils.php";
3142  include_once "./Services/Excel/classes/class.ilExcelWriterAdapter.php";
3143  $adapter = new ilExcelWriterAdapter($filename.".xls", $send);
3144  $workbook = $adapter->getWorkbook();
3145  $worksheet = $workbook->addWorksheet();
3146  $row = 0;
3147 
3148  ob_start();
3149  $this->fillMetaExcel($worksheet, $row); // row must be increment in fillMetaExcel()! (optional method)
3150 
3151  // #14813
3152  $pre = $row;
3153  $this->fillHeaderExcel($worksheet, $row); // row should NOT be incremented in fillHeaderExcel()! (required method)
3154  if($pre == $row)
3155  {
3156  $row++;
3157  }
3158 
3159  foreach($this->row_data as $set)
3160  {
3161  $this->fillRowExcel($worksheet, $row, $set);
3162  $row++; // #14760
3163  }
3164  ob_end_clean();
3165 
3166  $workbook->close();
3167  break;
3168 
3169  case self::EXPORT_CSV:
3170  include_once "./Services/Utilities/classes/class.ilCSVWriter.php";
3171  $csv = new ilCSVWriter();
3172  $csv->setSeparator(";");
3173 
3174  ob_start();
3175  $this->fillMetaCSV($csv);
3176  $this->fillHeaderCSV($csv);
3177  foreach($this->row_data as $set)
3178  {
3179  $this->fillRowCSV($csv, $set);
3180  }
3181  ob_end_clean();
3182 
3183  if($send)
3184  {
3185  $filename .= ".csv";
3186  header("Content-type: text/comma-separated-values");
3187  header("Content-Disposition: attachment; filename=\"".$filename."\"");
3188  header("Expires: 0");
3189  header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
3190  header("Pragma: public");
3191  echo $csv->getCSVString();
3192 
3193  }
3194  else
3195  {
3196  file_put_contents($filename, $csv->getCSVString());
3197  }
3198  break;
3199  }
3200 
3201  if($send)
3202  {
3203  exit();
3204  }
3205  }
3206  }
3207 
3215  protected function fillMetaExcel($worksheet, &$a_row)
3216  {
3217 
3218  }
3219 
3227  protected function fillHeaderExcel($worksheet, &$a_row)
3228  {
3229  $col = 0;
3230  foreach ($this->column as $column)
3231  {
3232  $title = strip_tags($column["text"]);
3233  if($title)
3234  {
3235  $worksheet->write($a_row, $col, $title);
3236  $col++;
3237  }
3238  }
3239  }
3240 
3249  protected function fillRowExcel($a_worksheet, &$a_row, $a_set)
3250  {
3251  $col = 0;
3252  foreach ($a_set as $key => $value)
3253  {
3254  if(is_array($value))
3255  {
3256  $value = implode(', ', $value);
3257  }
3258  $a_worksheet->write($a_row, $col, strip_tags($value));
3259  $col++;
3260  }
3261  }
3262 
3269  protected function fillMetaCSV($a_csv)
3270  {
3271 
3272  }
3273 
3280  protected function fillHeaderCSV($a_csv)
3281  {
3282  foreach ($this->column as $column)
3283  {
3284  $title = strip_tags($column["text"]);
3285  if($title)
3286  {
3287  $a_csv->addColumn($title);
3288  }
3289  }
3290  $a_csv->addRow();
3291  }
3292 
3300  protected function fillRowCSV($a_csv, $a_set)
3301  {
3302  foreach ($a_set as $key => $value)
3303  {
3304  if(is_array($value))
3305  {
3306  $value = implode(', ', $value);
3307  }
3308  $a_csv->addColumn(strip_tags($value));
3309  }
3310  $a_csv->addRow();
3311  }
3312 
3318  public function setEnableAllCommand($a_value)
3319  {
3320  $this->enable_command_for_all = (bool)$a_value;
3321  }
3322 
3328  public static function getAllCommandLimit()
3329  {
3330  global $ilClientIniFile;
3331 
3332  $limit = $ilClientIniFile->readVariable("system", "TABLE_ACTION_ALL_LIMIT");
3333  if(!$limit)
3334  {
3336  }
3337 
3338  return $limit;
3339  }
3340 
3345  {
3346  $this->row_selector_label = $row_selector_label;
3347  return $this;
3348  }
3349 
3353  public function getRowSelectorLabel()
3354  {
3356  }
3357 
3363  public function setPreventDoubleSubmission($a_val)
3364  {
3365  $this->prevent_double_submission = $a_val;
3366  }
3367 
3373  public function getPreventDoubleSubmission()
3374  {
3376  }
3377 }
3378 
3379 ?>