From db4103b732db9f4affe1539137da6d54431c3536 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Tue, 8 Oct 2024 21:46:56 +0900 Subject: [PATCH] Implement is_strict and options fields --- .../document/document.admin.controller.php | 17 ++++-- modules/document/document.controller.php | 13 ++++- modules/document/tpl/extra_keys.html | 15 +++++ modules/extravar/models/Value.php | 56 ++++++++++++++++++- modules/extravar/models/ValueCollection.php | 2 +- modules/module/lang/en.php | 6 +- modules/module/lang/ko.php | 6 +- 7 files changed, 104 insertions(+), 11 deletions(-) diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index 6df5bc780..a38e3a00c 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -174,8 +174,14 @@ class DocumentAdminController extends Document $var_idx = Context::get('var_idx'); $name = Context::get('name'); $type = Context::get('type'); - $is_required = Context::get('is_required'); - $default = Context::get('default'); + $is_required = Context::get('is_required') === 'Y' ? 'Y' : 'N'; + $is_strict = Context::get('is_strict') === 'Y' ? 'Y' : 'N'; + $default = trim(utf8_clean(Context::get('default'))); + $options = trim(utf8_clean(Context::get('options'))); + if ($options !== '') + { + $options = array_map('trim', explode("\n", $options)); + } $desc = Context::get('desc') ? Context::get('desc') : ''; $search = Context::get('search'); $eid = Context::get('eid'); @@ -201,8 +207,11 @@ class DocumentAdminController extends Document } // insert or update - $oDocumentController = getController('document'); - $output = $oDocumentController->insertDocumentExtraKey($module_srl, $var_idx, $name, $type, $is_required, $search, $default, $desc, $eid); + $oDocumentController = DocumentController::getInstance(); + $output = $oDocumentController->insertDocumentExtraKey( + $module_srl, $var_idx, $name, $type, $is_required, $search, + $default, $desc, $eid, $is_strict, $options + ); if(!$output->toBool()) return $output; $this->setMessage('success_registed'); diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index c174bec79..da0bbed81 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -1611,11 +1611,16 @@ class DocumentController extends Document * @param string $var_default * @param string $var_desc * @param int $eid + * @param string $var_is_strict + * @param array $var_options * @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) + 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) { - if(!$module_srl || !$var_idx || !$var_name || !$var_type || !$eid) return new BaseObject(-1, 'msg_invalid_request'); + if (!$module_srl || !$var_idx || !$var_name || !$var_type || !$eid) + { + return new BaseObject(-1, 'msg_invalid_request'); + } $obj = new stdClass(); $obj->module_srl = $module_srl; @@ -1623,8 +1628,10 @@ class DocumentController extends Document $obj->var_name = $var_name; $obj->var_type = $var_type; $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_default = $var_default; + $obj->var_options = $var_options ? json_encode($var_options, \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES) : null; $obj->var_desc = $var_desc; $obj->eid = $eid; @@ -3653,7 +3660,7 @@ Content; { foreach($documentExtraKeys AS $extraItem) { - $this->insertDocumentExtraKey($value, $extraItem->idx, $extraItem->name, $extraItem->type, $extraItem->is_required , $extraItem->search , $extraItem->default , $extraItem->desc, $extraItem->eid) ; + $this->insertDocumentExtraKey($value, $extraItem->idx, $extraItem->name, $extraItem->type, $extraItem->is_required , $extraItem->search , $extraItem->default , $extraItem->desc, $extraItem->eid, $extraItem->is_strict, $extraItem->options); } } } diff --git a/modules/document/tpl/extra_keys.html b/modules/document/tpl/extra_keys.html index 6a364f33a..cc9c27b63 100644 --- a/modules/document/tpl/extra_keys.html +++ b/modules/document/tpl/extra_keys.html @@ -49,6 +49,14 @@ +
+ +
+ + +

{$lang->about_extra_vars_is_strict}

+
+
@@ -56,6 +64,13 @@

{$lang->about_extra_vars_default_value}

+
+ +
+ +

{$lang->about_extra_vars_options}

+
+
diff --git a/modules/extravar/models/Value.php b/modules/extravar/models/Value.php index bab9c9f32..9ef8f983a 100644 --- a/modules/extravar/models/Value.php +++ b/modules/extravar/models/Value.php @@ -25,7 +25,9 @@ class Value public $name = ''; public $desc = ''; public $default = null; + public $options = null; public $is_required = 'N'; + public $is_strict = 'N'; public $is_disabled = 'N'; public $is_readonly = 'N'; public $search = 'N'; @@ -55,6 +57,15 @@ class Value 'kr_zip' => true, ]; + /** + * List of types that can have options. + */ + public const OPTION_TYPES = [ + 'checkbox' => true, + 'radio' => true, + 'select' => true, + ]; + /** * Constructor for compatibility with legacy ExtraItem class. * @@ -68,8 +79,11 @@ class Value * @param string $search (Y, N) * @param string $value * @param string $eid + * @param string $parent_type + * @param string $is_strict + * @param string $options */ - function __construct(int $module_srl, int $idx, string $name, string $type = 'text', $default = null, $desc = '', $is_required = 'N', $search = 'N', $value = null, string $eid = '') + 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) { if (!$idx) { @@ -80,11 +94,14 @@ class Value $this->idx = $idx; $this->eid = $eid; $this->type = $type; + $this->parent_type = $parent_type; $this->value = $value; $this->name = $name; $this->desc = $desc; $this->default = $default; + $this->options = $options ? json_decode($options) : null; $this->is_required = $is_required; + $this->is_strict = $is_strict; $this->search = $search; } @@ -133,12 +150,49 @@ class Value 'type' => $this->type, 'value' => self::_getTypeValue($this->type, $this->value), 'default' => self::_getTypeValue($this->type, $this->default), + 'options' => $this->getOptions(), 'input_name' => $this->parent_type === 'document' ? ('extra_vars' . $this->idx) : ($this->input_name ?: $this->eid), 'input_id' => $this->input_id ?: '', ]); return $template->compile(); } + /** + * Check if the current value can have options. + * + * @return bool + */ + public function canHaveOptions(): bool + { + return isset(self::OPTION_TYPES[$this->type]); + } + + /** + * Get options specified by the administrator. + * + * @return array + */ + public function getOptions(): array + { + if (!$this->canHaveOptions()) + { + return []; + } + + if (is_array($this->options)) + { + return $this->options; + } + elseif ($this->default) + { + return explode(',', $this->default); + } + else + { + return []; + } + } + /** * Get the next temporary ID. * diff --git a/modules/extravar/models/ValueCollection.php b/modules/extravar/models/ValueCollection.php index dd9183c6b..0627fffcf 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'); + $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); } } diff --git a/modules/module/lang/en.php b/modules/module/lang/en.php index 9ed0ebbaa..6a81ee07f 100644 --- a/modules/module/lang/en.php +++ b/modules/module/lang/en.php @@ -97,7 +97,11 @@ $lang->about_mobile_page_count = 'You can set the number of page links to move p $lang->about_admin_id = 'You can grant someone permission to manage this module. Please enter the user ID or email address of the person you wish to add.'; $lang->about_grant_deatil = 'Registered users mean users who signed-up to the virtual sites (e.g., cafeXE).'; $lang->about_module = 'Rhymix consists of modules except the basic library. [Module Manage] module will show all installed modules and help you to manage them.'; -$lang->about_extra_vars_default_value = 'If you need to provide multiple choices, you can separate them with a comma.'; +$lang->extra_vars_is_strict = 'Specified values only'; +$lang->extra_vars_options = 'Options'; +$lang->about_extra_vars_is_strict = 'In single and multiple choice fields, only allow the values specified below. If you change the allowed values, it may affect previous posts.'; +$lang->about_extra_vars_default_value = 'In single and multiple choice fields, the default value should be one of the values specified below.'; +$lang->about_extra_vars_options = 'In single and multiple choice fields, please enter the options one in each line.'; $lang->about_search_virtual_site = 'Enter domain of virtual sites. To search modules of non-virtual site, search with blank'; $lang->about_extra_vars_eid_value = 'This is the unique ID for this field.
You can use a combination of Latin alphabets, numbers and underscore(_), as long as it starts with an alphabet.'; $lang->about_extra_vars_column_name = 'This is the name that is actually shown to users.'; diff --git a/modules/module/lang/ko.php b/modules/module/lang/ko.php index bf1d3c437..4b4ffe96a 100644 --- a/modules/module/lang/ko.php +++ b/modules/module/lang/ko.php @@ -96,7 +96,11 @@ $lang->about_mobile_page_count = '목록 하단, 페이지를 이동하는 링 $lang->about_admin_id = '특정 회원에게 이 모듈의 관리 권한을 부여할 수 있습니다. 권한을 부여할 회원의 아이디 또는 이메일 주소를 입력해 주세요.'; $lang->about_grant_deatil = '가입한 사용자는 cafeXE 등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다.'; $lang->about_module = 'Rhymix는 기본 라이브러리를 제외한 나머지는 모두 모듈로 구성되어 있습니다. 모듈 관리 모듈은 설치된 모든 모듈을 보여주고 관리를 돕습니다.'; -$lang->about_extra_vars_default_value = '다중/단일 선택 등 여러 선택지가 주어지는 경우 ','(쉼표)로 구분하면 됩니다.'; +$lang->extra_vars_is_strict = '임의입력 금지'; +$lang->extra_vars_options = '선택지'; +$lang->about_extra_vars_is_strict = '단일/다중 선택에서 미리 주어진 선택지만 입력할 수 있도록 합니다. 선택지를 변경할 경우 기존 게시물에 영향을 줄 수 있습니다.'; +$lang->about_extra_vars_default_value = '단일/다중 선택의 경우, 아래에 입력한 선택지 중 하나여야 합니다.'; +$lang->about_extra_vars_options = '단일/다중 선택 등 여러 선택지가 주어지는 경우, 한 줄에 하나씩 입력하십시오.
구 버전과 달리, 쉼표로 구분하지 않으니 주의하십시오.'; $lang->about_search_virtual_site = '가상 사이트(예:cafeXE) 도메인을 입력한 후 검색하세요. 가상 사이트 이외의 모듈은 내용을 비우고 검색하면 됩니다. (http:// 는 제외)'; $lang->about_extra_vars_eid_value = '시스템 내에서 이 변수를 식별하기 위한 ID값입니다. 예: school
영문, 숫자, _를 조합해서 사용할 수 있으며 첫 글자는 영문이어야 합니다.'; $lang->about_extra_vars_column_name = '사용자에게 보여지는 입력 항목 이름입니다. 예: 학교';