Add numeric value column to extra vars, and add option to mark extra var as sortable #2604 #2559

This commit is contained in:
Kijin Sung 2025-10-23 11:17:24 +09:00
parent 978aecd7a8
commit 2a7eeebcbd
19 changed files with 141 additions and 37 deletions

View file

@ -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';

View file

@ -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 = '확인';

View file

@ -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
*/

View file

@ -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;

View file

@ -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'));
}
}
/**

View file

@ -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);
}

View file

@ -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';
}

View file

@ -10,6 +10,7 @@
<column name="var_is_required" alias="is_required" />
<column name="var_is_strict" alias="is_strict" />
<column name="var_search" alias="search" />
<column name="var_sort" alias="sort" />
<column name="var_default" alias="default" />
<column name="var_options" alias="options" />
<column name="var_desc" alias="desc" />

View file

@ -0,0 +1,13 @@
<query id="getDocumentNumericExtraKeys" action="select">
<tables>
<table name="document_extra_keys" />
</tables>
<columns>
<column name="module_srl" />
<column name="var_idx" />
<column name="var_type" />
</columns>
<conditions>
<condition operation="in" column="var_type" var="var_type" />
</conditions>
</query>

View file

@ -10,6 +10,7 @@
<column name="var_is_required" var="var_is_required" default="N" notnull="notnull" />
<column name="var_is_strict" var="var_is_strict" default="N" notnull="notnull" />
<column name="var_search" var="var_search" default="N" notnull="notnull" />
<column name="var_sort" var="var_sort" default="N" notnull="notnull" />
<column name="var_default" var="var_default" />
<column name="var_options" var="var_options" />
<column name="var_desc" var="var_desc" />

View file

@ -7,6 +7,7 @@
<column name="document_srl" var="document_srl" filter="number" notnull="notnull" />
<column name="var_idx" var="var_idx" filter="number" notnull="notnull" />
<column name="value" var="value" notnull="notnull" />
<column name="sort_value" var="sort_value" />
<column name="lang_code" var="lang_code" />
<column name="eid" var="eid" notnull="notnull" />
</columns>

View file

@ -8,6 +8,7 @@
<column name="var_is_required" var="var_is_required" default="N" notnull="notnull" />
<column name="var_is_strict" var="var_is_strict" default="N" notnull="notnull" />
<column name="var_search" var="var_search" default="N" notnull="notnull" />
<column name="var_sort" var="var_sort" default="N" notnull="notnull" />
<column name="var_default" var="var_default" default="" />
<column name="var_options" var="var_options" default="" />
<column name="var_desc" var="var_desc" />

View file

@ -4,6 +4,7 @@
</tables>
<columns>
<column name="value" var="value" />
<column name="sort_value" var="sort_value" />
<column name="lang_code" var="lang_code" />
<column name="eid" var="eid" />
</columns>

View file

@ -0,0 +1,12 @@
<query id="updateDocumentExtraVarSortValue" action="update">
<tables>
<table name="document_extra_vars" />
</tables>
<columns>
<column name="sort_value" default="CAST(value AS UNSIGNED)" />
</columns>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" filter="number" notnull="notnull" />
<condition operation="equal" column="var_idx" var="var_idx" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -6,6 +6,7 @@
<column name="var_is_required" type="char" size="1" default="N" notnull="notnull" />
<column name="var_is_strict" type="char" size="1" default="N" notnull="notnull" />
<column name="var_search" type="char" size="1" default="N" notnull="notnull" />
<column name="var_sort" type="char" size="1" default="N" notnull="notnull" />
<column name="var_default" type="text" />
<column name="var_options" type="text" />
<column name="var_desc" type="text" />

View file

@ -4,5 +4,6 @@
<column name="var_idx" type="number" size="11" notnull="notnull" unique="unique_extra_vars" />
<column name="lang_code" type="varchar" size="10" notnull="notnull" unique="unique_extra_vars" />
<column name="value" type="bigtext" />
<column name="sort_value" type="bigint" index="idx_sort_value" />
<column name="eid" type="varchar" size="40" />
</table>

View file

@ -86,6 +86,13 @@
<label class="x_inline" for="search_n"><input type="radio" name="search" id="search_n" value="N" checked="checked"|cond="$selected_var->search!='Y'" /> {$lang->not}</label>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">{$lang->cmd_sort}</label>
<div class="x_controls">
<label class="x_inline" for="sort_y"><input type="radio" name="sort" id="sort_y" value="Y" checked="checked"|cond="$selected_var->sort=='Y'" /> {$lang->yes}</label>
<label class="x_inline" for="sort_n"><input type="radio" name="sort" id="sort_n" value="N" checked="checked"|cond="$selected_var->sort!='Y'" /> {$lang->not}</label>
</div>
</div>
<div class="x_clearfix btnArea">
<div class="x_pull-left">
@ -120,6 +127,7 @@
<th>{$lang->default_value}</th>
<th>{$lang->is_required}</th>
<th>{$lang->cmd_search}</th>
<th>{$lang->cmd_sort}</th>
<th>&nbsp;</th>
</tr>
</thead>
@ -138,6 +146,7 @@
<td>{$val->default}&nbsp;</td>
<td class="nowr"><!--@if($val->is_required=='Y')--><strong>Y</strong><!--@else-->N<!--@end--></td>
<td class="nowr"><!--@if($val->search=='Y')--><strong>Y</strong><!--@else-->N<!--@end--></td>
<td class="nowr"><!--@if($val->sort=='Y')--><strong>Y</strong><!--@else-->N<!--@end--></td>
<td class="nowr" style="text-align:right">
<block cond="$val->idx > 1">
<button type="button" class="x_icon-arrow-up" onclick="moveVar('up','{$module_srl}','{$val->idx}')">{$lang->cmd_move_up}</button>

View file

@ -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;
}
/**

View file

@ -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');
}
}