3require_once
'dbxForm.class.php';
383 $this->_rpt_format = array();
384 $this->_options_rsort = array();
385 $this->_options_rrows = array();
386 $this->_options_rdesc = array();
387 $this->_options_rselect = array();
389 $this->_style_haeder = array();
390 $this->_class_haeder = array();
391 $this->_class_body = array();
393 $this->_record = array();
394 $this->_rdata = array();
400 $this->_haeder_report =
'';
401 $this->_footer_report =
'';
402 $this->_haeder_page =
'';
403 $this->_footer_page =
'';
404 $this->_haeder_next_page =
'';
405 $this->_footer_next_page =
'';
407 $this->_table_col_count = 0;
408 $this->_count_selects = -1;
409 $this->_multi_select_work =
'';
411 $this->_grid_read_url =
'';
412 $this->_grid_save_url =
'';
413 $this->_grid_delete_url =
'';
414 $this->_grid_insert_url =
'';
415 $this->_grid_sort_url =
'';
416 $this->_grid_sync_url =
'';
417 $this->_grid_print_url =
'';
418 $this->_grid_export_url =
'';
419 $this->_grid_schema =
'';
420 $this->_grid_id =
'';
421 $this->_grid_cols =
'';
422 $this->_grid_layout =
'fitColumns';
423 $this->_grid_headerfilter = 1;
424 $this->_grid_headersort = 1;
425 $this->_grid_allow_delete = 1;
426 $this->_grid_allow_edit = 1;
427 $this->_grid_allow_insert = 1;
428 $this->_grid_synctime =
'2';
432 $table[
'tpl_haeder_col'] =
'table_haeder_col';
433 $table[
'tpl_haeder_select'] =
'table_haeder_select';
434 $table[
'tpl_haeder_delte'] =
'table_haeder_delete';
435 $table[
'tpl_haeder_expand'] =
'table_haeder_expand';
436 $table[
'tpl_haeder_expander'] =
'table_haeder_expander';
437 $table[
'tpl_haeder_edit'] =
'table_haeder_edit';
438 $table[
'tpl_haeder_copy'] =
'table_haeder_copy';
439 $table[
'tpl_haeder_undo'] =
'table_haeder_undo';
440 $table[
'tpl_haeder_show'] =
'table_haeder_show';
441 $table[
'tpl_haeder_import'] =
'table_haeder_import';
442 $table[
'tpl_haeder_export'] =
'table_haeder_export';
443 $table[
'tpl_haeder_download'] =
'table_haeder_download';
444 $table[
'tpl_haeder_print'] =
'table_haeder_print';
446 $table[
'tpl_row_col'] =
'table_row_col';
447 $table[
'tpl_row_select'] =
'table_row_select';
448 $table[
'tpl_row_expand'] =
'table_row_expand';
449 $table[
'tpl_row_expander'] =
'table_row_expander';
450 $table[
'tpl_row_edit'] =
'table_row_edit';
451 $table[
'tpl_row_copy'] =
'table_row_copy';
452 $table[
'tpl_row_delete'] =
'table_row_delete';
453 $table[
'tpl_row_save'] =
'table_row_save';
454 $table[
'tpl_row_undo'] =
'table_row_undo';
455 $table[
'tpl_row_show'] =
'table_row_show';
456 $table[
'tpl_row_export'] =
'table_row_export';
457 $table[
'tpl_row_import'] =
'table_row_import';
458 $table[
'tpl_row_download'] =
'table_row_download';
459 $table[
'tpl_row_print'] =
'table_row_print';
461 if ($this->_multi_page_select) {
462 $table[
'tpl_haeder_select'] =
'table_haeder_select-multi';
463 $table[
'tpl_row_select'] =
'table_row_select-multi';
466 $this->_tabel_tpls =
$table;
478 $this->_tabel_tpls[$tid] = $tpl;
491 if ($this->_action) {
500 $run1 =
dbx()->get_modul_var(
'dbx_run1', 0);
504 $run2 =
dbx()->get_modul_var(
'dbx_run2', 0);
507 $url =
'?dbx_modul=' . $modul;
510 $url .=
'&dbx_run1=' . $run1;
514 $url .=
'&dbx_run2=' . $run2;
532 $rid = trim((
string) $rid);
557 if (!is_array($record)) {
561 if ($this->_fld_id && array_key_exists($this->_fld_id, $record)) {
565 if (array_key_exists(
'rid', $record)) {
566 return $record[
'rid'];
569 if (array_key_exists(
'id', $record)) {
570 return $record[
'id'];
573 if (array_key_exists(
'recnum', $record)) {
574 return $record[
'recnum'];
609 if (is_array($raw)) {
610 foreach ($raw as $value) {
618 return array_keys($ids);
621 $raw = trim((
string) $raw);
627 $parts = preg_split(
'/[|,\s;]+/', $raw);
629 if (!is_array($parts)) {
633 foreach ($parts as $value) {
641 return array_keys($ids);
654 foreach ($ids as $rid) {
675 foreach ($ids as $rid) {
678 if ($key !==
'' && isset($selects[$key])) {
679 unset($selects[$key]);
694 if (!is_array($this->_rdata)) {
698 foreach ($this->_rdata as $record) {
706 return array_keys($ids);
722 $selectedVisible = array();
724 foreach ($visibleIds as $rid) {
727 if ($key !==
'' && isset($selects[$key])) {
728 $selectedVisible[] = $key;
732 $visibleCount = count($visibleIds);
733 $selectedCount = count($selectedVisible);
734 $headerState =
'none';
736 if ($visibleCount > 0 && $selectedCount === $visibleCount) {
737 $headerState =
'all';
738 } elseif ($selectedCount > 0) {
739 $headerState =
'partial';
743 'visible_ids' => array_values($visibleIds),
744 'selected_ids_visible' => array_values($selectedVisible),
745 'visible_count' => $visibleCount,
746 'selected_count' => $selectedCount,
747 'header_state' => $headerState,
748 'header_checked' => ($headerState ===
'all') ? 1 : 0,
767 'visible_ids' => $state[
'visible_ids'],
768 'selected_ids_visible' => $state[
'selected_ids_visible'],
769 'visible_count' => $state[
'visible_count'],
770 'visible_selected_count' => $state[
'selected_count'],
771 'header_state' => $state[
'header_state'],
774 header(
'Content-Type: application/json; charset=utf-8');
775 echo json_encode(
$response, JSON_UNESCAPED_UNICODE);
787 $modul = $this->_dbx_modul ?:
'dbx';
788 $fid = $this->_fid ?:
'report';
790 return 'dbx.report.' . $modul .
'.' . $fid .
'.' . $suffix;
802 public function get_sys($name, $default =
'', $validate =
'parameter') {
803 if (isset($this->_data[$name])) {
804 $default = $this->_data[$name];
807 if (isset($this->_sys[$name])) {
808 $default = $this->_sys[$name];
811 $value =
dbx()->get_request_var($name, $default, $validate);
828 if ($key !==
'' && isset($selects[$key])) {
829 $checked =
'checked="checked"';
846 foreach ($this->_rdata as $record) {
877 if ($key !==
'' && isset($selects[$key])) {
878 unset($selects[$key]);
895 $normalized = array();
897 if (is_array($selects)) {
898 foreach ($selects as $rid => $value) {
902 $normalized[$key] = 1;
908 dbx()->set_remember_var($key, $normalized,
'dbx');
909 $this->_count_selects = -1;
928 if ($key !==
'' && isset($ids[$key])) {
942 $selects =
dbx()->get_remember_var($key, array(),
'dbx');
944 if (!is_array($selects)) {
948 $normalized = array();
950 foreach ($selects as $rid => $value) {
951 $key = $this->normalize_multi_select_key($rid);
954 $normalized[$key] = 1;
967 $count = $this->_count_selects;
971 $count = is_array($selects) ? count($selects) : 0;
972 $this->_count_selects =
$count;
989 dbx()->set_modul_var(
'dbx_no_reset', 1);
990 $db =
dbx()->get_system_obj(
'dbxDB');
995 foreach ($selected as $id => $sel) {
996 $ok =
$db->delete($dd, $id);
1010 $ok =
$db->delete($dd, $rid);
1027 $fld_id = $this->_fld_id ? $this->_fld_id :
'id';
1029 if (!is_array($selects) || !count($selects)) {
1031 $rwhere .=
' and (1=0)';
1034 if ($rwhere ==
'') {
1043 foreach ($selects as $id => $sel) {
1050 if (preg_match(
'/^-?\d+$/', $key)) {
1051 $values[] = (string) ((
int) $key);
1053 $values[] =
"'" . addslashes($key) .
"'";
1057 if (!count($values)) {
1059 $rwhere .=
' and (1=0)';
1062 if ($rwhere ==
'') {
1069 $selectWhere = $fld_id .
' IN (' . implode(
',', $values) .
')';
1072 $rwhere .=
' and (' . $selectWhere .
')';
1074 $rwhere = $selectWhere;
1090 if ($suchWert ===
null) {
1094 $suchWert = str_replace(array(
'\'',
'"',
'\\',
'%'),
'', $suchWert);
1095 $suchWert = filter_var($suchWert, FILTER_SANITIZE_SPECIAL_CHARS);
1097 $datum = DateTime::createFromFormat(
'd.m.Y', $suchWert);
1099 if ($datum && $datum->format(
'd.m.Y') === $suchWert) {
1100 $suchWert = $datum->format(
'Y-m-d');
1103 $felder = explode(
',', $feldListe);
1105 $bedingungen = array();
1107 foreach ($felder as $feld) {
1108 $feld = trim($feld);
1114 $bedingungen[] =
"$feld LIKE '$suchWert%'";
1117 $sql .= implode(
' OR ', $bedingungen);
1140 $dbx_do =
dbx()->get_request_var(
'dbx_do',
'',
'parameter');
1141 $dbx_mode =
dbx()->get_request_var(
'dbx_mode',
'',
'parameter');
1142 $checked =
dbx()->get_request_var(
'dbx_checked',
'',
'parameter');
1143 $value =
dbx()->get_request_var(
'dbx_value', 0,
'parameter+.');
1144 $ajax =
dbx()->get_request_var(
'dbx_ajax', 0,
'int');
1145 $nor =
dbx()->get_modul_var(
'dbx_no_reset', 0,
'int');
1147 if ($dbx_do ===
'' && $dbx_mode !==
'') {
1148 $dbx_do = $dbx_mode;
1151 if ($dbx_do ===
'row_select') {
1152 $state =
dbx()->get_request_var(
'dbx_select_state', 0,
'int');
1153 $rid =
dbx()->get_request_var(
'rid',
'',
'parameter+.');
1154 $selectId =
dbx()->get_request_var(
'dbx_select_id',
'',
'parameter+.');
1155 $visibleIds =
dbx()->get_request_var(
'dbx_select_visible_ids',
'',
'*');
1157 if ($selectId !==
'') {
1181 if ($dbx_do ===
'rows_select') {
1182 $state =
dbx()->get_request_var(
'dbx_select_state', 0,
'int');
1183 $idsRaw =
dbx()->get_request_var(
'dbx_select_ids',
'',
'*');
1184 $visibleRaw =
dbx()->get_request_var(
'dbx_select_visible_ids',
'',
'*');
1205 if ($dbx_do ===
'clear_selects') {
1216 if ($dbx_mode ==
'reset_form_select') {
1218 return 'count_response';
1221 if ($dbx_mode ==
'save_form_select' && $value && $ajax) {
1225 if ($value !==
'') {
1226 if (!$checked || $checked ==
'false') {
1227 if (isset($selects[$value])) {
1228 unset($selects[$value]);
1231 $selects[$value] = 1;
1237 return 'count_response';
1244 if (!$checked || $checked ==
'false') {
1261 $format = $this->_rpt_format;
1263 if (is_array($format)) {
1264 if (isset($format[$key])) {
1265 $reform = $format[$key];
1267 if ($reform ==
'php-date-usr') {
1271 if ($reform ==
'php-datetime-usr') {
1275 if ($reform ==
'html-chars') {
1276 $value = htmlspecialchars((
string) $value, ENT_QUOTES,
'UTF-8');
1280 if ($value ===
null) {
1284 if ($format ==
'html-chars' && $value) {
1285 $value = htmlspecialchars((
string) $value, ENT_QUOTES,
'UTF-8');
1289 if ($value ===
null) {
1305 $count_cols = $this->_table_col_count;
1306 $page = $this->_current_page;
1307 $page_break = $this->_page_break;
1309 $content = str_replace(
'{rpt:count_sel}', $count_select, $content);
1310 $content = str_replace(
'{rpt:col_count}', $count_cols, $content);
1311 $content = str_replace(
'{rpt:page}', $page, $content);
1312 $content = str_replace(
'{rpt:pagebrak}', $page_break, $content);
1314 if (is_array($this->_obj)) {
1315 foreach ($this->_obj as $key => $value) {
1316 $xkey =
'{obj:' . $key .
'}';
1318 if ($value ===
null) {
1322 $content = str_replace($xkey, $value, $content);
1378 $footer = $this->_footer_next_page;
1379 $footer .= $this->_footer_page;
1386 $haeder = $this->_haeder_page;
1387 $haeder .= $this->_haeder_next_page;
1409 private function get_class_body($xkey) {
1412 if (isset($this->_class_body[$xkey])) {
1413 $class = $this->_class_body[$xkey];
1424 if ($rpt !=
'pagination') {
1425 $this->_current_report_ln++;
1426 $this->_current_page_ln++;
1428 $pn = $this->_current_page;
1429 $ln = $this->_current_page_ln;
1432 $max = $this->_first_page_lines;
1434 $max = $this->_next_page_lines;
1439 $this->_current_page_ln = 1;
1446 return $page_footer . $page_haeder . $content;
1455 $class =
'th-' . $key;
1458 $this->_class_haeder[$key] = $class;
1461 private function get_class_haeder($key) {
1464 if (is_array($this->_class_haeder)) {
1465 if (isset($this->_class_haeder[$key])) {
1466 $class = $this->_class_haeder[$key];
1471 $class =
'th-' . $key;
1478 $this->_style_haeder[$key] = $style;
1481 private function get_style_haeder($key) {
1484 if (is_array($this->_style_haeder)) {
1485 if (isset($this->_style_haeder[$key])) {
1486 $style = $this->_style_haeder[$key];
1504 'type' =>
'expander',
1505 'enabled' => (
bool) $this->_data_table,
1506 'header_tpl' =>
'tpl_haeder_expander',
1507 'row_tpl' =>
'tpl_row_expander',
1511 'enabled' => (
bool) $this->_create_row_edit,
1512 'header_tpl' =>
'tpl_haeder_edit',
1513 'row_tpl' =>
'tpl_row_edit',
1517 'enabled' => (
bool) $this->_create_row_copy,
1518 'header_tpl' =>
'tpl_haeder_copy',
1519 'row_tpl' =>
'tpl_row_copy',
1523 'enabled' => (
bool) $this->_create_row_show,
1524 'header_tpl' =>
'tpl_haeder_show',
1525 'row_tpl' =>
'tpl_row_show',
1529 'enabled' => (
bool) $this->_create_row_export,
1530 'header_tpl' =>
'tpl_haeder_export',
1531 'row_tpl' =>
'tpl_row_export',
1535 'enabled' => (
bool) $this->_create_row_import,
1536 'header_tpl' =>
'tpl_haeder_import',
1537 'row_tpl' =>
'tpl_row_import',
1540 'type' =>
'download',
1541 'enabled' => (
bool) $this->_create_row_download,
1542 'header_tpl' =>
'tpl_haeder_download',
1543 'row_tpl' =>
'tpl_row_download',
1547 'enabled' => (
bool) $this->_create_row_delete,
1548 'header_tpl' =>
'tpl_haeder_delte',
1549 'row_tpl' =>
'tpl_row_delete',
1553 'enabled' => (
bool) $this->_create_row_print,
1554 'header_tpl' =>
'tpl_haeder_print',
1555 'row_tpl' =>
'tpl_row_print',
1570 if (!$def[
'enabled']) {
1574 $file = $this->_tabel_tpls[$def[
'header_tpl']];
1575 $tpl = $this->
get_tpl($file, array(
1577 'class' =>
'no-sort',
1580 $html .= $tpl .
"\n";
1604 'class' =>
'no-sort',
1608 if ($type ===
'download') {
1609 $dat[
'href_dir_file'] =
dbx()->get_modul_var(
'href_dir_file',
'',
'*');
1612 if ($type ===
'copy') {
1613 $dat[
'confirm'] = $this->_msg_confirm_copy;
1616 if ($type ===
'delete') {
1617 $dat[
'confirm'] = $this->_msg_confirm_delete;
1634 if (!$def[
'enabled']) {
1638 $file = $this->_tabel_tpls[$def[
'row_tpl']];
1640 $tpl = $this->
get_tpl($file, $dat);
1642 $html .= $tpl .
"\n";
1659 $file = $this->_tabel_tpls[
'tpl_haeder_select'];
1660 $name = isset($auto_flds[$fld_id]) ? $auto_flds[$fld_id] :
'xID';
1663 if (!empty($select_state[
'header_checked'])) {
1664 $checked =
'checked="checked"';
1667 return $this->
get_tpl($file, array(
1669 'checked' => $checked,
1671 'header_state' => isset($select_state[
'header_state']) ? $select_state[
'header_state'] :
'none',
1684 $file = $this->_tabel_tpls[
'tpl_row_select'];
1685 $name = $this->_fid .
'_select';
1690 $this->_post[$name] = 1;
1693 return $this->
get_tpl($file, array(
1697 'checked' => $checked,
1715 foreach ($auto_flds as $key => $value) {
1718 if ($this->_create_row_select && $key == $fld_id) {
1722 if (!$skip && $value >
'') {
1723 $file = $this->_tabel_tpls[
'tpl_haeder_col'];
1724 $class = $this->get_class_haeder($key);
1725 $style = $this->get_style_haeder($key);
1727 $tpl = $this->
get_tpl($file, array(
1734 $html .= $tpl .
"\n";
1758 foreach ($auto_flds as $no => $key) {
1761 $label = $auto_flds[$no];
1764 if (isset($record[$key])) {
1766 } elseif (isset($record[$no])) {
1770 if ($this->_create_row_select && $xkey == $fld_id) {
1774 if (!$skip && $label >
'') {
1776 $value = $record[$xkey];
1780 $class = $defaultClass;
1782 if ($defaultClass !==
'auto-fld') {
1783 $class = $this->get_class_body($xkey);
1786 $tpl = $this->
get_tpl($this->_tabel_tpls[
'tpl_row_col'], array(
1792 $html .= $tpl .
"\n";
1808 $content = $this->_haeder;
1811 $this->_current_page++;
1813 $auto_flds = $this->_auto_flds;
1814 $auto_mode = $this->_auto_mode;
1817 if (!is_array($auto_flds)) {
1818 if (is_string($auto_flds) && $auto_flds !==
'') {
1819 $auto_flds = explode(
',', $auto_flds);
1821 $auto_flds = array();
1825 $pos = strpos($content,
'[rpt:row]');
1827 if ($pos !==
false) {
1829 $fld_id = $this->_fld_id;
1831 if ($auto_mode ==
'table' && is_array($auto_flds)) {
1835 if ($this->_table_buttons !=
'left') {
1836 if ($this->_create_row_select) {
1840 $this->get_class_haeder(isset($auto_flds[$fld_id]) ? $auto_flds[$fld_id] :
'xID'),
1846 $row .= $columnBlock[
'html'];
1847 $col_count += $columnBlock[
'count'];
1849 $row .= $buttonBlock[
'html'];
1850 $col_count += $buttonBlock[
'count'];
1852 $row .= $buttonBlock[
'html'];
1853 $col_count += $buttonBlock[
'count'];
1855 if ($this->_create_row_select) {
1865 $row .= $columnBlock[
'html'];
1866 $col_count += $columnBlock[
'count'];
1869 $this->_table_col_count = $col_count;
1872 $content = str_replace(
'[rpt:row]', $row, $content);
1890 $auto_flds = $this->_auto_flds;
1891 $auto_mode = $this->_auto_mode;
1893 if (!is_array($auto_flds)) {
1894 if (is_string($auto_flds) && $auto_flds !==
'') {
1895 $auto_flds = explode(
',', $auto_flds);
1897 $auto_flds = array();
1901 if (is_array($this->_rdata)) {
1902 foreach ($this->_rdata as $recnum => $record) {
1904 $line = $this->_body;
1906 $this->_record = $record;
1907 $line = $this->run_body($line);
1908 $record = $this->_record;
1910 $fld_id = $this->_fld_id;
1911 $pos = strpos($line,
'[rpt:row]');
1913 if ($pos !==
false && $this->_rdata_inline) {
1914 $inline = $this->_body_inline;
1915 return str_replace(
'[rpt:row]', $inline, $line);
1918 if ($pos !==
false) {
1921 if ($auto_mode ==
'table' && is_array($auto_flds)) {
1922 $buttonBlock = $this->render_table_row_action_block($record);
1924 if ($this->_table_buttons !=
'left') {
1925 if ($this->_create_row_select) {
1926 $row .= $this->render_table_row_select($record,
'no-sort') .
"\n";
1929 $row .= $this->render_table_row_data_columns($record, $auto_flds, $fld_id,
'auto-fld');
1930 $row .= $buttonBlock;
1932 $row .= $buttonBlock;
1934 if ($this->_create_row_select) {
1935 $row .= $this->render_table_row_select($record,
'no-sort') .
"\n";
1938 $row .= $this->render_table_row_data_columns($record, $auto_flds, $fld_id,
'body');
1942 $line = str_replace(
'[rpt:row]', $row, $line);
1945 $tr_class = $this->get_class_tr($record);
1946 $tr_class .= ($loop % 2 != 0) ?
' odd' :
' even';
1948 $line = str_replace(
'{tr-class}', $tr_class, $line);
1949 $pos = strpos($line,
'{');
1951 if ($pos !==
false && is_array($record)) {
1952 foreach ($record as
$field => $value) {
1953 $field_name =
'{' .
$field .
'}';
1954 $value = $this->rpt_format(
$field, $value);
1956 if (!is_array($value)) {
1957 if ($value ===
null) {
1961 $line = str_replace($field_name, $value, $line);
1966 $col_count = $this->_table_col_count;
1967 $line = str_replace(
'{rpt:col_count}', $col_count, $line);
1969 if (strpos($line,
'{r}') !==
false) {
1970 $r =
dbx()->next_id(1);
1971 $line = str_replace(
'{r}', $r, $line);
1976 if ($this->_rdata_inline) {
1987 $activ_id = $this->_activ_id;
1994 $key = $this->_fld_id;
1996 if ($key && isset($record[$key])) {
1997 if ($activ_id == $record[$key]) {
1998 $class =
'table-active';
2007 $content = $this->_footer;
2008 $col_count = $this->_table_col_count;
2010 $content = str_replace(
'{rpt:col_count}', $col_count, $content);
2017 $report_part = explode(
'<hr class="dbx_split">', $report);
2018 $report_header =
'';
2020 $report_footer =
'';
2021 $next_haeder_page =
'';
2022 $next_footer_page =
'';
2023 $count = count($report_part);
2026 $report_body = $report_part[0];
2030 $report_header = $report_part[0];
2031 $report_body = $report_part[1];
2035 $report_header = $report_part[0];
2036 $report_body = $report_part[1];
2037 $report_footer = $report_part[2];
2038 $next_haeder_page = $report_part[0];
2039 $next_footer_page = $report_part[2];
2043 $next_haeder_page = $report_part[3];
2044 $next_footer_page = $report_part[5];
2047 $this->_haeder = $report_header;
2048 $this->_body = $report_body;
2049 $this->_footer = $report_footer;
2050 $this->_footer_next_page = $next_footer_page;
2051 $this->_haeder_next_page = $next_haeder_page;
2056 $modul = $this->_dbx_modul;
2057 $action = $this->_dbx_action;
2058 $rcount = $this->_rcount;
2059 $link = $this->_pagelink;
2060 $tpl = $this->_tpl_pagination;
2062 $rpos = $this->
get_sel(
'dbx_rpos', 0,
'int');
2063 $rrows = $this->
get_sel(
'dbx_rrows', 10,
'int');
2066 $link =
'?dbx_modul=' . $modul .
'&dbx_run1=' . $action;
2069 $link = $this->_action ?: $link;
2070 $content = $this->pagination($tpl, $link, $rpos, $rrows, $rcount);
2075 private function lnk_page($p, $akt_page, $link, $rpos, $rrows, $rcount, $target) {
2082 if ($p == $akt_page) {
2083 $p_active =
' aria-current="page"';
2084 $active =
' active';
2085 $current =
' aria-current="page" ';
2089 $rec[
'p'] = $p . $s_active;
2090 $rec[
'href_page'] = $link .
'&dbx_rrows=' . $rrows .
'&dbx_rpos=' . (($p - 1) * $rrows) .
'&dbx_target=' . $target;
2091 $rec[
'p_active'] = $p_active;
2092 $rec[
'active'] = $active;
2093 $rec[
'current'] = $current;
2094 $rec[
'class'] = $class .
' dbxAjax';
2099 private function pagination($tpl, $link, $rpos, $rrows, $rcount) {
2100 if ($rcount == 0 || $rrows == 0 || $rcount <= $rrows) {
2104 $pages = intval($rcount / $rrows);
2106 if ($rcount % $rrows) {
2110 if ($pages == 0 && $rcount > 0) {
2114 $pmax = $this->_but_pagination;
2115 $akt_page = intval($rpos / $rrows) + 1;
2117 if ($akt_page < 1) {
2121 if ($akt_page > $pages) {
2125 $half = intval($pmax / 2);
2126 $p_s = $akt_page - $half;
2127 $p_e = $akt_page + $half;
2134 if ($p_e > $pages) {
2136 $p_s = $pages - $pmax + 1;
2143 $last_pos = ($pages - 1) * $rrows;
2144 $prev = ($akt_page - 2) * $rrows;
2145 $next = ($akt_page) * $rrows;
2151 if ($next > $last_pos) {
2155 $i = $this->_next_i;
2156 $target =
'dbx_target_' . $i;
2158 $href_first = $link .
'&dbx_rpos=0&dbx_rrows=' . $rrows .
'&dbx_target=' . $target;
2159 $href_last = $link .
'&dbx_rpos=' . $last_pos .
'&dbx_rrows=' . $rrows .
'&dbx_target=' . $target;
2160 $href_prev = $link .
'&dbx_rpos=' . $prev .
'&dbx_rrows=' . $rrows .
'&dbx_target=' . $target;
2161 $href_next = $link .
'&dbx_rpos=' . $next .
'&dbx_rrows=' . $rrows .
'&dbx_target=' . $target;
2163 $this->_sys[
'dbx_rpos'] = $rpos;
2164 $this->_sys[
'dbx_rrows'] = $rrows;
2167 $dv[
'dbx_rpos'] = $rpos;
2168 $dv[
'dbx_rrows'] = $rrows;
2171 for ($p = $p_s; $p <= $p_e; $p++) {
2172 $rdata[] = $this->lnk_page($p, $akt_page, $link, $rpos, $rrows, $rcount, $target);
2179 $oReport =
dbx()->get_system_obj(
'dbxReport');
2181 $oReport->init(
'pagination');
2182 $oReport->_data = $dv;
2183 $oReport->_dbx_modul =
'dbx';
2184 $oReport->_dbx_action =
'pagination';
2185 $oReport->_dbx_modul_id = 888;
2186 $oReport->_rdata = $rdata;
2187 $oReport->_rcount = $rcount;
2188 $oReport->_rrows = $rrows;
2189 $oReport->_rpos = $rpos;
2190 $oReport->_action = $link;
2191 $oReport->_tpl = $tpl;
2192 $oReport->_pages = 0;
2193 $oReport->_body_inline =
false;
2194 $oReport->_create_sel_flds = 0;
2196 $content = $oReport->run(0,
'',
'table');
2198 $content = str_replace(
'{href_first}', $href_first, $content);
2199 $content = str_replace(
'{href_last}', $href_last, $content);
2200 $content = str_replace(
'{href_prev}', $href_prev, $content);
2201 $content = str_replace(
'{href_next}', $href_next, $content);
2209 for ($i = $rpos; $i < ($rpos + $rrows); $i++) {
2210 if (isset($data[$i])) {
2211 $rdata[] = $data[$i];
2223 $where .=
" $mode (";
2235 $this->_page_reset = 0;
2240 $nor =
dbx()->get_modul_var(
'dbx_no_reset', 0,
'int');
2249 $_POST[$name] = $value;
2250 $this->_data[$name] = $value;
2251 $this->_sys[$name] = $value;
2254 public function get_sel($name, $default =
'', $rules =
'parameter') {
2255 $submit = $this->
submit();
2256 $page_reset = $this->_page_reset ? 1 : 0;
2257 $xdefault = $default;
2258 $nor =
dbx()->get_modul_var(
'dbx_nor', 0,
'int');
2260 if ($submit && $page_reset && !$nor) {
2261 $this->_sys[
'dbx_rpos'] = 0;
2264 if (isset($this->_data[$name])) {
2265 $xdefault = $this->_data[$name];
2268 if (isset($this->_sys[$name])) {
2269 $xdefault = $this->_sys[$name];
2273 $danger_value = $this->
get_post($name, $xdefault,
'*');
2274 $ok = $this->oValidator->validate($danger_value, $rules, $name);
2277 $danger_value = $default;
2280 $value = $danger_value;
2285 $this->_sys[$name] = $value;
2291 $gridId = $this->_grid_id;
2294 $gridId = $this->_fid .
'_grid';
2297 $cols = $this->_grid_cols;
2299 if (!$cols && $this->_dd) {
2300 $oDB =
dbx()->get_system_obj(
'dbxDB');
2301 $cols = $oDB->get_dd_grid_cols($this->_dd);
2305 'read_url' => $this->_grid_read_url,
2306 'save_url' => $this->_grid_save_url,
2307 'delete_url' => $this->_grid_delete_url,
2308 'insert_url' => $this->_grid_insert_url,
2309 'sort_url' => $this->_grid_sort_url,
2310 'sync_url' => $this->_grid_sync_url,
2311 'print_url' => $this->_grid_print_url,
2312 'export_url' => $this->_grid_export_url,
2313 'grid_id' => $gridId,
2314 'grid_cols' => $cols,
2315 'grid_schema' => $this->_grid_schema,
2316 'grid_layout' => $this->_grid_layout,
2317 'grid_height' => $this->_rrows,
2318 'grid_synctime' => $this->_grid_synctime,
2323 $page =
dbx()->get_request_var(
'page', 0,
'int');
2324 $size =
dbx()->get_request_var(
'size', 0,
'int');
2325 $limit =
dbx()->get_request_var(
'limit', 0,
'int');
2326 $offset =
dbx()->get_request_var(
'offset', -1,
'int');
2329 $this->_rrows = $size;
2330 } elseif ($limit > 0) {
2331 $this->_rrows = $limit;
2335 $this->_rpos = $offset;
2336 } elseif ($page > 0 && $this->_rrows > 0) {
2337 $this->_rpos = (($page - 1) * $this->_rrows);
2344 if (!is_array($this->_rdata)) {
2348 foreach ($this->_rdata as $record) {
2349 $this->_record = $record;
2351 $this->run_body($dummy);
2352 $record = $this->_record;
2354 if (!is_array($record)) {
2360 foreach ($record as
$field => $value) {
2361 if (is_array($value)) {
2376 $count = (int) $this->_rcount;
2377 $rrows = (int) $this->_rrows;
2378 $rpos = (int) $this->_rpos;
2383 $pages = (int) ceil(
$count / $rrows);
2384 $page = (int) floor($rpos / $rrows) + 1;
2387 header(
'Content-Type: application/json; charset=utf-8');
2389 echo json_encode(array(
2392 'rows' => array_values($rows),
2397 ), JSON_UNESCAPED_UNICODE);
2402 public function init($fid, $tpl =
'', $first_page_lines = -1, $next_page_lines = -1, $current_line = -1) {
2405 if ($fid ==
'pagination') {
2409 if ($first_page_lines < 0) {
2410 $first_page_lines = 999999;
2413 if ($next_page_lines < 0) {
2414 $next_page_lines = 999999;
2417 if ($current_line < 0) {
2421 $current_page_line = 0;
2424 if ($current_line >= 0) {
2425 if ($current_line < $first_page_lines) {
2427 $current_page_line = $current_line;
2429 $remaining_lines = $current_line - $first_page_lines;
2430 $current_page = 2 + intval($remaining_lines / $next_page_lines);
2431 $current_page_line = ($remaining_lines % $next_page_lines);
2437 $this->_current_page = $current_page;
2438 $this->_current_report_ln = $current_line;
2439 $this->_current_page_ln = $current_page_line;
2440 $this->_first_page_lines = $first_page_lines;
2441 $this->_next_page_lines = $next_page_lines;
2443 $this->_fld_haeder =
'';
2444 $this->_haeder_report =
'';
2445 $this->_footer_report =
'';
2446 $this->_haeder_page =
'';
2447 $this->_footer_page =
'';
2448 $this->_haeder_next_page =
'';
2449 $this->_footer_next_page =
'';
2451 dbx()->set_remember_var(
'last_report_i', $this->_next_i,
'dbx');
2455 if ($retval ===
'count_response') {
2460 if ($retval ===
'add' || $retval ===
'rem') {
2461 $this->_multi_select_work = $retval;
2463 $submitField = $fid .
'_select';
2464 $selects = $this->
get_post($submitField,
'',
'array|parameter');
2466 if (is_array($selects)) {
2467 foreach ($selects as $id => $sel) {
2468 if ($retval ==
'add') {
2473 if ($retval ==
'rem') {
2474 $selects = $this->
get_post(
'dbx_add',
'',
'parameter');
2475 $deselects = explode(
'|', $selects);
2477 foreach ($deselects as $id => $sel) {
2485 $this->_multi_select_work =
'';
2489 public function run($pages = 0, $flds =
'', $mode =
'') {
2492 $msg_class =
'info';
2496 $pages = $this->_pages;
2500 $mode = $this->_mode;
2503 $this->_pages = $pages;
2504 $this->_mode = $mode;
2506 if (!is_array($flds)) {
2507 $flds = $this->_rflds;
2510 $submit = $this->
submit();
2512 $nor =
dbx()->get_modul_var(
'dbx_no_reset', 0,
'int');
2515 $this->_auto_flds = $flds;
2516 $this->_auto_mode = $mode;
2518 $rrows = $this->_rrows;
2521 if (isset($this->_sys[
'dbx_rrows'])) {
2522 $rrows = $this->_sys[
'dbx_rrows'];
2525 if ($this->_data_table ==
'auto') {
2527 $this->_data_table = 0;
2529 $this->_data_table = 1;
2533 $i = $this->_next_i;
2536 $msg = $this->_msg_info;
2537 $create_sel_flds = $this->_create_sel_flds;
2539 if ($fid !=
'pagination') {
2540 if (!is_array($this->_options_rsort) || empty($this->_options_rsort)) {
2541 $this->_options_rsort[
'id'] =
'ID';
2544 $this->_options_rrows[
'1'] = 1;
2545 $this->_options_rrows[
'5'] = 5;
2546 $this->_options_rrows[
'10'] = 10;
2547 $this->_options_rrows[
'15'] = 15;
2548 $this->_options_rrows[
'20'] = 20;
2549 $this->_options_rrows[
'25'] = 25;
2550 $this->_options_rrows[
'50'] = 50;
2551 $this->_options_rrows[
'100'] = 100;
2552 $this->_options_rrows[
'1000'] = 1000;
2554 $this->_options_rdesc[
'ASC'] =
'Aufsteigend';
2555 $this->_options_rdesc[
'DESC'] =
'Absteigend';
2557 $this->_options_rselect[
'0'] =
'*Alle*';
2558 $this->_options_rselect[
'1'] =
'Ausgewählte';
2563 if ($submit && !$nor) {
2564 $this->_sys[
'dbx_rpos'] = 0;
2567 if (isset($this->_sys[
'dbx_rrows'])) {
2568 $this->_rrows = $this->_sys[
'dbx_rrows'];
2573 if (isset($this->_sys[
'dbx_rpos'])) {
2574 $this->_rpos = $this->_sys[
'dbx_rpos'];
2581 if ($fid !=
'pagination' && $create_sel_flds == 1) {
2582 if ($this->_data_table == 88) {
2585 foreach ($this->_options_rrows as $key => $nam) {
2586 if ($this->_rcount <= $key) {
2596 $this->_sys[
'dbx_rrows'] = $next_val;
2600 $this->
add_fld(
'dbx_rrows',
'select-single-label', options: $this->_options_rrows, rules:
'int', label:
'Anz.Seite');
2601 $this->
add_fld(
'dbx_rsort',
'select-single-label', options: $this->_options_rsort, rules:
'parameter', label:
'Sortierung');
2602 $this->
add_fld(
'dbx_rdesc',
'select-single-label', options: $this->_options_rdesc, rules:
'parameter', label:
'Auf/Ab');
2603 $this->
add_fld(
'dbx_rwhere',
'dbx|search', options:
'', rules:
'*', label:
'Suchen',
class:
'input-reset');
2604 $this->
add_fld(
'dbx_rselect',
'select-single-label', options: $this->_options_rselect, rules:
'parameter', label:
'Ausgewählte');
2608 $now = microtime(
true);
2610 if (!isset($this->_sys[
'try_first'])) {
2611 $this->_sys[
'try_first'] = $now;
2614 if (!isset($this->_sys[
'try_count'])) {
2615 $this->_sys[
'try_count'] = 0;
2618 if (!isset($this->_sys[
'try_error'])) {
2619 $this->_sys[
'try_error'] = 0;
2622 $this->_sys[
'try_last'] = $now;
2623 $this->_sys[
'try_count'] = ($this->_sys[
'try_count'] + 1);
2626 $this->_sys[
'status'] = -1;
2627 $this->_sys[
'try_error'] = ($this->_sys[
'try_error'] + 1);
2628 $msg_class =
'error';
2629 $msg = $this->_msg_error;
2631 $this->_sys[
'status'] = 1;
2632 $this->_sys[
'try_error'] = 0;
2633 $msg_class =
'success';
2634 $msg = $this->_msg_success;
2637 $msg_class =
'init';
2638 $msg = $this->_msg_info;
2641 $replaces = $this->_replaces;
2642 $replaces[
'dbx:select'] = $this->_create_sel_flds;
2643 $replaces[
'dbx:data_table'] = $this->_data_table;
2645 if ($mode ==
'tabulurator') {
2649 if (strpos($tpl,
'|') ===
false) {
2650 $tpl = $this->_dbx_modul .
'|' . $tpl;
2653 $report_tpl = $this->
get_tpl($tpl, $replaces,
'htm', $i);
2656 $report_tpl = $this->
merge_obj($report_tpl, $i);
2658 if ($mode ==
'tabulurator') {
2659 $content = $report_tpl;
2661 if ($fid !=
'pagination') {
2665 $content = str_replace(
'{i}', $i, $content);
2668 $content = str_replace(
'{obj:form_msg}', $msg_tpl, $content);
2670 $content = str_replace(
'[dbx:pagination]',
'', $content);
2671 $content = str_replace(
'{rpt:pages}', (
string) $this->_current_page, $content);
2676 if (is_array($js)) {
2677 foreach ($js as $javascript) {
2678 $javascript = str_replace(
'{i}', $i, $javascript);
2679 $norep_ids .=
dbx()->norep(
"\n" .
'<script type="text/javascript">' . $javascript .
'</script>' .
"\n", $i);
2684 $norep =
'<div class="norep">' . $norep_ids .
'</div>';
2687 $content = str_replace(
'[dbx:js]', $norep, $content);
2698 $content = $haeder . $body . $footer;
2700 if ($fid !=
'pagination') {
2704 if ($fid !=
'pagination') {
2707 $content = str_replace(
'[dbx:pagination]', $ReportPages, $content);
2710 $haeder_report = $this->_haeder_report;
2711 $haeder_page = $this->_haeder_page;
2712 $footer_page = $this->_footer_page;
2713 $footer_report = $this->_footer_report;
2715 $content = str_replace(
'{i}', $i, $content);
2718 $content = str_replace(
'{obj:form_msg}', $msg_tpl, $content);
2725 $content = str_replace(
'[rpt:haeder_report]', $haeder_report, $content);
2726 $content = str_replace(
'[rpt:haeder_page]', $haeder_page, $content);
2727 $content = str_replace(
'[rpt:footer_page]', $footer_page, $content);
2728 $content = str_replace(
'[rpt:footer_report]', $footer_report, $content);
2734 if (is_array($js)) {
2738 foreach ($js as $javascript) {
2739 $javascript = str_replace(
'{i}', $i, $javascript);
2740 $norep_ids .=
dbx()->norep(
"\n" .
'<script type="text/javascript">' . $javascript .
'</script>' .
"\n", $i);
2745 $content = str_replace(
'{i}', $i, $content);
2748 $norep =
'<div class="norep">' . $norep_ids .
'</div>';
2751 $content = str_replace(
'[dbx:js]', $norep, $content);
2752 $content = str_replace(
'[dbx:pagination]',
'', $content);
2753 $content = str_replace(
'{rpt:pages}', $this->_current_page, $content);
$_options_rrows
Seitenlängenoptionen.
$_multi_page_select
Multi-Select seitenübergreifend.
$_options_rdesc
ASC/DESC Optionen.
get_count_selects()
Liefert die Anzahl aktuell selektierter Zeilen.
$_haeder_next_page
Header für Folgeseiten.
get_visible_multi_select_ids()
Liefert die aktuell im Report sichtbaren Select-IDs.
$_rpt_format
Feldformatierungen.
get_multi_selects()
Liest die aktuelle Mehrfachauswahl.
$_footer_page
Seiten-Footer.
send_multi_select_json_response(array $visibleIds=array(), $dbx_do='')
Sendet einen JSON-Response für Multi-Select-AJAX.
$_create_row_undo
Zeilen-Undo aktiv.
$_grid_cols
Grid-Spalten-Definition.
get_sys($name, $default='', $validate='parameter')
Liest einen Systemwert aus Data/Sys/PostGet.
set_style_haeder($key, $style)
render_table_row_data_columns(array $record, array $auto_flds, $fld_id, $defaultClass='auto-fld')
Rendert die automatischen Body-Datenspalten.
render_table_row_action_block(array $record)
Rendert den zentralen Row-Buttonblock.
$_haeder_page
Seiten-Header.
$_grid_export_url
Export-URL.
$_grid_headerfilter
Headerfilter für Grid.
$_footer_next_page
Footer für Folgeseiten.
$_current_report_ln
Aktuelle Report-Zeile insgesamt.
clear()
Löscht den kompletten Report-Zustand und setzt saubere Defaultwerte.
run_page_haeder($content)
$_options_rselect
Auswahloptionen.
forward_get_haeder_page()
$_page_break
Seitenumbruch-Markup.
get_report_body()
Erzeugt den HTML-Body für klassische Reportmodi.
rpt_format($key, $value)
Formatiert einen Reportwert anhand der Felddefinition.
get_visible_multi_select_state(array $visibleIds=array())
Liefert den Multi-Select-Zustand relativ zu den aktuell sichtbaren IDs.
$_count_selects
Caching für Anzahl ausgewählter Datensätze.
del_multi_select_ids(array $ids)
Entfernt mehrere IDs aus der Auswahl.
$_create_row_show
Zeilen-Show aktiv.
$_add_action
Zusatzparameter an Row-Aktionen.
get_record_rid($record, $default=-1)
Liefert die sauber ermittelte Record-ID eines Datensatzes.
$_auto_flds
Automatische Feldliste.
check_is_multiselect($rid)
Prüft, ob eine Zeile aktuell im Multi-Select aktiv ist.
init($fid, $tpl='', $first_page_lines=-1, $next_page_lines=-1, $current_line=-1)
get_report_haeder($content='')
Erzeugt den Report-Header.
$_current_page_ln
Aktuelle Zeile auf aktueller Seite.
$_table_buttons
Buttons links oder rechts.
$_haeder_report
Report-Header außerhalb der eigentlichen Seiten.
forward_run_haeder($content)
$_ajax
AJAX-Linkklasse für klassische Report-Buttons.
$_grid_headersort
Headersort für Grid.
$_rwhere_placeholder
Platzhaltertext für Suchfeld.
$_class_body
Body-Klassen.
del_multi_selects($id)
Entfernt IDs aus dem Remember-basierten Multi-Select.
$_footer_report
Report-Footer außerhalb der eigentlichen Seiten.
$_record
Aktueller Datensatz im Body-Lauf.
add_rwhere_select($rwhere)
Ergänzt eine WHERE-Bedingung um aktuell selektierte IDs.
forward_run_body($content)
forward_run_report_footer($content)
$_fld_haeder
Historischer Header-Name.
get_table_action_definitions()
Liefert die aktivierten Tabellen-Aktionsdefinitionen.
get_table_row_action_data($type, array $record)
Baut das Standard-Datenarray für Row-Aktions-Templates.
$_grid_save_url
Save-URL für Grid.
set_tabel_tpl($tid, $tpl)
Überschreibt ein Tabellen-Template gezielt.
$_create_row_delete
Zeilen-Delete aktiv.
$_mode
Report-Modus: table|tpl|tabulurator.
$_create_row_import
Zeilen-Import aktiv.
$_grid_allow_insert
Insert im Grid erlaubt.
run_page_footer($content)
$_first_page_lines
Maximale Zeilen auf erster Seite.
$_current_page
Aktuelle logische Report-Seite.
$_grid_read_url
Read-URL für Grid.
$_create_row_export
Zeilen-Export aktiv.
run($pages=0, $flds='', $mode='')
render_table_header_select(array $auto_flds, $fld_id, $class, array $select_state)
Rendert die Header-Checkbox für die sichtbaren Rows.
get_report_action_url()
Liefert die Basis-Action-URL des aktuellen Reports.
$_create_row_download
Zeilen-Download aktiv.
$_grid_delete_url
Delete-URL für Grid.
$_but_pagination
Anzahl sichtbarer Pagination-Buttons.
get_sel($name, $default='', $rules='parameter')
get_report_remember_key(string $suffix)
Liefert einen stabilen Remember-Key für reportbezogene Zustände.
$_grid_allow_delete
Delete im Grid erlaubt.
$_rdata_inline
Inline-Modus: Daten werden nur einmal in Body eingefügt.
$_create_sel_flds
Selektionsfelder erstellen.
$_grid_schema
Schema-Name für Grid.
rpt_merge_obj($content)
Fügt reportweite Platzhalter und Report-Objekte in einen String ein.
fast_response_rows_json()
$_rrows
Datensätze pro Seite.
get_record_select_key($record)
Liefert den reportbezogenen Select-Key eines Datensatzes.
forward_run_report_haeder($content)
$_grid_print_url
Print-URL für Grid/Shell.
$_data_table
Daten-Tabellen-/Expander-Schalter.
$_grid_layout
Grid-Layout.
del_selected($dd, $rid=0)
Löscht ausgewählte Datensätze.
$_grid_synctime
Grid-Synctime.
$_footer
Interner Bereich: Footer.
$_msg_confirm_copy
Confirm-Text für Copy.
forward_run_page_footer($content)
forward_get_footer_page()
$_create_row_copy
Zeilen-Copy aktiv.
$_grid_sync_url
Sync-URL für Grid.
$_table_col_count
Anzahl sichtbarer Tabellen-Spalten.
run_report_haeder($content)
$_tpl_pagination
Pagination-Template.
$_next_page_lines
Maximale Zeilen auf Folgeseiten.
set_class_haeder($key, $class='')
set_multi_select($rid)
Fügt eine ID oder alle aktuell geladenen Reportzeilen zur Mehrfachauswahl hinzu.
$_multi_select_work
Interner Multi-Select-Arbeitsmodus.
render_table_header_action_block()
Rendert den zentralen Header-Buttonblock.
$_tabel_tpls
Tabellen-Templates.
$_class_haeder
Header-Klassen.
$_msg_confirm_delete
Confirm-Text für Delete.
$_grid_sort_url
Sort-URL für Grid.
$_scroll_table
Scrollbare Tabelle.
add_where($mode, $select, $where='')
forward_run_footer($content)
add_rwhere_search($sql, $suchWert, $feldListe)
Ergänzt eine Such-WHERE über eine Feldliste.
forward_run_page_haeder($content)
$_body
Interner Bereich: Body.
data_rows($data, $rpos, $rrows)
set_form_selects()
Verarbeitet AJAX-/Select-Aktionen für Report-Mehrfachauswahl.
$_pagelink
Pagination-Link.
apply_tabulurator_request()
set_multi_selects($selects)
Speichert die komplette Mehrfachauswahl per Remember.
normalize_multi_select_key($rid)
Normalisiert einen Multi-Select-Key.
$_create_row_edit
Zeilen-Edit aktiv.
$_create_row_select
Zeilen-Select aktiv.
$_grid_insert_url
Insert-URL für Grid.
$_grid_allow_edit
Edit im Grid erlaubt.
parse_multi_select_ids($raw)
Parst eine ID-Liste in ein sauberes eindeutiges Array.
$_body_inline
Inline-Body.
$_options_rsort
Sortieroptionen.
$_auto_mode
Automatischer Ausgabemodus.
submit()
Öffentliche Submit-Abfrage.
$_style_haeder
Header-Styles.
$_rcount
Gesamtanzahl Datensätze.
del_multi_select($rid)
Entfernt eine ID oder alle IDs aus der Mehrfachauswahl.
run_report_footer($content)
$_create_row_print
Zeilen-Print aktiv.
render_table_header_data_columns(array $auto_flds, $fld_id)
Rendert die automatischen Header-Datenspalten.
$_haeder
Interner Bereich: Header.
render_table_row_select(array $record, $class)
Rendert die Row-Checkbox.
set_multi_select_ids(array $ids)
Fügt mehrere IDs zur Auswahl hinzu.
DBX schema administration.