49 private $_admin_modul =
'dbxAdmin';
55 private $_fd_table =
'dbxAdmin|ddedit-table';
61 private $_fd_field =
'dbxAdmin|ddedit-field';
67 private $_fd_index =
'dbxAdmin|ddedit-index';
76 $work =
dbx()->get_modul_request_var(
'dbx_run2',
'');
80 case 'create_form_table':
81 return $this->create_form_table();
83 case 'create_form_dd':
84 return $this->create_form_dd();
86 case 'create_form_index':
87 return $this->create_form_index();
90 return $this->delete_field();
93 return $this->delete_index();
95 case 'save_field_order':
96 return $this->save_field_order();
98 case 'save_index_order':
99 return $this->save_index_order();
104 return $this->run_editor();
114 private function run_editor()
116 list($modul, $dd) = $this->dd_params_from_request();
118 if (!$modul || !$dd) {
119 return $this->alert(
'warning',
'Kein DD angegeben. Erwartet: modul und dd.');
122 $model = $this->load_model($modul, $dd);
124 return $this->alert(
'danger',
'DD nicht gefunden oder nicht lesbar: ' .
dbx()->esc($modul .
'|' . $dd));
127 $instance_id = $this->instance_id($modul .
'_' . $dd);
128 $work_target_id =
'dbx_ddedit_work_' . $instance_id;
129 $work_content = $this->create_form_table($modul, $dd, $model);
130 $fields_order_report = $this->create_fields_order_report($modul, $dd, $model, $work_target_id);
131 $indexes_report = $this->create_indexes_report($modul, $dd, $model, $work_target_id);
137 'path' => $this->dd_file_path($modul, $dd),
139 'work_target_id' => $work_target_id,
140 'table_url' => $this->build_url(
'create_form_table', $modul, $dd),
141 'new_field_url' => $this->build_url(
'create_form_dd', $modul, $dd, array(
'field_pos' =>
'new')),
142 'new_index_url' => $this->build_url(
'create_form_index', $modul, $dd, array(
'index_pos' =>
'new')),
143 'work_content' => $work_content,
144 'fields_order_report' => $fields_order_report,
145 'indexes_report' => $indexes_report,
148 $help =
dbx()->get_include_obj(
'dbxAdminHelp',
'dbxAdmin');
149 $oTPL =
dbx()->get_system_obj(
'dbxTPL');
150 $reloadAction = $oTPL->get_tpl(
'dbx|button-bar-reload-ajax', array(
151 'bar_reload_href' =>
'?dbx_modul=dbxAdmin&dbx_run1=edit_dd&modul=' . rawurlencode($modul) .
'&dd=' . rawurlencode($dd),
152 'bar_reload_target' =>
'dbx_ddedit_' . $instance_id,
153 'bar_reload_replace' =>
'target',
155 $barData = $help->moduleBarTemplateData(
'edit_dd', $reloadAction);
156 $barData[
'bar_title'] =
'DD bearbeiten: ' . $modul .
'|' . $dd;
157 $barData[
'bar_class'] =
'dbx-module-bar dbx-ddedit-head';
158 $data = array_merge($data, $barData);
160 return $oTPL->get_tpl($this->_admin_modul .
'|ddedit-frame', $data);
172 private function create_form_table($modul =
'', $dd =
'', $model = array())
174 if (!$modul || !$dd) {
175 list($modul, $dd) = $this->dd_params_from_request();
179 $model = $this->load_model($modul, $dd);
183 return $this->alert(
'danger',
'DD nicht gefunden: ' . dbx()->esc($modul .
'|' . $dd));
186 $data = is_array($model[
'table'] ??
null) ? $model[
'table'] : array();
187 $data[
'modul'] = $modul;
190 $oForm = dbx()->get_system_obj(
'dbxForm');
191 $oForm->init(
'ddedit_table_' . $this->safe_id($modul .
'_' . $dd),
'ddedit-table-form');
192 $oForm->_fd = $this->_fd_table;
193 $oForm->_data = $data;
194 $oForm->_action = $this->build_url(
'create_form_table', $modul, $dd);
195 $oForm->_msg_info =
'Bearbeite Table Daten von DD ' . $dd .
'.';
197 $this->apply_table_right_fields($oForm, $data);
199 if ($oForm->submit()) {
201 if (!$oForm->errors()) {
203 $table = $this->merge_record($data, $oForm->_post, $this->table_keys());
208 $ok = $this->save_model($modul, $dd, $model);
211 $oForm->_data = array_merge(
$table, array(
'modul' => $modul,
'dd' => $dd));
212 $oForm->_msg_success =
'Table Daten von DD ' . $dd .
' gespeichert.';
214 $oForm->_msg_error =
'Table Daten von DD ' . $dd .
' konnten nicht gespeichert werden.';
218 $oForm->_msg_error =
'Table Daten von DD ' . $dd .
' bitte pruefen.';
222 return $oForm->run();
235 private function create_form_dd($modul =
'', $dd =
'', $field_pos =
null, $model = array())
237 if (!$modul || !$dd) {
238 list($modul, $dd) = $this->dd_params_from_request();
241 if ($field_pos ===
null) {
242 $field_pos = dbx()->get_modul_request_var(
'field_pos',
'new');
246 $model = $this->load_model($modul, $dd);
250 return $this->alert(
'danger',
'DD nicht gefunden: ' . dbx()->esc($modul .
'|' . $dd));
253 $fields = array_values((array)($model[
'fields'] ?? array()));
254 $is_new = ((string)$field_pos ===
'new');
257 $data = $this->default_field_record();
259 $pos = (int)$field_pos;
261 return $this->alert(
'warning',
'Feldposition nicht gefunden: ' . dbx()->esc((
string)$field_pos));
267 $data[
'modul'] = $modul;
269 $data[
'field_pos'] = (string)$field_pos;
270 $data[
'old_name'] = (string)($data[
'name'] ??
'');
272 $form_id =
'ddedit_field_' . $this->safe_id($modul .
'_' . $dd .
'_' . (
string)$field_pos);
274 $oForm = dbx()->get_system_obj(
'dbxForm');
275 $oForm->init($form_id,
'ddedit-field-form');
276 $oForm->_fd = $this->_fd_field;
277 $oForm->_data = $data;
278 $oForm->_action = $this->build_url(
'create_form_dd', $modul, $dd, array(
'field_pos' => (
string)$field_pos));
279 $oForm->_msg_info = $is_new
280 ?
'Bearbeite neues Feld fuer DD ' . $dd .
'.'
281 :
'Bearbeite Feld ' . (string)($data[
'name'] ?? $field_pos) .
'.';
284 if ($oForm->submit()) {
286 if (!$oForm->errors()) {
288 $field = $this->merge_record($data, $oForm->_post, $this->field_keys());
292 if (!$this->validate_field_record(
$field,
$fields, $is_new ? -1 : (
int)$field_pos, $message)) {
293 $oForm->_msg_error = $message;
294 return $oForm->run();
299 $field_pos = count(
$fields) - 1;
305 $model[
'fields'] = array_values(
$fields);
307 $ok = $this->save_model($modul, $dd, $model);
312 $field[
'field_pos'] = (string)$field_pos;
316 $oForm->_action = $this->build_url(
'create_form_dd', $modul, $dd, array(
'field_pos' => (
string)$field_pos));
317 $oForm->_msg_success =
'Feld ' . (string)(
$field[
'name'] ?? $field_pos) .
' gespeichert.';
319 $oForm->_msg_error =
'Feld ' . (string)(
$field[
'name'] ?? $field_pos) .
' konnte nicht gespeichert werden.';
323 $oForm->_msg_error =
'Feld ' . (string)($data[
'name'] ?? $field_pos) .
' bitte pruefen.';
327 $delete_url = $this->build_url(
'delete_field', $modul, $dd, array(
'field_pos' => (
string)$field_pos));
330 '&dbx_run2=delete_field&modul={modul}&dd={dd}&field_pos={field_pos}',
331 dbx()->esc($delete_url),
346 private function create_form_index($modul =
'', $dd =
'', $index_pos =
null, $model = array())
348 if (!$modul || !$dd) {
349 list($modul, $dd) = $this->dd_params_from_request();
352 if ($index_pos ===
null) {
353 $index_pos = dbx()->get_modul_request_var(
'index_pos',
'new');
357 $model = $this->load_model($modul, $dd);
361 return $this->alert(
'danger',
'DD nicht gefunden: ' . dbx()->esc($modul .
'|' . $dd));
364 $indexes = array_values((array)($model[
'indexes'] ?? array()));
365 $is_new = ((string)$index_pos ===
'new');
368 $data = $this->default_index_record();
370 $pos = (int)$index_pos;
372 return $this->alert(
'warning',
'Indexposition nicht gefunden: ' . dbx()->esc((
string)$index_pos));
378 $data[
'modul'] = $modul;
380 $data[
'index_pos'] = (string)$index_pos;
381 $data[
'old_name'] = (string)($data[
'name'] ??
'');
383 $form_id =
'ddedit_index_' . $this->safe_id($modul .
'_' . $dd .
'_' . (
string)$index_pos);
385 $oForm = dbx()->get_system_obj(
'dbxForm');
386 $oForm->init($form_id,
'ddedit-index-form');
387 $oForm->_fd = $this->_fd_index;
388 $oForm->_data = $data;
389 $oForm->_action = $this->build_url(
'create_form_index', $modul, $dd, array(
'index_pos' => (
string)$index_pos));
390 $oForm->_msg_info = $is_new
391 ?
'Bearbeite neuen Index fuer DD ' . $dd .
'.'
392 :
'Bearbeite Index ' . (string)($data[
'name'] ?? $index_pos) .
'.';
395 if ($oForm->submit()) {
397 if (!$oForm->errors()) {
399 $index = $this->merge_record($data, $oForm->_post, $this->index_keys());
403 if (!$this->validate_index_record(
$index,
$indexes, $is_new ? -1 : (
int)$index_pos, $message)) {
404 $oForm->_msg_error = $message;
405 return $oForm->run();
416 $model[
'indexes'] = array_values(
$indexes);
418 $ok = $this->save_model($modul, $dd, $model);
423 $index[
'index_pos'] = (string)$index_pos;
427 $oForm->_action = $this->build_url(
'create_form_index', $modul, $dd, array(
'index_pos' => (
string)$index_pos));
428 $oForm->_msg_success =
'Index ' . (string)(
$index[
'name'] ?? $index_pos) .
' gespeichert.';
430 $oForm->_msg_error =
'Index ' . (string)(
$index[
'name'] ?? $index_pos) .
' konnte nicht gespeichert werden.';
434 $oForm->_msg_error =
'Index ' . (string)($data[
'name'] ?? $index_pos) .
' bitte pruefen.';
438 $delete_url = $this->build_url(
'delete_index', $modul, $dd, array(
'index_pos' => (
string)$index_pos));
441 '&dbx_run2=delete_index&modul={modul}&dd={dd}&index_pos={index_pos}',
442 dbx()->esc($delete_url),
456 private function create_fields_report($modul, $dd, $model)
458 $fields = array_values((array)($model[
'fields'] ?? array()));
466 $row = $this->field_row_defaults();
467 foreach (
$field as $key => $value) {
468 $row[$key] = is_array($value) ? implode(
',', $value) : (string)$value;
471 $row[
'modul'] = $modul;
473 $row[
'field_pos'] = (string)$pos;
481 'count' => count($rows),
484 $oReport = dbx()->get_system_obj(
'dbxReport');
485 $oReport->init(
'ddedit_fields_' . $this->safe_id($modul .
'_' . $dd),
'ddedit-fields-report');
486 $oReport->_mode =
'tpl';
487 $oReport->_data = $data;
488 $oReport->_replaces = $data;
489 $oReport->_rdata = $rows;
490 $oReport->_rcount = count($rows);
491 $oReport->_rrows =
'auto';
492 $oReport->_pages =
false;
497 '[modul=dbxAdmin]dbx_run1=edit_dd&dbx_run2=create_form_dd&modul=' . $modul .
'&dd=' . $dd .
'&field_pos=new[/modul]'
503 '[modul=dbxAdmin]dbx_run1=edit_dd&dbx_run2=create_form_dd&modul={modul}&dd={dd}&field_pos={field_pos}[/modul]'
506 return $oReport->run();
518 private function create_fields_order_report($modul, $dd, $model, $target_id =
'')
520 $fields = array_values((array)($model[
'fields'] ?? array()));
528 $row = $this->field_row_defaults();
529 foreach (
$field as $key => $value) {
530 $row[$key] = is_array($value) ? implode(
',', $value) : (string)$value;
533 $row[
'modul'] = $modul;
535 $row[
'field_pos'] = (string)$pos;
536 $row[
'sort_no'] = (string)($pos + 1);
537 $row[
'target_id'] = $target_id;
538 $row[
'form_url'] = $this->build_url(
'create_form_dd', $modul, $dd, array(
'field_pos' => (
string)$pos));
546 'count' => count($rows),
547 'target_id' => $target_id,
548 'new_field_url' => $this->build_url(
'create_form_dd', $modul, $dd, array(
'field_pos' =>
'new')),
551 $oReport = dbx()->get_system_obj(
'dbxReport');
552 $oReport->init(
'ddedit_fields_order_' . $this->safe_id($modul .
'_' . $dd),
'ddedit-fields-order-report');
553 $oReport->_mode =
'tpl';
554 $oReport->_data = $data;
555 $oReport->_replaces = $data;
556 $oReport->_rdata = $rows;
557 $oReport->_rcount = count($rows);
558 $oReport->_rrows =
'auto';
559 $oReport->_pages =
false;
561 return $oReport->run();
573 private function create_indexes_report($modul, $dd, $model, $target_id =
'')
575 $indexes = array_values((array)($model[
'indexes'] ?? array()));
583 $row = $this->index_row_defaults();
584 foreach (
$index as $key => $value) {
585 $row[$key] = is_array($value) ? implode(
',', $value) : (string)$value;
588 $row[
'modul'] = $modul;
590 $row[
'index_pos'] = (string)$pos;
591 $row[
'target_id'] = $target_id;
592 $row[
'form_url'] = $this->build_url(
'create_form_index', $modul, $dd, array(
'index_pos' => (
string)$pos));
600 'count' => count($rows),
601 'target_id' => $target_id,
602 'new_index_url' => $this->build_url(
'create_form_index', $modul, $dd, array(
'index_pos' =>
'new')),
605 $oReport = dbx()->get_system_obj(
'dbxReport');
606 $oReport->init(
'ddedit_indexes_' . $this->safe_id($modul .
'_' . $dd),
'ddedit-indexes-report');
607 $oReport->_mode =
'tpl';
608 $oReport->_data = $data;
609 $oReport->_replaces = $data;
610 $oReport->_rdata = $rows;
611 $oReport->_rcount = count($rows);
612 $oReport->_rrows =
'auto';
613 $oReport->_pages =
false;
615 return $oReport->run();
623 private function delete_field()
625 list($modul, $dd) = $this->dd_params_from_request();
626 $field_pos = (int)dbx()->get_modul_request_var(
'field_pos', -1);
628 $model = $this->load_model($modul, $dd);
630 return $this->alert(
'danger',
'DD nicht gefunden.');
633 $fields = array_values((array)($model[
'fields'] ?? array()));
634 if (!isset(
$fields[$field_pos])) {
635 return $this->alert(
'warning',
'Feld nicht gefunden.');
638 $name = (string)(
$fields[$field_pos][
'name'] ?? $field_pos);
641 $model[
'fields'] = array_values(
$fields);
643 $ok = $this->save_model($modul, $dd, $model);
646 return $this->alert(
'success',
'Feld gelöscht: ' . dbx()->esc($name));
649 return $this->alert(
'danger',
'Feld konnte nicht gelöscht werden: ' . dbx()->esc($name));
657 private function delete_index()
659 list($modul, $dd) = $this->dd_params_from_request();
660 $index_pos = (int)dbx()->get_modul_request_var(
'index_pos', -1);
662 $model = $this->load_model($modul, $dd);
664 return $this->alert(
'danger',
'DD nicht gefunden.');
667 $indexes = array_values((array)($model[
'indexes'] ?? array()));
669 return $this->alert(
'warning',
'Index nicht gefunden.');
672 $name = (string)(
$indexes[$index_pos][
'name'] ?? $index_pos);
675 $model[
'indexes'] = array_values(
$indexes);
677 $ok = $this->save_model($modul, $dd, $model);
680 return $this->alert(
'success',
'Index gelöscht: ' . dbx()->esc($name));
683 return $this->alert(
'danger',
'Index konnte nicht gelöscht werden: ' . dbx()->esc($name));
691 private function save_field_order()
693 list($modul, $dd) = $this->dd_params_from_request();
694 $order = $this->parse_order(dbx()->get_modul_request_var(
'order', array()));
696 $model = $this->load_model($modul, $dd);
698 dbx()->json_response(array(
'ok' => 0,
'msg' =>
'DD nicht gefunden.'));
701 $fields = array_values((array)($model[
'fields'] ?? array()));
702 $new = $this->reorder_records(
$fields, $order);
704 if ($new ===
false) {
705 dbx()->json_response(array(
'ok' => 0,
'msg' =>
'Ungültige Reihenfolge.'));
708 $model[
'fields'] = $new;
709 $ok = $this->save_model($modul, $dd, $model);
711 dbx()->json_response(array(
713 'msg' => $ok ?
'Feldreihenfolge gespeichert.' :
'Feldreihenfolge konnte nicht gespeichert werden.',
714 'count' => count($new),
725 private function save_index_order()
727 list($modul, $dd) = $this->dd_params_from_request();
728 $order = $this->parse_order(dbx()->get_modul_request_var(
'order', array()));
730 $model = $this->load_model($modul, $dd);
732 dbx()->json_response(array(
'ok' => 0,
'msg' =>
'DD nicht gefunden.'));
735 $indexes = array_values((array)($model[
'indexes'] ?? array()));
736 $new = $this->reorder_records(
$indexes, $order);
738 if ($new ===
false) {
739 dbx()->json_response(array(
'ok' => 0,
'msg' =>
'Ungültige Reihenfolge.'));
742 $model[
'indexes'] = $new;
743 $ok = $this->save_model($modul, $dd, $model);
745 dbx()->json_response(array(
747 'msg' => $ok ?
'Indexreihenfolge gespeichert.' :
'Indexreihenfolge konnte nicht gespeichert werden.',
748 'count' => count($new),
762 private function load_model($modul, $dd)
764 if (!$modul || !$dd) {
768 $oDD = dbx()->get_system_obj(
'dbxDD');
769 $model = $oDD->get_dd_model($this->dd_ref($modul, $dd));
771 if (!is_array($model)) {
775 if (!isset($model[
'table']) || !is_array($model[
'table'])) {
776 $model[
'table'] = array();
779 if (!isset($model[
'fields']) || !is_array($model[
'fields'])) {
780 $model[
'fields'] = array();
783 if (!isset($model[
'indexes']) || !is_array($model[
'indexes'])) {
784 $model[
'indexes'] = array();
799 private function save_model($modul, $dd, $model)
801 if (!$modul || !$dd || !is_array($model)) {
805 $this->backup_dd_file($modul, $dd);
807 $table = is_array($model[
'table'] ??
null) ? $model[
'table'] : array();
808 $fields = is_array($model[
'fields'] ??
null) ? array_values($model[
'fields']) : array();
809 $indexes = is_array($model[
'indexes'] ??
null) ? array_values($model[
'indexes']) : array();
811 $oDD = dbx()->get_system_obj(
'dbxDD');
823 private function apply_table_right_fields($oForm, $data)
825 if (!is_object($oForm) || !method_exists($oForm,
'add_fld')) {
829 foreach (array(
'read',
'create',
'update',
'delete') as $name) {
832 'dbxAdmin|ddedit-rights-select1',
833 rules:
'array|parameter+*',
834 options: $this->table_right_options($data[$name] ??
'',
false)
838 foreach (array(
'read_owner',
'create_owner',
'update_owner',
'delete_owner') as $name) {
841 'dbxAdmin|ddedit-rights-select1',
842 rules:
'array|parameter+*',
843 options: $this->table_right_options($data[$name] ??
'',
true)
856 private function table_right_options($current =
'', $owner =
false)
861 $options[
'owner'] =
'owner';
863 $options[
'*'] =
'*Alle*';
866 $db = dbx()->get_system_obj(
'dbxDB');
867 if (is_object(
$db) && method_exists(
$db,
'select')) {
868 $rows =
$db->select(
'dbxUser_groups',
'',
'*',
'name');
869 if (is_array($rows)) {
870 foreach ($rows as $row) {
871 if (!is_array($row)) {
875 $name = trim((
string)($row[
'name'] ??
''));
880 $label = trim((
string)($row[
'description'] ??
''));
881 $options[$name] = $label !==
'' ? $label : $name;
886 foreach ($this->csv_values($current) as $value) {
887 if (!isset($options[$value])) {
888 $options[$value] = $value;
902 private function csv_values($value)
904 if (is_array($value)) {
907 $values = explode(
',', (
string)$value);
911 foreach ($values as $item) {
912 $item = trim((
string)$item);
918 return array_values(array_unique($out));
929 private function backup_dd_file($modul, $dd)
931 $file = $this->dd_file_path($modul, $dd);
932 if (!$file || !file_exists($file)) {
936 $dir = dirname($file) .
'/_backup';
938 @mkdir(
$dir, 0777,
true);
945 $backup =
$dir .
'/' . $dd .
'.' . date(
'Ymd-His') .
'.dd.php';
946 return @copy($file, $backup) ? 1 : 0;
954 private function dd_params_from_request()
956 $modul = $this->sanitize_name(dbx()->get_modul_request_var(
'modul',
''));
957 $dd = $this->sanitize_name(dbx()->get_modul_request_var(
'dd',
''));
960 $modul = $this->sanitize_name(dbx()->get_modul_request_var(
'xmodul',
''));
964 $modul = $this->sanitize_name($this->get_system_var(
'dbx_activ_modul',
'dbx'));
967 return array($modul, $dd);
978 private function dd_ref($modul, $dd)
980 return $modul .
'|' . $dd;
991 private function dd_file_path($modul, $dd)
993 $file =
dbx_get_base_dir() .
'dbx/modules/' . $modul .
'/dd/' . $dd .
'.dd.php';
995 if (function_exists(
'dbx_os_path_file')) {
1012 private function build_url($run2, $modul, $dd, $extra = array())
1014 $url =
'?dbx_modul=' . $this->_admin_modul .
1015 '&dbx_run1=edit_dd' .
1016 '&dbx_run2=' . rawurlencode($run2) .
1017 '&modul=' . rawurlencode($modul) .
1018 '&dd=' . rawurlencode($dd);
1020 foreach ((array)$extra as $key => $value) {
1021 $url .=
'&' . rawurlencode((
string)$key) .
'=' . rawurlencode((
string)$value);
1035 private function get_system_var($name, $default =
'')
1037 if (function_exists(
'dbx')) {
1040 if (is_object($obj) && method_exists($obj,
'get_system_var')) {
1041 $value = $obj->get_system_var($name);
1042 if ($value !==
null && $value !==
'') {
1060 private function merge_record($old, $post, $keys)
1062 $record = is_array($old) ? $old : array();
1064 foreach ((array)$keys as $key) {
1065 if (array_key_exists($key, (array)$post)) {
1066 $record[$key] = $this->normalize_value($post[$key]);
1080 private function strip_editor_keys($record)
1082 unset($record[
'modul']);
1083 unset($record[
'dd']);
1084 unset($record[
'field_pos']);
1085 unset($record[
'index_pos']);
1086 unset($record[
'old_name']);
1098 private function normalize_value($value)
1100 if (is_array($value)) {
1101 return implode(
',', array_map(
'trim', $value));
1104 return trim((
string)$value);
1114 private function parse_order($raw)
1116 if (is_array($raw)) {
1117 return array_values(array_map(
'intval', $raw));
1120 $raw = trim((
string)$raw);
1125 if (substr($raw, 0, 1) ===
'[') {
1126 $decoded = json_decode($raw,
true);
1127 if (is_array($decoded)) {
1128 return array_values(array_map(
'intval', $decoded));
1132 $parts = preg_split(
'/[|,\s;]+/', $raw);
1133 if (!is_array($parts)) {
1137 return array_values(array_map(
'intval', $parts));
1148 private function reorder_records($records, $order)
1150 $records = array_values((array)$records);
1151 $count = count($records);
1157 if (count($order) !==
$count) {
1164 foreach ($order as $pos) {
1167 if ($pos < 0 || $pos >=
$count || isset($seen[$pos])) {
1172 $new[] = $records[$pos];
1188 private function validate_field_record(
$field,
$fields, $self_pos, &$message)
1190 $name = trim((
string)(
$field[
'name'] ??
''));
1192 if (!$this->is_identifier($name)) {
1193 $message =
'Ungültiger Feldname: ' . $name;
1198 foreach (array_values((array)
$fields) as $pos => $old) {
1199 if ((
int)$pos === (
int)$self_pos) {
1203 $old_name = strtolower(trim((
string)($old[
'name'] ??
'')));
1204 if ($old_name !==
'') {
1205 $names[$old_name] = 1;
1209 if (isset($names[strtolower($name)])) {
1210 $message =
'Feldname doppelt: ' . $name;
1227 private function validate_index_record(
$index,
$indexes, $self_pos, &$message)
1229 $name = trim((
string)(
$index[
'name'] ??
''));
1230 $type = strtoupper(trim((
string)(
$index[
'type'] ??
'INDEX')));
1233 if (!$this->is_identifier($name)) {
1234 $message =
'Ungültiger Indexname: ' . $name;
1239 $message =
'Index benötigt mindestens ein Feld.';
1243 if (!in_array($type, array(
'PRIMARY',
'INDEX',
'UNIQUE',
'FULLTEXT'),
true)) {
1244 $message =
'Ungültiger Indextyp: ' . $type;
1249 foreach (array_values((array)
$indexes) as $pos => $old) {
1250 if ((
int)$pos === (
int)$self_pos) {
1254 $old_name = strtolower(trim((
string)($old[
'name'] ??
'')));
1255 if ($old_name !==
'') {
1256 $names[$old_name] = 1;
1260 if (isset($names[strtolower($name)])) {
1261 $message =
'Indexname doppelt: ' . $name;
1275 private function is_identifier($name)
1277 return (
bool)preg_match(
'/^[A-Za-z_][A-Za-z0-9_]*$/', (
string)$name);
1287 private function sanitize_name($name)
1289 $name = trim((
string)$name);
1291 if (!preg_match(
'/^[A-Za-z0-9_]+$/', $name)) {
1305 private function safe_id($value)
1307 $value = preg_replace(
'/[^A-Za-z0-9_]+/',
'_', (
string)$value);
1308 $value = trim($value,
'_');
1310 return $value ?:
'x';
1320 private function instance_id($seed)
1322 return $this->safe_id($seed .
'_' . substr(md5((
string)$seed), 0, 6));
1333 private function alert($type, $msg)
1335 $type = preg_replace(
'/[^a-z]/',
'', (
string)$type);
1340 return '<div class="alert alert-' . $type .
'">' . $msg .
'</div>';
1348 private function table_keys()
1350 $oDD = dbx()->get_system_obj(
'dbxDD');
1352 if (is_object($oDD) && method_exists($oDD,
'dd_table_schema_keys')) {
1353 return $oDD->dd_table_schema_keys();
1386 private function field_keys()
1388 $oDD = dbx()->get_system_obj(
'dbxDD');
1390 if (is_object($oDD) && method_exists($oDD,
'dd_field_schema_keys')) {
1391 return array_merge(array(
'modul',
'dd',
'field_pos',
'old_name'), $oDD->dd_field_schema_keys());
1426 private function index_keys()
1428 $oDD = dbx()->get_system_obj(
'dbxDD');
1430 if (is_object($oDD) && method_exists($oDD,
'dd_index_schema_keys')) {
1431 return array_merge(array(
'modul',
'dd',
'index_pos',
'old_name'), $oDD->dd_index_schema_keys());
1452 private function default_field_record()
1456 'type' =>
'varchar',
1464 'placeholder' =>
'',
1471 'tpl' =>
'text-label',
1482 private function default_index_record()
1498 private function field_row_defaults()
1517 private function index_row_defaults()