From 98b6c95c8989000a452b7b641628127f5659f16e Mon Sep 17 00:00:00 2001 From: Arcturus Date: Thu, 18 Sep 2025 09:53:20 +0900 Subject: [PATCH] patch-1 --- AvocadoAmber/adm/admin.amber.lib.php | 402 ++++++++++++++++++ AvocadoAmber/adm/admin.lib.php | 2 + AvocadoAmber/adm/community_form.php | 170 ++------ AvocadoAmber/adm/css/admin.amber.lib.css | 257 +++++++++++ AvocadoAmber/adm/migrate/_common.php | 12 + .../{ => migrate}/_create_community_db.php | 0 AvocadoAmber/adm/site_config_form.php | 244 ++++------- AvocadoAmber/head.sub.php | 1 + 8 files changed, 785 insertions(+), 303 deletions(-) create mode 100644 AvocadoAmber/adm/admin.amber.lib.php create mode 100644 AvocadoAmber/adm/css/admin.amber.lib.css create mode 100644 AvocadoAmber/adm/migrate/_common.php rename AvocadoAmber/adm/{ => migrate}/_create_community_db.php (100%) diff --git a/AvocadoAmber/adm/admin.amber.lib.php b/AvocadoAmber/adm/admin.amber.lib.php new file mode 100644 index 0000000..663bcb5 --- /dev/null +++ b/AvocadoAmber/adm/admin.amber.lib.php @@ -0,0 +1,402 @@ + +function addListItem(containerId, placeholder) { + var container = document.getElementById(containerId); + var newItem = document.createElement('div'); + var adder = document.getElementById(`\${containerId}_new`); + var content = adder?.value; + + newItem.className = 'adm-listedit-item'; + newItem.innerHTML = '' + + ''; + container.appendChild(newItem); + adder.value = ''; + + var newInput = newItem.querySelector('input[type=\"text\"]'); + var optionKey = containerId.replace('_items', ''); + + newInput.addEventListener('input', function() { + updateListHiddenInput(optionKey); + }); + + // Enter 키 이벤트 추가 + newInput.addEventListener('keydown', function(e) { + if (e.key === 'Enter' || e.keyCode === 13) { + e.preventDefault(); + var placeholder = newInput.getAttribute('placeholder'); + addListItem(containerId, placeholder); + } + }); + + // 포커스를 새로 추가된 입력 필드에 설정 + adder.focus(); + + updateListHiddenInput(optionKey); +} + +function removeListItem(button) { + var item = button.parentElement; + var container = item.parentElement; + var optionKey = container.id.replace('_items', ''); + + // 최소 하나의 입력 필드는 유지 (추가 버튼 제외) + var inputItems = container.querySelectorAll('.adm-listedit-item:not(.adm-listedit-add-row)'); + if (inputItems.length > 1) { + item.remove ? item.remove() : item.parentNode.removeChild(item); + } else { + // 마지막 항목인 경우 입력값만 비우기 + var input = item.querySelector('input[type=\"text\"]'); + input.value = ''; + } + updateListHiddenInput(optionKey); +} + +function updateListHiddenInput(optionKey) { + var container = document.getElementById(optionKey + '_items'); + var listContainer = document.getElementById(optionKey + '_container'); + var separator = listContainer.getAttribute('data-separator'); + var inputs = container.querySelectorAll('input[type=\"text\"]'); + var values = []; + + for (var i = 0; i < inputs.length; i++) { + var value = inputs[i].value.trim(); + if (value) { + values.push(value); + } + } + + var hiddenInput = document.getElementById(optionKey + '_hidden'); + hiddenInput.value = values.join(separator); +} + +// DOM 로드 후 이벤트 리스너 설정 +function initializeListEdit() { + var containers = document.querySelectorAll('.adm-listedit-items'); + + for (var i = 0; i < containers.length; i++) { + var container = containers[i]; + var optionKey = container.id.replace('_items', ''); + var inputs = container.querySelectorAll('input[type=\"text\"]'); + + for (var j = 0; j < inputs.length; j++) { + var input = inputs[j]; + + (function(inp, key) { + inp.addEventListener('input', function() { + updateListHiddenInput(key); + }); + })(input, optionKey); + } + + // 새 입력칸에 Enter 키 이벤트 추가 + var newInput = document.getElementById(optionKey + '_new_input'); + if (newInput) { + newInput.addEventListener('keydown', function(e) { + if (e.key === 'Enter' || e.keyCode === 13) { + e.preventDefault(); + var optKey = this.id.replace('_new_input', ''); + addListItemFromInput(optKey); + } + }); + } + } + + // 폼 제출 전에 한 번 더 업데이트 + var forms = document.querySelectorAll('form'); + for (var k = 0; k < forms.length; k++) { + forms[k].addEventListener('submit', function() { + for (var l = 0; l < containers.length; l++) { + var container = containers[l]; + var optionKey = container.id.replace('_items', ''); + updateListHiddenInput(optionKey); + } + }); + } +} + +// DOM 로드 완료 시 초기화 +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initializeListEdit); +} else { + initializeListEdit(); +} +"; + + add_javascript($scripts, 10); + } +} + +function getCurrentValue($key, $value) +{ + initCheckNeedUpdate(); + return is_array($value) ? ( isset($value[$key]) ? $value[$key] : "" ) : $value; +} + +function getSkinDir($skin, $skin_path = G5_SKIN_PATH) +{ + global $g5; + $result_array = []; + $dirname = implode(DIRECTORY_SEPARATOR, [$skin_path, $skin, ""]); + if (!is_dir($dirname)) + return; + + $handle = opendir($dirname); + while ($file = readdir($handle)) { + if ($file == '.' || $file == '..') + continue; + + if (is_dir($dirname . $file)) + $result_array[$file] = $file; + } + closedir($handle); + sort($result_array); + + return $result_array; +} + +function getSkinList($skin_type) +{ + global $config; + $skins = []; + if (defined('G5_THEME_PATH') && $config['cf_theme']) { + $dirs = getSkinDir($skin_type, G5_THEME_PATH . '/' . G5_SKIN_DIR); + if (!empty($dirs)) { + foreach ($dirs as $dir) { + $skins[$dir] = "theme/{$dir}"; + } + } + } + + $ret = []; + $dir = array_merge($skins, getSkinDir($skin_type)); + foreach($dir as $k => $v) { + $ret[$v] = $v; + } + + return $ret; +} + +function getMemberLevels($include_admin = false) +{ + global $g5; + + $level_name[1] = "방문자"; + $level_name[2] = "멤버"; + $level_name[3] = "상위멤버"; + if ($include_admin) $level_name[10] = "운영자"; + + return $level_name; +} + +function setCheckbox($optionName, $optionDesc, $optionKey, $optionValue, $currentValue, $standalone = false) +{ + $currentValue = getCurrentValue($optionKey, $currentValue); + $checked = ""; + $v = ""; + $desc = $optionDesc ? "
{$optionDesc}
" : ""; + if ($currentValue) $checked = " checked"; + + if ($standalone) $v .= "
"; + $v .= '
'; + $v .= "
{$optionName}
{$desc}
"; + $v .= '
'; + $v .= "
"; + $v .= '
'; + if ($standalone) $v .= "
"; + + echo $v; +} + +function setNumberInput($optionName, $optionDesc, $optionKey, $currentValue, $preDesc = "", $postDesc = "", $minValue = 0, $maxValue = 0, $standalone = false) +{ + $currentValue = getCurrentValue($optionKey, $currentValue); + $v = ""; + $min = $minValue ? " min=\"{$minValue}\"" : ""; + $max = $maxValue ? " max=\"{$maxValue}\"" : ""; + $desc = $optionDesc ? "
{$optionDesc}
" : ""; + + if ($standalone) $v .= "
"; + $v .= "
+
+
{$optionName}
{$desc} +
+
+
+ {$preDesc} + + {$postDesc} +
+
+
"; + if ($standalone) $v .= "
"; + + echo $v; +} + +function setTextInput($optionName, $optionDesc, $optionKey, $currentValue, $standalone = false) +{ + $currentValue = getCurrentValue($optionKey, $currentValue); + $v = ""; + $desc = $optionDesc ? "
{$optionDesc}
" : ""; + + if ($standalone) $v .= "
"; + $v .= '
'; + $v .= "
{$optionName}
{$desc}
"; + $v .= '
'; + $v .= "
"; + $v .= '
'; + if ($standalone) $v .= "
"; + + echo $v; +} + +function setAccountList($optionName, $optionDesc, $level, $optionKey, $optionValue, $currentValue, $required = false, $standalone = false) +{ + global $g5; + + $sql = "SELECT mb_id, mb_nick FROM {$g5['member_table']} WHERE mb_level >= '{$level}' "; + $required_option = $required ? " required" : ""; + $currentValue = getCurrentValue($optionKey, $currentValue); + $v = ""; + $desc = $optionDesc ? "
{$optionDesc}
" : ""; + + $result = sql_query($sql); + if ($standalone) $v .= "
"; + $v .= '
'; + $v .= "
{$optionName}
{$desc}
"; + $v .= '
'; + $v .= "
"; + $v .= '
'; + if ($standalone) $v .= "
"; + + echo $v; +} + +function setOptionList($optionName, $optionDesc, $optionListObject, $optionKey, $optionValue, $currentValue, $required = false, $standalone = false) +{ + global $g5; + + $required_option = $required ? " required" : ""; + $currentValue = getCurrentValue($optionKey, $currentValue); + $v = ""; + $desc = $optionDesc ? "
{$optionDesc}
" : ""; + + if ($standalone) $v .= "
"; + $v .= "
+
+
{$optionName}
{$desc} +
+
+
+ +
+
+
"; + if ($standalone) $v .= "
"; + + echo $v; +} + +function setImageFile($optionName, $optionDesc, $optionKey, $currentValue, $standalone = false) +{ + $currentValue = getCurrentValue($optionKey, $currentValue); + $v = ""; + $desc = $optionDesc ? "
{$optionDesc}
파일을 선택하거나 주소를 입력하여 등록할 수 있습니다. 주소 입력을 비워두면 설정이 해제됩니다.
" : ""; + + if ($standalone) $v .= "
"; + $v .= "
+
+
{$optionName}
{$desc} +
+
+
+
+ 직접 선택 + +
+
+ 파일 URL + +
+
+
+
"; + if ($standalone) $v .= "
"; + + echo $v; +} + +function setListEditInput($optionName, $optionDesc, $optionKey, $currentValue, $separator = "\n", $placeholder = "", $standalone = false) +{ + $currentValue = getCurrentValue($optionKey, $currentValue); + $v = ""; + $desc = $optionDesc ? "
{$optionDesc}
" : ""; + + $itemList = []; + if (!empty($currentValue)) { + $itemList = array_filter(array_map('trim', explode($separator, $currentValue))); + } + + $jsSeparator = addslashes($separator); + if ($standalone) $v .= "
"; + $v .= "
+
+
{$optionName}
{$desc} +
+
+
+
"; + + if (!empty($itemList)) { + foreach ($itemList as $index => $item) { + $v .= " +
+ + +
"; + } + } + + $v .= " +
+
+ + +
+ +
+
+
"; + + if ($standalone) $v .= "
"; + + echo $v; +} \ No newline at end of file diff --git a/AvocadoAmber/adm/admin.lib.php b/AvocadoAmber/adm/admin.lib.php index c022795..b1c2a39 100644 --- a/AvocadoAmber/adm/admin.lib.php +++ b/AvocadoAmber/adm/admin.lib.php @@ -2,6 +2,8 @@ if (!defined('_GNUBOARD_')) exit; +include_once "./admin.amber.lib.php"; + function get_skin_select($skin_gubun, $id, $name, $selected = '', $event = '') { global $config; diff --git a/AvocadoAmber/adm/community_form.php b/AvocadoAmber/adm/community_form.php index 521bb8e..7cb2e84 100644 --- a/AvocadoAmber/adm/community_form.php +++ b/AvocadoAmber/adm/community_form.php @@ -69,7 +69,7 @@ if (!$config["cf_community"] || !$is_community_init) {
- DB TABLE 생성 + DB TABLE 생성
@@ -87,38 +87,13 @@ if (!$config["cf_community"] || !$is_community_init) {

커뮤니티용 기능에 필요한 설정입니다.

- - - - - - - - - - - - - - - - -
홈페이지 기본환경 설정
공개설정 - > - -    - > - -
기능설정 - > - -    - > - -    - > - -
+ 관련된 플러그인, 애드온, 모듈과 그것을 지원하는 스킨이 설치되어 있어야 합니다.", "cf_4", "1", $config); + setCheckbox("조합 기능 사용", "조합 기능을 사용할 지 설정합니다.
관련된 플러그인, 애드온, 모듈과 그것을 지원하는 스킨이 설치되어 있어야 합니다.", "cf_5", "1", $config); + setCheckbox("탐색 수행 가능 여부 설정", "탐색을 수행할 수 있는지 여부를 설정합니다.
관련된 플러그인, 애드온, 모듈과 그것을 지원하는 스킨이 설치되어 있어야 합니다.", "cf_6", "1", $config); + ?>
@@ -126,36 +101,11 @@ if (!$config["cf_community"] || !$is_community_init) {

기능 설정

- - - - - - - - - - - - - - - - - - - -
캐릭터 최대 생성 갯수 - -
최초 스탯 포인트 - - -
하루 탐색 횟수 - -
+ 관련된 플러그인, 애드온, 모듈과 그것을 지원하는 스킨이 설치되어 있어야 합니다.", "cf_search_count", $config, "", "회", 0); + ?>
@@ -163,89 +113,17 @@ if (!$config["cf_community"] || !$is_community_init) {

기타 항목명 설정

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
설정명칭 - -
단위 - -
설정명칭 - -
단위 - -
설정명칭 - -
(선택A)설정명칭 - - -
(선택B)설정명칭 - - -
상점 카테고리- - - -
아이템 기능- - - -
+ 설정하지 않는 경우 사용하지 않는 것으로 간주됩니다.", "cf_side_title", $config); + setTextInput("클래스 명칭", "클래스의 이름을 설정합니다.
설정하지 않는 경우 사용하지 않는 것으로 간주됩니다.", "cf_class_title", $config); + setListEditInput("상점 카테고리", "상점 아이템의 카테고리를 설정합니다.", "cf_shop_category", $config, "||"); + setListEditInput("아이템 기능", "아이템 기능을 설정합니다.
기능에 할당된 아이템이 있는 상태에서 삭제할 경우 정상 동작을 보장할 수 없습니다.", "cf_item_category", $config, "||"); + ?>
diff --git a/AvocadoAmber/adm/css/admin.amber.lib.css b/AvocadoAmber/adm/css/admin.amber.lib.css new file mode 100644 index 0000000..c5de122 --- /dev/null +++ b/AvocadoAmber/adm/css/admin.amber.lib.css @@ -0,0 +1,257 @@ +@charset "utf-8"; + +.adm-form { + padding: 16px; + border-bottom: 1px solid var(--theme-color-e, #efeff5); +} + +.adm-form input, +.adm-form textarea, +.adm-form select { + outline-color: var(--theme-color-e); +} + +.adm-form:hover { + background: var(--theme-color-0); +} + +.adm-form:last-child { + margin-bottom: 8px; +} + +.adm-form-postfix { + min-width: 40px; + text-align: center; +} + +.adm-form-colflex { + display: flex; + gap: 8px; +} + +.adm-form-rowflex { + display: flex; + gap: 8px; + flex-direction: column; + justify-content: center; +} + +.adm-form-colflex .adm-form-flex-full { + flex-grow: 1; +} + +.adm-form-name { + font-size: 16px; + font-weight: bold; +} + +.adm-form-desc { + margin: 8px 0 0 0; + font-size: 14px; +} + +.adm-form-check { + position: relative; + width: 48px; + height: 24px; + margin: 4px 0; +} + +.adm-form-check input[type=checkbox] { + width: 48px; + height: 24px; + position: relative; + cursor: pointer; + opacity: 0; +} + +.adm-form-check input[type=checkbox]+.adm-form-checkbox-cover { + pointer-events: none; + box-shadow: inset 0 0 3px #0004; + background: #DDD; + width: 48px; + height: 24px; + border-radius: 24px; + position: absolute; + left: 0; + top: 0; + display: flex; + justify-content: center; + transition: .25s; +} + +.adm-form-check input[type=checkbox]+.adm-form-checkbox-cover::before { + content: ""; + height: 18px; + width: 18px; + border-radius: 50%; + background: #FFF; + box-shadow: 0 0 3px #0004; + transform: translateX(-12px) translateY(3px); + box-sizing: border-box; + transition: .25s; +} + +.adm-form-check input[type=checkbox]:checked+.adm-form-checkbox-cover { + background: var(--theme-color-e, #06C); +} + +.adm-form-check input[type=checkbox]:checked+.adm-form-checkbox-cover::before { + transform: translateX(12px) translateY(3px); +} + +.adm-form-select { + padding: 4px; +} + +.adm-form-select select { + width: 100%; + box-sizing: border-box; + cursor: pointer; + border: 1px solid var(--theme-color-e, #efeff5); + border-radius: 4px; + padding: 8px; + height: auto +} + +.adm-form-text { + padding: 4px; +} + +.adm-form-text input[type=text] { + border: 1px solid var(--theme-color-e, #efeff5); + padding: 8px; + border-radius: 4px; + height: auto; + width: 100%; + box-sizing: border-box; +} + +.adm-form-file { + display: flex; + flex-direction: column; + gap: 8px; +} + +.adm-form-file>div { + display: flex; + gap: 8px; + align-items: center; +} + +.adm-form-file div>span { + display: inline-block; + min-width: 80px; + font-size: 14px; +} + +.adm-form-file div>input { + flex-grow: 1; + box-sizing: border-box; + border: 1px solid var(--theme-color-e, #efeff5); + padding: 8px; + border-radius: 4px; + height: auto; +} + +.adm-form-file div>input[type=file] { + cursor: pointer; +} + +.adm-form-listedit { + width: 100%; +} + +.adm-form-listedit .adm-listedit-controls { + display: flex; + align-items: center; + gap: 8px; +} + +.adm-listedit-items { + display: flex; + flex-direction: column; + gap: 8px; + margin-bottom: 8px; + overflow-y: auto; + max-height: 360px; + box-sizing: border-box; + border: 1px solid var(--theme-color-e, #efeff5); + border-radius: 4px; + padding: 8px; +} + +.adm-listedit-item { + display: flex; + align-items: center; + gap: 8px; +} + +.adm-form-listedit input[type=text] { + flex-grow: 1; + padding: 8px; + flex-grow: 1; + box-sizing: border-box; + border: 1px solid var(--theme-color-e, #efeff5); + border-radius: 4px; +} + +.adm-listedit-remove, +.adm-listedit-add { + min-width: 100px; + align-self: stretch; + border: 1px solid #ddd; + background: #f8f8f8; + cursor: pointer; + border-radius: 4px; + font-size: 14px; + white-space: nowrap; +} + +.adm-listedit-remove:hover, +.adm-listedit-add:hover { + background: #e8e8e8; +} + +.adm-listedit-remove { + background: var(--theme-color-sub-b, #ff6b6b); + color: #000; + border-color: var(--theme-color-sub, #ff5252); +} + +.adm-listedit-remove:hover { + color: #FFF; + background: var(--theme-color-sub, #ff6b6b); +} + +.adm-listedit-add { + background: var(--theme-color-e, #4CAF50); + color: #000; + border-color: var(--theme-color-d, #45a049); +} + +.adm-listedit-add:hover { + color: #FFF; + background: var(--theme-color-d, #45a049); +} + +.adm-listedit-controls { + text-align: left; +} + +.adm-form-number { + padding: 4px; + display: flex; + align-items: center; + gap: 8px +} + +.adm-form-number input[type=number] { + border: 1px solid var(--theme-color-e, #efeff5); + padding: 8px; + border-radius: 4px; + height: auto; + width: 80px; + min-width: 60px; + box-sizing: border-box; +} \ No newline at end of file diff --git a/AvocadoAmber/adm/migrate/_common.php b/AvocadoAmber/adm/migrate/_common.php new file mode 100644 index 0000000..3b7ba70 --- /dev/null +++ b/AvocadoAmber/adm/migrate/_common.php @@ -0,0 +1,12 @@ + -
  • 기본환경
  • -
  • 게시판/회원
  • +
  • 서버정보
  • +
  • 기본환경
  • +
  • 게시판/회원
  • 레이아웃 추가설정
  • '; @@ -244,6 +245,37 @@ if (!$config['cf_icode_server_port']) if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) { $userinfo = get_icode_userinfo($config['cf_icode_id'], $config['cf_icode_pw']); } + +function getDiskUsage($path = '/') +{ + $bytes = disk_total_space($path); + $free = disk_free_space($path); + $used = $bytes - $free; + + return [ + 'total' => $bytes, + 'free' => $free, + 'used' => $used, + 'usage_percent' => round(($used / $bytes) * 100, 2) + ]; +} + +function formatBytes($bytes, $precision = 2) +{ + $units = ['B', 'KB', 'MB', 'GB', 'TB']; + + for ($i = 0; $bytes > 1024 && $i < count($units) - 1; $i++) { + $bytes /= 1024; + } + + return round($bytes, $precision) . ' ' . $units[$i]; +} + +function getWebServerDiskUsage() +{ + // $documentRoot = $_SERVER['DOCUMENT_ROOT'] ?? '/var/www/html'; + return getDiskUsage(); +} ?>
    @@ -255,173 +287,71 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
    +

    서버 정보

    + + 디스크 용량"; + $webDiskUsage = getWebServerDiskUsage(); + echo "총 용량: " . formatBytes($webDiskUsage['total']) . "
    "; + echo "사용 중: " . formatBytes($webDiskUsage['used']) . "
    "; + echo "사용 가능: " . formatBytes($webDiskUsage['free']) . "
    "; + echo "사용률: " . $webDiskUsage['usage_percent'] . "%
    "; + ?> +
    +

    홈페이지 기본환경 설정

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    홈페이지 기본환경 설정
    공개설정 - > - -    - > - -
    홈페이지 제목 - - 사이트설명 - -
    커뮤니티 기능 사용 - - > -
    파비콘 - - 직접등록   -    - 외부경로   -
    커서 - - 직접등록   -    - 외부경로   -
    사이트이미지 - - 직접등록   -    - 외부경로   -
    - - -
    - 123.123.+ 도 입력 가능. (엔터로 구분)') ?> - -
    - 123.123.+ 도 입력 가능. (엔터로 구분)') ?> - -
    접속설정 - - > - -
    + = '{$level}' "; + $accounts = sql_query($sql); + $accountList = []; + while($row = sql_fetch_array($accounts)) { + $accountList[$row['mb_id']] = "{$row['mb_nick']} ({$row['mb_id']})"; + } + + setOptionList("최고관리자", "홈페이지의 최고 관리자 계정을 지정합니다.", $accountList, "cf_admin", '', $config, true); + setTextInput("홈페이지 이름", "", "cf_title", $config); + setTextInput("홈페이지 설명", "", "cf_site_descript", $config); + setCheckbox("홈페이지 공개", "로그인을 하지 않아도 홈페이지를 확인할 수 있도록 설정합니다.", "cf_open", "1", $config); + setCheckbox("계정 생성", "홈페이지 가입이 가능하도록 설정합니다.", "cf_1", "1", $config); + setCheckbox("커뮤니티 기능", "홈페이지 내에 커뮤니티 관련 기능을 활성화 합니다.
    데이터베이스를 설정했더라도 사용하지 않음 상태인 경우 관련 메뉴가 출력되지 않습니다.", "cf_community", "1", $config); + setImageFile("파비콘 설정", "홈페이지에 적용할 파비콘 이미지를 설정합니다.", "cf_favicon", $config); + setImageFile("커서 설정", "홈페이지에 적용할 커서 이미지를 설정합니다.", "cf_cursor", $config); + setImageFile("SNS 카드 이미지 설정", "SNS등에서 링크 시 카드 이미지에 등록될 이미지를 설정합니다. 290px × 160px 크기로 설정하는 것이 좋습니다.", "cf_site_img", $config); + setListEditInput("접근 가능 IP", "입력된 IP의 컴퓨터만 접근할 수 있습니다. 123.123.+ 도 입력 가능.", "cf_possible_ip", $config, "\n"); + setListEditInput("접근 차단 IP", "입력된 IP의 컴퓨터는 접근할 수 없음. 123.123.+ 도 입력 가능.", "cf_intercept_ip", $config, "\n"); + setCheckbox("보안 연결(https) 강제 비활성화", "※ 이 옵션을 사용하는 경우 제3자에 의해 홈페이지와 통신하는 내용이 감청될 가능성이 있습니다.
    호스팅 환경이 정상적으로 https 를 지원하지 않는 경우에만 설정하세요.", "cf_use_http", "1", $config); + ?>
    -
    +

    게시판/회원 기본 설정

    각 게시판 관리에서 개별적으로 설정 가능합니다.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    게시판 기본 설정
    초 지난후 가능 - - -
    - - -
    - -
    일 후 자동 삭제
    - - -
    + "_blank", + "_self" => "_self", + "_top" => "_top", + "_new" => "_new" + ]; + $memberSkinList = array_merge(['' => '선택'], getSkinList('member')); + $memberLevelList = getMemberLevels(); + + setOptionList("새 창 링크 시 동작 선택", "글 내용 중 자동으로 링크를 변환할 때 동작 방식을 결정합니다.", $herfList, "cf_link_target", '', $config, true); + setNumberInput("글쓰기 간격", "게시글 도배 방지를 위해 글 작성이 가능한 최소 시간을 설정합니다.", "cf_delay_sec", $config, "", "초 이후 가능"); + setListEditInput("단어 필터링", "입력된 단어가 포함된 내용은 게시할 수 없습니다.", "cf_filter", $config, ","); + setOptionList("회원 스킨", "", $memberSkinList, "cf_member_skin", '', $config, true); + setOptionList("회원 기본 권한", "", $memberLevelList, "cf_register_level", '', $config, true); + setListEditInput("아이디 및 닉네임 금지 단어 설정", "회원아이디, 닉네임으로 사용할 수 없는 단어를 정합니다.", "cf_prohibit_id", $config, ","); + setNumberInput("회원정보 보존 기간", "회원이 탈퇴한 후 회원의 정보를 보존할 기간을 설정합니다. 기본값은 30일 입니다.", "cf_leave_day", $config, "", "일 이후 자동 삭제"); + ?>
    diff --git a/AvocadoAmber/head.sub.php b/AvocadoAmber/head.sub.php index 5fc99e6..08e6120 100644 --- a/AvocadoAmber/head.sub.php +++ b/AvocadoAmber/head.sub.php @@ -89,6 +89,7 @@ $html_class .= $_COOKIE['header_close'] == 'close' ? " close-header" : ""; if (defined('G5_IS_ADMIN')) { echo get_embed_file("css", G5_ADMIN_PATH . '/css/admin.css') . PHP_EOL; echo get_embed_file("css", G5_ADMIN_PATH . '/css/admin.layout.css') . PHP_EOL; + echo get_embed_file("css", G5_ADMIN_PATH . '/css/admin.amber.lib.css') . PHP_EOL; echo get_embed_file("css", G5_ADMIN_PATH . '/css/amberstone.cp.css') . PHP_EOL; } else { if (defined('G5_THEME_PATH') && file_exists(G5_THEME_PATH . "/css/default.css")) {