From 2a7eeebcbdb9d1b843d107d541749737e9094c3c Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Thu, 23 Oct 2025 11:17:24 +0900 Subject: [PATCH] Add numeric value column to extra vars, and add option to mark extra var as sortable #2604 #2559 --- common/lang/en.php | 1 + common/lang/ko.php | 1 + modules/board/board.view.php | 6 ++- .../document/document.admin.controller.php | 5 +- modules/document/document.class.php | 35 +++++++++++++ modules/document/document.controller.php | 49 +++++++++++-------- modules/document/document.model.php | 33 ++++++++----- .../document/queries/getDocumentExtraKeys.xml | 1 + .../queries/getDocumentNumericExtraKeys.xml | 13 +++++ .../queries/insertDocumentExtraKey.xml | 1 + .../queries/insertDocumentExtraVar.xml | 1 + .../queries/updateDocumentExtraKey.xml | 1 + .../queries/updateDocumentExtraVar.xml | 1 + .../updateDocumentExtraVarSortValue.xml | 12 +++++ .../document/schemas/document_extra_keys.xml | 1 + .../document/schemas/document_extra_vars.xml | 1 + modules/document/tpl/extra_keys.html | 9 ++++ modules/extravar/models/Value.php | 5 +- modules/extravar/models/ValueCollection.php | 2 +- 19 files changed, 141 insertions(+), 37 deletions(-) create mode 100644 modules/document/queries/getDocumentNumericExtraKeys.xml create mode 100644 modules/document/queries/updateDocumentExtraVarSortValue.xml diff --git a/common/lang/en.php b/common/lang/en.php index 561616c76..80add8d75 100644 --- a/common/lang/en.php +++ b/common/lang/en.php @@ -22,6 +22,7 @@ $lang->cmd_upload = 'Upload'; $lang->cmd_load = 'Load'; $lang->cmd_input = 'Input'; $lang->cmd_search = 'Search'; +$lang->cmd_sort = 'Sort'; $lang->cmd_find = 'Find'; $lang->cmd_replace = 'Replace'; $lang->cmd_confirm = 'Confirm'; diff --git a/common/lang/ko.php b/common/lang/ko.php index 3a5cce58b..44225b526 100644 --- a/common/lang/ko.php +++ b/common/lang/ko.php @@ -22,6 +22,7 @@ $lang->cmd_upload = '업로드'; $lang->cmd_load = '불러오기'; $lang->cmd_input = '입력'; $lang->cmd_search = '검색'; +$lang->cmd_sort = '정렬'; $lang->cmd_find = '찾기'; $lang->cmd_replace = '바꾸기'; $lang->cmd_confirm = '확인'; diff --git a/modules/board/board.view.php b/modules/board/board.view.php index f59799337..2cb88d6f3 100644 --- a/modules/board/board.view.php +++ b/modules/board/board.view.php @@ -100,9 +100,13 @@ class BoardView extends Board { foreach($extra_keys as $val) { - $this->order_target[] = $val->eid; + if ($val->sort === 'Y') + { + $this->order_target[] = $val->eid; + } } } + /** * load javascript, JS filters */ diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index 6f8f5b7fb..a46595605 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -183,7 +183,8 @@ class DocumentAdminController extends Document $options = array_map('trim', explode("\n", $options)); } $desc = Context::get('desc') ? Context::get('desc') : ''; - $search = Context::get('search'); + $search = Context::get('search') === 'Y' ? 'Y' : 'N'; + $sort = Context::get('sort') === 'Y' ? 'Y' : 'N'; $eid = Context::get('eid'); $obj = new stdClass(); @@ -210,7 +211,7 @@ class DocumentAdminController extends Document $oDocumentController = DocumentController::getInstance(); $output = $oDocumentController->insertDocumentExtraKey( $module_srl, $var_idx, $name, $type, $is_required, $search, - $default, $desc, $eid, $is_strict, $options + $default, $desc, $eid, $is_strict, $options, $sort ); if(!$output->toBool()) return $output; diff --git a/modules/document/document.class.php b/modules/document/document.class.php index c1b7093c4..d7cc50134 100644 --- a/modules/document/document.class.php +++ b/modules/document/document.class.php @@ -113,6 +113,10 @@ class Document extends ModuleObject if(!$oDB->isColumnExists('document_extra_keys', 'var_is_strict')) return true; if(!$oDB->isColumnExists('document_extra_keys', 'var_options')) return true; + // 2025.10.23 Add sort to document_extra_keys table, and sort_value to document_extra_vars table + if(!$oDB->isColumnExists('document_extra_keys', 'var_sort')) return true; + if(!$oDB->isColumnExists('document_extra_vars', 'sort_value') || !$oDB->isIndexExists('document_extra_vars', 'idx_sort_value')) return true; + return false; } @@ -233,6 +237,37 @@ class Document extends ModuleObject { $oDB->addColumn('document_extra_keys', 'var_options', 'text', null, null, false, 'var_default'); } + + // 2025.10.23 Add sort to document_extra_keys table, and sort_value to document_extra_vars table + if(!$oDB->isColumnExists('document_extra_keys', 'var_sort')) + { + $oDB->addColumn('document_extra_keys', 'var_sort', 'char', '1', 'N', true, 'var_search'); + } + if(!$oDB->isColumnExists('document_extra_vars', 'sort_value') || !$oDB->isIndexExists('document_extra_vars', 'idx_sort_value')) + { + $oDB->addColumn('document_extra_vars', 'sort_value', 'bigint', null, null, false, 'value'); + $oDB->begin(); + $output = executeQueryArray('document.getDocumentNumericExtraKeys', ['var_type' => 'number']); + if (!$output->toBool()) + { + $oDB->rollback(); + return $output; + } + foreach ($output->data ?? [] as $item) + { + $output = executeQuery('document.updateDocumentExtraVarSortValue', [ + 'module_srl' => $item->module_srl, + 'var_idx' => $item->var_idx, + ]); + if (!$output->toBool()) + { + $oDB->rollback(); + return $output; + } + } + $oDB->commit(); + $oDB->addIndex('document_extra_vars', 'idx_sort_value', array('sort_value')); + } } /** diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 5f390ec43..373915ef8 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -846,7 +846,7 @@ class DocumentController extends Document { foreach($extra_keys as $idx => $extra_item) { - $value = NULL; + $value = $sort_value = null; if(isset($obj->{'extra_vars'.$idx})) { $tmp = $obj->{'extra_vars'.$idx}; @@ -899,7 +899,11 @@ class DocumentController extends Document } $extra_vars[$extra_item->name] = $value; - $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, $idx, $value, $extra_item->eid); + if ($extra_item->type === 'number') + { + $sort_value = (int)$value; + } + $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, $idx, $value, $extra_item->eid, null, $sort_value); } } @@ -1229,7 +1233,7 @@ class DocumentController extends Document { foreach($extra_keys as $idx => $extra_item) { - $value = NULL; + $value = $sort_value = null; if(isset($obj->{'extra_vars'.$idx})) { $tmp = $obj->{'extra_vars'.$idx}; @@ -1326,7 +1330,11 @@ class DocumentController extends Document } } $extra_vars[$extra_item->name] = $value; - $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, $idx, $value, $extra_item->eid); + if ($extra_item->type === 'number') + { + $sort_value = (int)$value; + } + $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, $idx, $value, $extra_item->eid, null, $sort_value); } } @@ -1774,9 +1782,10 @@ class DocumentController extends Document * @param int $eid * @param string $var_is_strict * @param array $var_options + * @param string $var_sort * @return object */ - function insertDocumentExtraKey($module_srl, $var_idx, $var_name, $var_type, $var_is_required = 'N', $var_search = 'N', $var_default = '', $var_desc = '', $eid = 0, $var_is_strict = 'N', $var_options = null) + function insertDocumentExtraKey($module_srl, $var_idx, $var_name, $var_type, $var_is_required = 'N', $var_search = 'N', $var_default = '', $var_desc = '', $eid = 0, $var_is_strict = 'N', $var_options = null, $var_sort = 'N') { if (!$module_srl || !$var_idx || !$var_name || !$var_type || !$eid) { @@ -1791,6 +1800,7 @@ class DocumentController extends Document $obj->var_is_required = $var_is_required=='Y'?'Y':'N'; $obj->var_is_strict = $var_is_strict=='Y'?'Y':'N'; $obj->var_search = $var_search=='Y'?'Y':'N'; + $obj->var_sort = $var_sort=='Y'?'Y':'N'; $obj->var_default = $var_default; $obj->var_options = $var_options ? json_encode($var_options, \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES) : null; $obj->var_desc = $var_desc; @@ -1878,9 +1888,10 @@ class DocumentController extends Document * @param mixed $value * @param int $eid * @param string $lang_code - * @return Object|void + * @param ?int $sort_value + * @return BaseObject */ - public static function insertDocumentExtraVar($module_srl, $document_srl, $idx_or_eid, $value, $eid = null, $lang_code = null) + public static function insertDocumentExtraVar($module_srl, $document_srl, $idx_or_eid, $value, $eid = null, $lang_code = null, $sort_value = null) { if(!$module_srl || !$document_srl || !$idx_or_eid || !isset($value)) { @@ -1913,6 +1924,7 @@ class DocumentController extends Document $obj->document_srl = $document_srl; $obj->var_idx = $idx_or_eid; $obj->value = $value; + $obj->sort_value = $sort_value; $obj->lang_code = $lang_code ?: Context::getLangType(); $obj->eid = $eid; @@ -1927,9 +1939,10 @@ class DocumentController extends Document * @param mixed $value * @param int $eid * @param string $lang_code - * @return Object|void + * @param ?int $sort_value + * @return BaseObject */ - public static function updateDocumentExtraVar($module_srl, $document_srl, $idx_or_eid, $value, $eid = null, $lang_code = null) + public static function updateDocumentExtraVar($module_srl, $document_srl, $idx_or_eid, $value, $eid = null, $lang_code = null, $sort_value = null) { if(!$module_srl || !$document_srl || !$idx_or_eid || !isset($value)) { @@ -1957,13 +1970,10 @@ class DocumentController extends Document } } - $obj = new stdClass; - $obj->module_srl = $module_srl; - $obj->document_srl = $document_srl; - $obj->var_idx = $idx_or_eid; - $obj->value = $value; - $obj->lang_code = $lang_code ?: Context::getLangType(); - $obj->eid = $eid; + if (!$lang_code) + { + $lang_code = Context::getLangType(); + } $oDB = DB::getInstance(); $oDB->begin(); @@ -1975,7 +1985,7 @@ class DocumentController extends Document return $output; } - $output = self::insertDocumentExtraVar($module_srl, $document_srl, $idx_or_eid, $value, $eid, $lang_code); + $output = self::insertDocumentExtraVar($module_srl, $document_srl, $idx_or_eid, $value, $eid, $lang_code, $sort_value); if (!$output->toBool()) { $oDB->rollback(); @@ -1993,7 +2003,7 @@ class DocumentController extends Document * @param int $var_idx * @param string $lang_code * @param int $eid - * @return $output + * @return BaseObject */ public static function deleteDocumentExtraVars($module_srl, $document_srl = null, $var_idx = null, $lang_code = null, $eid = null) { @@ -2003,8 +2013,7 @@ class DocumentController extends Document if(!is_null($var_idx)) $obj->var_idx = $var_idx; if(!is_null($lang_code)) $obj->lang_code = $lang_code; if(!is_null($eid)) $obj->eid = $eid; - $output = executeQuery('document.deleteDocumentExtraVars', $obj); - return $output; + return executeQuery('document.deleteDocumentExtraVars', $obj); } diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 2f4c9f712..ecbf4dde2 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -239,6 +239,7 @@ class DocumentModel extends Document $sort_check = self::_setSortIndex($obj, $load_extra_vars); $obj->sort_index = $sort_check->sort_index; $obj->isExtraVars = $sort_check->isExtraVars; + $obj->isExtraVarsSortAsNumber = $sort_check->isExtraVarsSortAsNumber; $obj->except_notice = $except_notice; $obj->columnList = $columnList; @@ -672,6 +673,7 @@ class DocumentModel extends Document $sort_check = self::_setSortIndex($opt); $opt->sort_index = $sort_check->sort_index; $opt->isExtraVars = $sort_check->isExtraVars; + $opt->isExtraVarsSortAsNumber = $sort_check->isExtraVarsSortAsNumber; self::_setSearchOption($opt, $args, $query_id, $use_division); @@ -1363,20 +1365,20 @@ class DocumentModel extends Document return $args; } - $eids = array(); - foreach($extra_keys as $idx => $key) + foreach($extra_keys as $extra_key) { - $eids[] = $key->eid; + if ($args->sort_index === $extra_key->eid) + { + $args->isExtraVars = true; + if ($extra_key->type === 'number') + { + $args->isExtraVarsSortAsNumber = true; + } + return $args; + } } - // check it exists in extra keys of the module - if(!in_array($args->sort_index, $eids)) - { - $args->sort_index = 'list_order'; - return $args; - } - - $args->isExtraVars = true; + $args->sort_index = 'list_order'; return $args; } @@ -1556,7 +1558,14 @@ class DocumentModel extends Document { $args->sort_eid = $args->sort_index; $args->sort_lang = Context::getLangType(); - $args->sort_index = 'extra_sort.value'; + if ($searchOpt->isExtraVarsSortAsNumber ?? false) + { + $args->sort_index = 'extra_sort.sort_value'; + } + else + { + $args->sort_index = 'extra_sort.value'; + } } $query_id = 'document.getDocumentListWithExtraVars'; } diff --git a/modules/document/queries/getDocumentExtraKeys.xml b/modules/document/queries/getDocumentExtraKeys.xml index c708322ea..b7c0e0ccf 100644 --- a/modules/document/queries/getDocumentExtraKeys.xml +++ b/modules/document/queries/getDocumentExtraKeys.xml @@ -10,6 +10,7 @@ + diff --git a/modules/document/queries/getDocumentNumericExtraKeys.xml b/modules/document/queries/getDocumentNumericExtraKeys.xml new file mode 100644 index 000000000..31f70a636 --- /dev/null +++ b/modules/document/queries/getDocumentNumericExtraKeys.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/modules/document/queries/insertDocumentExtraKey.xml b/modules/document/queries/insertDocumentExtraKey.xml index 6c0983add..986726eea 100644 --- a/modules/document/queries/insertDocumentExtraKey.xml +++ b/modules/document/queries/insertDocumentExtraKey.xml @@ -10,6 +10,7 @@ + diff --git a/modules/document/queries/insertDocumentExtraVar.xml b/modules/document/queries/insertDocumentExtraVar.xml index cef45f439..ce00dd1b4 100644 --- a/modules/document/queries/insertDocumentExtraVar.xml +++ b/modules/document/queries/insertDocumentExtraVar.xml @@ -7,6 +7,7 @@ + diff --git a/modules/document/queries/updateDocumentExtraKey.xml b/modules/document/queries/updateDocumentExtraKey.xml index ce470af09..0f39fad1b 100644 --- a/modules/document/queries/updateDocumentExtraKey.xml +++ b/modules/document/queries/updateDocumentExtraKey.xml @@ -8,6 +8,7 @@ + diff --git a/modules/document/queries/updateDocumentExtraVar.xml b/modules/document/queries/updateDocumentExtraVar.xml index 58050bbb2..4242b57d6 100644 --- a/modules/document/queries/updateDocumentExtraVar.xml +++ b/modules/document/queries/updateDocumentExtraVar.xml @@ -4,6 +4,7 @@ + diff --git a/modules/document/queries/updateDocumentExtraVarSortValue.xml b/modules/document/queries/updateDocumentExtraVarSortValue.xml new file mode 100644 index 000000000..f7b3e59ca --- /dev/null +++ b/modules/document/queries/updateDocumentExtraVarSortValue.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/document/schemas/document_extra_keys.xml b/modules/document/schemas/document_extra_keys.xml index e54a5c544..802d0d398 100644 --- a/modules/document/schemas/document_extra_keys.xml +++ b/modules/document/schemas/document_extra_keys.xml @@ -6,6 +6,7 @@ + diff --git a/modules/document/schemas/document_extra_vars.xml b/modules/document/schemas/document_extra_vars.xml index 36e3df05f..bb24e1044 100644 --- a/modules/document/schemas/document_extra_vars.xml +++ b/modules/document/schemas/document_extra_vars.xml @@ -4,5 +4,6 @@ +
diff --git a/modules/document/tpl/extra_keys.html b/modules/document/tpl/extra_keys.html index 8bdb07b6d..d9a9f9268 100644 --- a/modules/document/tpl/extra_keys.html +++ b/modules/document/tpl/extra_keys.html @@ -86,6 +86,13 @@ +
+ +
+ + +
+
@@ -120,6 +127,7 @@ {$lang->default_value} {$lang->is_required} {$lang->cmd_search} + {$lang->cmd_sort}   @@ -138,6 +146,7 @@ {$val->default}  YN YN + YN diff --git a/modules/extravar/models/Value.php b/modules/extravar/models/Value.php index d72a9b00e..5bf9d2dd3 100644 --- a/modules/extravar/models/Value.php +++ b/modules/extravar/models/Value.php @@ -36,6 +36,7 @@ class Value public $is_disabled = 'N'; public $is_readonly = 'N'; public $search = 'N'; + public $sort = 'N'; public $style = null; /** @@ -87,8 +88,9 @@ class Value * @param string $parent_type * @param string $is_strict * @param string $options + * @param string $sort */ - function __construct(int $module_srl, int $idx, string $name, string $type = 'text', $default = null, $desc = '', $is_required = 'N', $search = 'N', $value = null, $eid = '', $parent_type = 'document', $is_strict = '', $options = null) + function __construct(int $module_srl, int $idx, string $name, string $type = 'text', $default = null, $desc = '', $is_required = 'N', $search = 'N', $value = null, $eid = '', $parent_type = 'document', $is_strict = '', $options = null, $sort = 'N') { if (!$idx) { @@ -108,6 +110,7 @@ class Value $this->is_required = $is_required; $this->is_strict = $is_strict; $this->search = $search; + $this->sort = $sort; } /** diff --git a/modules/extravar/models/ValueCollection.php b/modules/extravar/models/ValueCollection.php index 0627fffcf..a3d0b3add 100644 --- a/modules/extravar/models/ValueCollection.php +++ b/modules/extravar/models/ValueCollection.php @@ -50,7 +50,7 @@ class ValueCollection foreach ($keys as $val) { - $this->keys[$val->idx] = new Value($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value ?? null, $val->eid, $val->parent_type ?? 'document', $val->is_strict, $val->options); + $this->keys[$val->idx] = new Value($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value ?? null, $val->eid, $val->parent_type ?? 'document', $val->is_strict, $val->options, $val->sort ?? 'N'); } }