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';
70 private $_text_forms = array();
78 private function texts(
$fd)
80 if (isset($this->_text_forms[
$fd])) {
81 return $this->_text_forms[
$fd];
84 dbx()->get_system_obj(
'dbxForm',
'use');
85 $form = new \dbxForm();
86 $form->init(
'ddedit-texts-' . $this->safe_id(
$fd));
88 $form->load_fd_messages();
89 $form->set_form_help_enabled(
false);
102 $work =
dbx()->get_modul_var(
'dbx_run2',
'');
106 case 'create_form_table':
107 return $this->create_form_table();
109 case 'create_form_dd':
110 return $this->create_form_dd();
112 case 'create_form_index':
113 return $this->create_form_index();
116 return $this->delete_field();
119 return $this->delete_index();
121 case 'save_field_order':
122 return $this->save_field_order();
124 case 'save_index_order':
125 return $this->save_index_order();
130 return $this->run_editor();
140 private function run_editor()
142 list($modul,
$dd) = $this->dd_params_from_request();
143 $texts = $this->texts($this->_fd_table);
145 if (!$modul || !
$dd) {
146 return $this->alert(
'warning',
$texts->get_fd_message(
'missing_dd_params'));
149 $model = $this->load_model($modul,
$dd);
151 return $this->alert(
'danger',
$texts->format_fd_message(
153 array(
'dd' =>
dbx()->
esc($modul .
'|' .
$dd))
157 $instance_id = $this->instance_id($modul .
'_' .
$dd);
158 $work_target_id =
'dbx_ddedit_work_' . $instance_id;
159 $work_content = $this->create_form_table($modul,
$dd, $model);
160 $fields_order_report = $this->create_fields_order_report($modul,
$dd, $model, $work_target_id);
161 $indexes_report = $this->create_indexes_report($modul,
$dd, $model, $work_target_id);
167 'path' => $this->dd_file_path($modul,
$dd),
169 'work_target_id' => $work_target_id,
170 'table_url' => $this->build_url(
'create_form_table', $modul,
$dd),
171 'new_field_url' => $this->build_url(
'create_form_dd', $modul,
$dd, array(
'field_pos' =>
'new')),
172 'new_index_url' => $this->build_url(
'create_form_index', $modul,
$dd, array(
'index_pos' =>
'new')),
173 'work_content' => $work_content,
174 'fields_order_report' => $fields_order_report,
175 'indexes_report' => $indexes_report,
178 $help =
dbx()->get_include_obj(
'dbxAdminHelp',
'dbxAdmin');
179 $oTPL =
dbx()->get_system_obj(
'dbxTPL');
180 $reloadAction = $oTPL->get_tpl(
'dbx|button-bar-reload-ajax', array(
181 'bar_reload_href' =>
'?dbx_modul=dbxAdmin&dbx_run1=edit_dd&modul=' . rawurlencode($modul) .
'&dd=' . rawurlencode(
$dd),
182 'bar_reload_target' =>
'dbx_ddedit_' . $instance_id,
183 'bar_reload_replace' =>
'target',
185 $barData =
$help->moduleBarTemplateData(
'edit_dd', $reloadAction);
186 $barData[
'bar_title'] =
$texts->format_fd_message(
188 array(
'dd' =>
dbx()->
esc($modul .
'|' .
$dd))
190 $barData[
'bar_subtitle'] =
$texts->get_fd_message(
'bar_subtitle');
191 $barData[
'bar_class'] =
'dbx-module-bar dbx-ddedit-head';
192 $data = array_merge($data, $barData);
194 return $oTPL->get_tpl($this->_admin_modul .
'|ddedit-frame', $data);
206 private function create_form_table($modul =
'',
$dd =
'', $model = array())
208 $texts = $this->texts($this->_fd_table);
209 if (!$modul || !
$dd) {
210 list($modul,
$dd) = $this->dd_params_from_request();
214 $model = $this->load_model($modul,
$dd);
218 return $this->alert(
'danger',
$texts->format_fd_message(
220 array(
'dd' =>
dbx()->
esc($modul .
'|' .
$dd))
224 $data = is_array($model[
'table'] ??
null) ? $model[
'table'] : array();
225 $data[
'modul'] = $modul;
228 $oForm =
dbx()->get_system_obj(
'dbxForm');
229 $oForm->init(
'ddedit_table_' . $this->safe_id($modul .
'_' .
$dd),
'ddedit-table-form');
230 $oForm->_fd = $this->_fd_table;
231 $oForm->load_fd_messages();
232 $oForm->set_form_help_enabled(
false);
233 $oForm->_data = $data;
234 $oForm->_action = $this->build_url(
'create_form_table', $modul,
$dd);
235 $oForm->_msg_info =
$texts->format_fd_message(
'edit_info', array(
'dd' =>
dbx()->
esc(
$dd)));
237 $this->apply_table_right_fields($oForm, $data);
239 if ($oForm->submit()) {
241 if (!$oForm->errors()) {
243 $table = $this->merge_record($data, $oForm->_post, $this->table_keys());
248 $ok = $this->save_model($modul,
$dd, $model);
251 $oForm->_data = array_merge(
$table, array(
'modul' => $modul,
'dd' =>
$dd));
252 $oForm->_msg_success =
$texts->format_fd_message(
'table_saved', array(
'dd' =>
dbx()->
esc(
$dd)));
254 $oForm->_msg_error =
$texts->format_fd_message(
'table_save_error', array(
'dd' =>
dbx()->
esc(
$dd)));
258 $oForm->_msg_error =
$texts->format_fd_message(
'table_check', array(
'dd' =>
dbx()->
esc(
$dd)));
262 return $oForm->run();
275 private function create_form_dd($modul =
'',
$dd =
'', $field_pos =
null, $model = array())
277 $texts = $this->texts($this->_fd_field);
278 if (!$modul || !
$dd) {
279 list($modul,
$dd) = $this->dd_params_from_request();
282 if ($field_pos ===
null) {
283 $field_pos =
dbx()->get_modul_var(
'field_pos',
'new');
287 $model = $this->load_model($modul,
$dd);
291 return $this->alert(
'danger',
$texts->format_fd_message(
293 array(
'dd' =>
dbx()->
esc($modul .
'|' .
$dd))
297 $fields = array_values((array)($model[
'fields'] ?? array()));
298 $is_new = ((string)$field_pos ===
'new');
301 $data = $this->default_field_record();
303 $pos = (int)$field_pos;
305 return $this->alert(
'warning',
$texts->format_fd_message(
306 'position_not_found',
307 array(
'position' =>
dbx()->
esc((
string)$field_pos))
314 $data[
'modul'] = $modul;
316 $data[
'field_pos'] = (string)$field_pos;
317 $data[
'old_name'] = (string)($data[
'name'] ??
'');
319 $form_id =
'ddedit_field_' . $this->safe_id($modul .
'_' .
$dd .
'_' . (
string)$field_pos);
321 $oForm =
dbx()->get_system_obj(
'dbxForm');
322 $oForm->init($form_id,
'ddedit-field-form');
323 $oForm->_fd = $this->_fd_field;
324 $oForm->load_fd_messages();
325 $oForm->set_form_help_enabled(
false);
326 $oForm->_data = $data;
327 $oForm->_action = $this->build_url(
'create_form_dd', $modul,
$dd, array(
'field_pos' => (
string)$field_pos));
328 $oForm->_msg_info = $is_new
329 ?
$texts->format_fd_message(
'edit_new', array(
'dd' =>
dbx()->
esc(
$dd)))
330 :
$texts->format_fd_message(
'edit_existing', array(
'field' =>
dbx()->
esc((
string)($data[
'name'] ?? $field_pos))));
333 if ($oForm->submit()) {
335 if (!$oForm->errors()) {
337 $field = $this->merge_record($data, $oForm->_post, $this->field_keys());
341 if (!$this->validate_field_record(
$field,
$fields, $is_new ? -1 : (
int)$field_pos, $message)) {
342 $oForm->_msg_error = $message;
343 return $oForm->run();
348 $field_pos = count(
$fields) - 1;
354 $model[
'fields'] = array_values(
$fields);
356 $ok = $this->save_model($modul,
$dd, $model);
361 $field[
'field_pos'] = (string)$field_pos;
365 $oForm->_action = $this->build_url(
'create_form_dd', $modul,
$dd, array(
'field_pos' => (
string)$field_pos));
366 $oForm->_msg_success =
$texts->format_fd_message(
368 array(
'field' =>
dbx()->
esc((
string)(
$field[
'name'] ?? $field_pos)))
371 $oForm->_msg_error =
$texts->format_fd_message(
373 array(
'field' =>
dbx()->
esc((
string)(
$field[
'name'] ?? $field_pos)))
378 $oForm->_msg_error =
$texts->format_fd_message(
380 array(
'field' =>
dbx()->
esc((
string)($data[
'name'] ?? $field_pos)))
385 $delete_url = $this->build_url(
'delete_field', $modul,
$dd, array(
'field_pos' => (
string)$field_pos));
388 '&dbx_run2=delete_field&modul={modul}&dd={dd}&field_pos={field_pos}',
404 private function create_form_index($modul =
'',
$dd =
'', $index_pos =
null, $model = array())
406 $texts = $this->texts($this->_fd_index);
407 if (!$modul || !
$dd) {
408 list($modul,
$dd) = $this->dd_params_from_request();
411 if ($index_pos ===
null) {
412 $index_pos =
dbx()->get_modul_var(
'index_pos',
'new');
416 $model = $this->load_model($modul,
$dd);
420 return $this->alert(
'danger',
$texts->format_fd_message(
422 array(
'dd' =>
dbx()->
esc($modul .
'|' .
$dd))
426 $indexes = array_values((array)($model[
'indexes'] ?? array()));
427 $is_new = ((string)$index_pos ===
'new');
430 $data = $this->default_index_record();
432 $pos = (int)$index_pos;
434 return $this->alert(
'warning',
$texts->format_fd_message(
435 'position_not_found',
436 array(
'position' =>
dbx()->
esc((
string)$index_pos))
443 $data[
'modul'] = $modul;
445 $data[
'index_pos'] = (string)$index_pos;
446 $data[
'old_name'] = (string)($data[
'name'] ??
'');
448 $form_id =
'ddedit_index_' . $this->safe_id($modul .
'_' .
$dd .
'_' . (
string)$index_pos);
450 $oForm =
dbx()->get_system_obj(
'dbxForm');
451 $oForm->init($form_id,
'ddedit-index-form');
452 $oForm->_fd = $this->_fd_index;
453 $oForm->load_fd_messages();
454 $oForm->set_form_help_enabled(
false);
455 $oForm->_data = $data;
456 $oForm->_action = $this->build_url(
'create_form_index', $modul,
$dd, array(
'index_pos' => (
string)$index_pos));
457 $oForm->_msg_info = $is_new
458 ?
$texts->format_fd_message(
'edit_new', array(
'dd' =>
dbx()->
esc(
$dd)))
459 :
$texts->format_fd_message(
'edit_existing', array(
'index' =>
dbx()->
esc((
string)($data[
'name'] ?? $index_pos))));
462 if ($oForm->submit()) {
464 if (!$oForm->errors()) {
466 $index = $this->merge_record($data, $oForm->_post, $this->index_keys());
470 if (!$this->validate_index_record(
$index,
$indexes, $is_new ? -1 : (
int)$index_pos, $message)) {
471 $oForm->_msg_error = $message;
472 return $oForm->run();
483 $model[
'indexes'] = array_values(
$indexes);
485 $ok = $this->save_model($modul,
$dd, $model);
490 $index[
'index_pos'] = (string)$index_pos;
494 $oForm->_action = $this->build_url(
'create_form_index', $modul,
$dd, array(
'index_pos' => (
string)$index_pos));
495 $oForm->_msg_success =
$texts->format_fd_message(
497 array(
'index' =>
dbx()->
esc((
string)(
$index[
'name'] ?? $index_pos)))
500 $oForm->_msg_error =
$texts->format_fd_message(
502 array(
'index' =>
dbx()->
esc((
string)(
$index[
'name'] ?? $index_pos)))
507 $oForm->_msg_error =
$texts->format_fd_message(
509 array(
'index' =>
dbx()->
esc((
string)($data[
'name'] ?? $index_pos)))
514 $delete_url = $this->build_url(
'delete_index', $modul,
$dd, array(
'index_pos' => (
string)$index_pos));
517 '&dbx_run2=delete_index&modul={modul}&dd={dd}&index_pos={index_pos}',
532 private function create_fields_report($modul,
$dd, $model)
534 $fields = array_values((array)($model[
'fields'] ?? array()));
542 $row = $this->field_row_defaults();
547 $row[
'modul'] = $modul;
549 $row[
'field_pos'] = (string)$pos;
557 'count' => count(
$rows),
560 $oReport =
dbx()->get_system_obj(
'dbxReport');
561 $oReport->init(
'ddedit_fields_' . $this->safe_id($modul .
'_' .
$dd),
'ddedit-fields-report');
562 $oReport->_mode =
'tpl';
563 $oReport->_data = $data;
564 $oReport->_replaces = $data;
565 $oReport->_rdata =
$rows;
566 $oReport->_rcount = count(
$rows);
567 $oReport->_rrows =
'auto';
568 $oReport->_pages =
false;
573 '[modul=dbxAdmin]dbx_run1=edit_dd&dbx_run2=create_form_dd&modul=' . $modul .
'&dd=' .
$dd .
'&field_pos=new[/modul]'
579 '[modul=dbxAdmin]dbx_run1=edit_dd&dbx_run2=create_form_dd&modul={modul}&dd={dd}&field_pos={field_pos}[/modul]'
582 return $oReport->run();
594 private function create_fields_order_report($modul,
$dd, $model, $target_id =
'')
596 $fields = array_values((array)($model[
'fields'] ?? array()));
604 $row = $this->field_row_defaults();
609 $row[
'modul'] = $modul;
611 $row[
'field_pos'] = (string)$pos;
612 $row[
'sort_no'] = (string)($pos + 1);
613 $row[
'target_id'] = $target_id;
614 $row[
'form_url'] = $this->build_url(
'create_form_dd', $modul,
$dd, array(
'field_pos' => (
string)$pos));
622 'count' => count(
$rows),
623 'target_id' => $target_id,
624 'new_field_url' => $this->build_url(
'create_form_dd', $modul,
$dd, array(
'field_pos' =>
'new')),
627 $oReport =
dbx()->get_system_obj(
'dbxReport');
628 $oReport->init(
'ddedit_fields_order_' . $this->safe_id($modul .
'_' .
$dd),
'ddedit-fields-order-report');
629 $oReport->_mode =
'tpl';
630 $oReport->_data = $data;
631 $oReport->_replaces = $data;
632 $oReport->_rdata =
$rows;
633 $oReport->_rcount = count(
$rows);
634 $oReport->_rrows =
'auto';
635 $oReport->_pages =
false;
637 return $oReport->run();
649 private function create_indexes_report($modul,
$dd, $model, $target_id =
'')
651 $indexes = array_values((array)($model[
'indexes'] ?? array()));
659 $row = $this->index_row_defaults();
664 $row[
'modul'] = $modul;
666 $row[
'index_pos'] = (string)$pos;
667 $row[
'target_id'] = $target_id;
668 $row[
'form_url'] = $this->build_url(
'create_form_index', $modul,
$dd, array(
'index_pos' => (
string)$pos));
676 'count' => count(
$rows),
677 'target_id' => $target_id,
678 'new_index_url' => $this->build_url(
'create_form_index', $modul,
$dd, array(
'index_pos' =>
'new')),
681 $oReport =
dbx()->get_system_obj(
'dbxReport');
682 $oReport->init(
'ddedit_indexes_' . $this->safe_id($modul .
'_' .
$dd),
'ddedit-indexes-report');
683 $oReport->_mode =
'tpl';
684 $oReport->_data = $data;
685 $oReport->_replaces = $data;
686 $oReport->_rdata =
$rows;
687 $oReport->_rcount = count(
$rows);
688 $oReport->_rrows =
'auto';
689 $oReport->_pages =
false;
691 return $oReport->run();
699 private function delete_field()
701 list($modul,
$dd) = $this->dd_params_from_request();
702 $field_pos = (int)
dbx()->get_modul_var(
'field_pos', -1);
703 $texts = $this->texts($this->_fd_field);
705 $model = $this->load_model($modul,
$dd);
707 return $this->alert(
'danger',
$texts->format_fd_message(
709 array(
'dd' =>
dbx()->
esc($modul .
'|' .
$dd))
713 $fields = array_values((array)($model[
'fields'] ?? array()));
714 if (!isset(
$fields[$field_pos])) {
715 return $this->alert(
'warning',
$texts->get_fd_message(
'field_not_found'));
718 $name = (string)(
$fields[$field_pos][
'name'] ?? $field_pos);
721 $model[
'fields'] = array_values(
$fields);
723 $ok = $this->save_model($modul,
$dd, $model);
726 return $this->alert(
'success',
$texts->format_fd_message(
728 array(
'field' =>
dbx()->
esc($name))
732 return $this->alert(
'danger',
$texts->format_fd_message(
733 'field_delete_error',
734 array(
'field' =>
dbx()->
esc($name))
743 private function delete_index()
745 list($modul,
$dd) = $this->dd_params_from_request();
746 $index_pos = (int)
dbx()->get_modul_var(
'index_pos', -1);
747 $texts = $this->texts($this->_fd_index);
749 $model = $this->load_model($modul,
$dd);
751 return $this->alert(
'danger',
$texts->format_fd_message(
753 array(
'dd' =>
dbx()->
esc($modul .
'|' .
$dd))
757 $indexes = array_values((array)($model[
'indexes'] ?? array()));
759 return $this->alert(
'warning',
$texts->get_fd_message(
'index_not_found'));
762 $name = (string)(
$indexes[$index_pos][
'name'] ?? $index_pos);
765 $model[
'indexes'] = array_values(
$indexes);
767 $ok = $this->save_model($modul,
$dd, $model);
770 return $this->alert(
'success',
$texts->format_fd_message(
772 array(
'index' =>
dbx()->
esc($name))
776 return $this->alert(
'danger',
$texts->format_fd_message(
777 'index_delete_error',
778 array(
'index' =>
dbx()->
esc($name))
787 private function save_field_order()
789 list($modul,
$dd) = $this->dd_params_from_request();
790 $order = $this->parse_order(
dbx()->get_modul_var(
'order', array()));
791 $texts = $this->texts($this->_fd_field);
793 $model = $this->load_model($modul,
$dd);
795 dbx()->json_response(array(
797 'msg' =>
$texts->format_fd_message(
'dd_not_found', array(
'dd' => $modul .
'|' .
$dd)),
801 $fields = array_values((array)($model[
'fields'] ?? array()));
804 if ($new ===
false) {
805 dbx()->json_response(array(
'ok' => 0,
'msg' =>
$texts->get_fd_message(
'invalid_order')));
808 $model[
'fields'] = $new;
809 $ok = $this->save_model($modul,
$dd, $model);
811 dbx()->json_response(array(
813 'msg' =>
$ok ?
$texts->get_fd_message(
'order_saved') :
$texts->get_fd_message(
'order_save_error'),
814 'count' => count($new),
825 private function save_index_order()
827 list($modul,
$dd) = $this->dd_params_from_request();
828 $order = $this->parse_order(
dbx()->get_modul_var(
'order', array()));
829 $texts = $this->texts($this->_fd_index);
831 $model = $this->load_model($modul,
$dd);
833 dbx()->json_response(array(
835 'msg' =>
$texts->format_fd_message(
'dd_not_found', array(
'dd' => $modul .
'|' .
$dd)),
839 $indexes = array_values((array)($model[
'indexes'] ?? array()));
842 if ($new ===
false) {
843 dbx()->json_response(array(
'ok' => 0,
'msg' =>
$texts->get_fd_message(
'invalid_order')));
846 $model[
'indexes'] = $new;
847 $ok = $this->save_model($modul,
$dd, $model);
849 dbx()->json_response(array(
851 'msg' =>
$ok ?
$texts->get_fd_message(
'order_saved') :
$texts->get_fd_message(
'order_save_error'),
852 'count' => count($new),
866 private function load_model($modul,
$dd)
868 if (!$modul || !
$dd) {
872 $oDD =
dbx()->get_system_obj(
'dbxDD');
873 $model =
$oDD->get_dd_model($this->dd_ref($modul,
$dd));
875 if (!is_array($model)) {
879 if (!isset($model[
'table']) || !is_array($model[
'table'])) {
880 $model[
'table'] = array();
883 if (!isset($model[
'fields']) || !is_array($model[
'fields'])) {
884 $model[
'fields'] = array();
887 if (!isset($model[
'indexes']) || !is_array($model[
'indexes'])) {
888 $model[
'indexes'] = array();
903 private function save_model($modul,
$dd, $model)
905 if (!$modul || !
$dd || !is_array($model)) {
909 $this->backup_dd_file($modul,
$dd);
911 $table = is_array($model[
'table'] ??
null) ? $model[
'table'] : array();
912 $fields = is_array($model[
'fields'] ??
null) ? array_values($model[
'fields']) : array();
913 $indexes = is_array($model[
'indexes'] ??
null) ? array_values($model[
'indexes']) : array();
915 $oDD =
dbx()->get_system_obj(
'dbxDD');
927 private function apply_table_right_fields($oForm, $data)
929 if (!is_object($oForm) || !method_exists($oForm,
'add_fld')) {
933 foreach (array(
'read',
'create',
'update',
'delete') as $name) {
936 'dbxAdmin|ddedit-rights-select1',
937 rules:
'array|parameter+*',
938 options: $this->table_right_options($data[$name] ??
'',
false)
942 foreach (array(
'read_owner',
'create_owner',
'update_owner',
'delete_owner') as $name) {
945 'dbxAdmin|ddedit-rights-select1',
946 rules:
'array|parameter+*',
947 options: $this->table_right_options($data[$name] ??
'',
true)
960 private function table_right_options($current =
'',
$owner =
false)
967 $options[
'*'] = $this->texts($this->_fd_table)->get_fd_message(
'rights_all');
970 $db =
dbx()->get_system_obj(
'dbxDB');
971 if (is_object(
$db) && method_exists(
$db,
'select')) {
972 $rows =
$db->select(
'dbxUser_groups',
'',
'*',
'name');
973 if (is_array(
$rows)) {
974 foreach (
$rows as $row) {
975 if (!is_array($row)) {
979 $name = trim((
string)($row[
'name'] ??
''));
984 $label = trim((
string)($row[
'description'] ??
''));
985 $options[$name] = $label !==
'' ? $label : $name;
990 foreach ($this->csv_values($current) as
$value) {
1006 private function csv_values(
$value)
1011 $values = explode(
',', (
string)
$value);
1015 foreach ($values as $item) {
1016 $item = trim((
string)$item);
1022 return array_values(array_unique(
$out));
1033 private function backup_dd_file($modul,
$dd)
1035 $file = $this->dd_file_path($modul,
$dd);
1041 if (!is_dir(
$dir)) {
1042 @mkdir(
$dir, 0777,
true);
1045 if (!is_dir(
$dir)) {
1058 private function dd_params_from_request()
1060 $modul = $this->sanitize_name(
dbx()->get_modul_var(
'modul',
''));
1061 $dd = $this->sanitize_name(
dbx()->get_modul_var(
'dd',
''));
1064 $modul = $this->sanitize_name(
dbx()->get_modul_var(
'xmodul',
''));
1068 $modul = $this->sanitize_name($this->get_system_var(
'dbx_activ_modul',
'dbx'));
1071 return array($modul,
$dd);
1082 private function dd_ref($modul,
$dd)
1084 return $modul .
'|' .
$dd;
1095 private function dd_file_path($modul,
$dd)
1097 $file =
dbx()->get_base_dir() .
'dbx/modules/' . $modul .
'/dd/' .
$dd .
'.dd.php';
1112 private function build_url($run2, $modul,
$dd, $extra = array())
1114 $url =
'?dbx_modul=' . $this->_admin_modul .
1115 '&dbx_run1=edit_dd' .
1116 '&dbx_run2=' . rawurlencode($run2) .
1117 '&modul=' . rawurlencode($modul) .
1118 '&dd=' . rawurlencode(
$dd);
1120 foreach ((array)$extra as $key =>
$value) {
1121 $url .=
'&' . rawurlencode((
string)$key) .
'=' . rawurlencode((
string)
$value);
1135 private function get_system_var($name, $default =
'')
1137 if (function_exists(
'dbx')) {
1140 if (is_object($obj) && method_exists($obj,
'get_system_var')) {
1141 $value = $obj->get_system_var($name);
1160 private function merge_record($old, $post,
$keys)
1162 $record = is_array($old) ? $old : array();
1164 foreach ((array)
$keys as $key) {
1165 if (array_key_exists($key, (array)$post)) {
1166 $record[$key] = $this->normalize_value($post[$key]);
1180 private function strip_editor_keys($record)
1182 unset($record[
'modul']);
1183 unset($record[
'dd']);
1184 unset($record[
'field_pos']);
1185 unset($record[
'index_pos']);
1186 unset($record[
'old_name']);
1198 private function normalize_value(
$value)
1201 return implode(
',', array_map(
'trim',
$value));
1204 return trim((
string)
$value);
1214 private function parse_order($raw)
1216 if (is_array($raw)) {
1217 return array_values(array_map(
'intval', $raw));
1220 $raw = trim((
string)$raw);
1225 if (substr($raw, 0, 1) ===
'[') {
1226 $decoded = json_decode($raw,
true);
1227 if (is_array($decoded)) {
1228 return array_values(array_map(
'intval', $decoded));
1232 $parts = preg_split(
'/[|,\s;]+/', $raw);
1233 if (!is_array($parts)) {
1237 return array_values(array_map(
'intval', $parts));
1248 private function reorder_records($records,
$order)
1250 $records = array_values((array)$records);
1251 $count = count($records);
1264 foreach (
$order as $pos) {
1267 if ($pos < 0 || $pos >=
$count || isset($seen[$pos])) {
1272 $new[] = $records[$pos];
1288 private function validate_field_record(
$field,
$fields, $self_pos, &$message)
1290 $name = trim((
string)(
$field[
'name'] ??
''));
1291 $texts = $this->texts($this->_fd_field);
1293 if (!$this->is_identifier($name)) {
1294 $message =
$texts->format_fd_message(
'invalid_field_name', array(
'field' =>
dbx()->
esc($name)));
1299 foreach (array_values((array)
$fields) as $pos => $old) {
1300 if ((
int)$pos === (
int)$self_pos) {
1304 $old_name = strtolower(trim((
string)($old[
'name'] ??
'')));
1305 if ($old_name !==
'') {
1306 $names[$old_name] = 1;
1310 if (isset($names[strtolower($name)])) {
1311 $message =
$texts->format_fd_message(
'duplicate_field_name', array(
'field' =>
dbx()->
esc($name)));
1328 private function validate_index_record(
$index,
$indexes, $self_pos, &$message)
1330 $name = trim((
string)(
$index[
'name'] ??
''));
1331 $type = strtoupper(trim((
string)(
$index[
'type'] ??
'INDEX')));
1333 $texts = $this->texts($this->_fd_index);
1335 if (!$this->is_identifier($name)) {
1336 $message =
$texts->format_fd_message(
'invalid_index_name', array(
'index' =>
dbx()->
esc($name)));
1341 $message =
$texts->get_fd_message(
'missing_index_field');
1345 if (!in_array($type, array(
'PRIMARY',
'INDEX',
'UNIQUE',
'FULLTEXT'),
true)) {
1346 $message =
$texts->format_fd_message(
'invalid_index_type', array(
'type' =>
dbx()->
esc($type)));
1351 foreach (array_values((array)
$indexes) as $pos => $old) {
1352 if ((
int)$pos === (
int)$self_pos) {
1356 $old_name = strtolower(trim((
string)($old[
'name'] ??
'')));
1357 if ($old_name !==
'') {
1358 $names[$old_name] = 1;
1362 if (isset($names[strtolower($name)])) {
1363 $message =
$texts->format_fd_message(
'duplicate_index_name', array(
'index' =>
dbx()->
esc($name)));
1377 private function is_identifier($name)
1379 return (
bool)preg_match(
'/^[A-Za-z_][A-Za-z0-9_]*$/', (
string)$name);
1389 private function sanitize_name($name)
1391 $name = trim((
string)$name);
1393 if (!preg_match(
'/^[A-Za-z0-9_]+$/', $name)) {
1407 private function safe_id(
$value)
1409 $value = preg_replace(
'/[^A-Za-z0-9_]+/',
'_', (
string)
$value);
1422 private function instance_id($seed)
1424 return $this->safe_id($seed .
'_' . substr(md5((
string)$seed), 0, 6));
1435 private function alert($type, $msg)
1437 $type = preg_replace(
'/[^a-z]/',
'', (
string)$type);
1442 return '<div class="alert alert-' . $type .
'">' . $msg .
'</div>';
1450 private function table_keys()
1452 $oDD =
dbx()->get_system_obj(
'dbxDD');
1454 if (is_object(
$oDD) && method_exists(
$oDD,
'dd_table_schema_keys')) {
1455 return $oDD->dd_table_schema_keys();
1488 private function field_keys()
1490 $oDD =
dbx()->get_system_obj(
'dbxDD');
1492 if (is_object(
$oDD) && method_exists(
$oDD,
'dd_field_schema_keys')) {
1493 return array_merge(array(
'modul',
'dd',
'field_pos',
'old_name'),
$oDD->dd_field_schema_keys());
1528 private function index_keys()
1530 $oDD =
dbx()->get_system_obj(
'dbxDD');
1532 if (is_object(
$oDD) && method_exists(
$oDD,
'dd_index_schema_keys')) {
1533 return array_merge(array(
'modul',
'dd',
'index_pos',
'old_name'),
$oDD->dd_index_schema_keys());
1554 private function default_field_record()
1558 'type' =>
'varchar',
1566 'placeholder' =>
'',
1573 'tpl' =>
'text-label',
1584 private function default_index_record()
1600 private function field_row_defaults()
1619 private function index_row_defaults()