================================================================================
type=textarea 기능 업데이트 가이드
갤러리 스타일2 뷰페이지 + 입력폼 헬퍼 모달창
================================================================================
[개요]
- 여분필드에 |type=textarea 설정 시 HTML 코드를 그대로 렌더링
- 테이블 구조 밖에 별도 출력 (타이틀 없이 심플하게)
- 입력폼에 help_li, help_테이블 버튼으로 HTML 생성 모달 제공
================================================================================
1. view.skin.php - hycs_render_block_field_for_view 함수 수정
================================================================================
[1-1] 타입 감지 부분 수정 (약 144-150행 부근)
기존: count($parts) > 2 일때만 type 체크
수정: 모든 parts에서 type= 찾기
---코드 시작---
$parts = explode('|', $config);
$parts_config = $parts;
$type = 'text';
// 모든 파트에서 type= 찾기 (제품특징|type=textarea 형식 지원)
foreach ($parts as $a) {
if (strpos($a, 'type=') === 0) {
$type = explode('/', substr($a, 5))[0];
break;
}
}
---코드 끝---
[1-2] textarea/html 타입 처리 추가 (else 분기 전에 추가)
위치: } else { $label = trim(mSubj($i)); 이 부분 바로 앞에 추가
---코드 시작---
} elseif ($type === 'textarea' || $type === 'html') {
// textarea/html 타입: 심플 박스로 HTML 코드를 그대로 출력 (테이블/타이틀 없이)
$field_name = 'wr_' . $i;
$value = isset($view[$field_name]) ? $view[$field_name] : '';
$value_check = trim(strip_tags($value));
// 빈 값이거나 기본 텍스트면 출력하지 않음
if ($value_check === '' || strpos($value_check, '내용에 아무것도 안나오면 자동등록된 기본내용입니다') !== false) {
return array('row' => '', 'extra' => '', 'force_row' => '');
}
$extra_html .= '
' . $value . '
';
// textarea/html 타입은 extra에만 출력하고 row/force_row는 빈값으로 바로 반환
return array('row' => '', 'extra' => $extra_html, 'force_row' => '');
} else {
---코드 끝---
================================================================================
2. view2.skin.php - 갤러리 스타일2 뷰페이지
================================================================================
[2-1] textarea extras 별도 수집 변수 추가
위치: $hycs_sections = hycs_get_section_field_lists(...) 다음 줄
---코드 시작---
$textarea_extras_v2 = ''; // textarea/html 타입은 블록 바깥에 별도 출력
---코드 끝---
[2-2] foreach 루프 안에서 textarea extra 분리 저장
위치: $rendered = hycs_render_block_field_for_view(...) 호출 후 extra 처리 부분
기존:
$block_extras .= $rendered['extra'];
수정:
---코드 시작---
// textarea/html 타입 extra는 별도 저장
if (strpos($rendered['extra'], 'view-textarea-box') !== false) {
$textarea_extras_v2 .= $rendered['extra'];
} else {
$block_extras .= $rendered['extra'];
}
---코드 끝---
[2-3] 블록 루프 끝난 후 textarea extras 출력
위치: foreach ($hycs_sections ...) 루프가 끝난 직후, 첨부파일 출력 전
---코드 시작---
// textarea/html 타입 필드는 블록 바깥에 별도 출력
if (trim($textarea_extras_v2) !== '') {
echo $textarea_extras_v2;
}
---코드 끝---
================================================================================
3. view_detail.php - 동일한 textarea/html 처리 추가
================================================================================
view.skin.php의 [1-1], [1-2]와 동일하게 수정
(hycs_render_block_field_for_view_detail 함수 내)
================================================================================
4. style_view.css - 뷰 페이지 스타일 추가
================================================================================
파일 끝에 추가:
---코드 시작---
/* textarea/html 타입 여분필드 박스 */
.view-textarea-box {
display: block;
padding: 0;
background: none;
margin-top: 30px;
line-height: 1.8;
overflow: hidden;
clear: both;
width: 100%;
box-sizing: border-box;
}
.view-textarea-box + .view-textarea-box {
margin-top: 30px;
}
.view-textarea-box ul {
margin: 0;
padding-left: 20px;
list-style-position: inside;
}
.view-textarea-box li {
margin-bottom: 8px;
}
.view-textarea-box > * {
max-width: 100%;
}
.view-textarea-box table {
width: 100%;
border-collapse: collapse;
margin: 10px 0;
}
.view-textarea-box table th,
.view-textarea-box table td {
border: 1px solid #ddd;
padding: 8px 12px;
text-align: center;
}
.view-textarea-box table th {
background: #f0f0f0;
font-weight: 600;
}
.view-textarea-box table tr:nth-child(even) {
background: #fafafa;
}
/* COM_li 리스트 스타일 */
.view-textarea-box .COM_li ul {
margin: 0;
padding: 0;
list-style: none;
}
.view-textarea-box .COM_li li {
list-style: none;
}
.view-textarea-box .COM_li.li-1d > ul.dot > li {
position: relative;
padding-left: 16px;
margin-bottom: 8px;
font-weight: 500;
line-height: 1.6;
}
.view-textarea-box .COM_li.li-1d > ul.dot > li::before {
content: "•";
position: absolute;
left: 0;
}
.view-textarea-box .COM_li.li-2d {
margin-top: 4px;
}
.view-textarea-box .COM_li.li-2d > ul.dash > li {
position: relative;
padding-left: 20px;
margin-bottom: 4px;
font-weight: 400;
color: #666;
font-size: 0.92em;
line-height: 1.5;
}
.view-textarea-box .COM_li.li-2d > ul.dash > li::before {
content: "-";
position: absolute;
left: 8px;
}
---코드 끝---
================================================================================
5. write.skin.php - 입력폼 헬퍼 모달창
================================================================================
[5-1] 파일 맨 끝 태그 다음에 모달 HTML 추가:
---코드 시작---
---코드 끝---
================================================================================
6. mandoo.function.php - textarea 입력폼에 헬퍼 버튼 추가
================================================================================
textarea 타입 case 부분에서 버튼 추가:
---코드 시작---
case 'textarea':
$v = $value;
$textarea_id = $id ? $id : 'textarea_' . $i;
$html .= "
";
$html .= "";
$html .= "";
$html .= "
";
$html .= "{$unit}";
break;
---코드 끝---
mView 함수에도 textarea/html 타입 처리 추가:
---코드 시작---
case 'textarea':
case 'html':
// textarea/html 타입: HTML 코드를 그대로 출력
$output = $value;
break;
---코드 끝---
================================================================================
적용 순서
================================================================================
1. style_view.css 먼저 수정 (CSS 추가)
2. view.skin.php 수정 (핵심 함수)
3. view2.skin.php 수정 (갤러리 스타일2)
4. view_detail.php 수정 (상세뷰)
5. write.skin.php 수정 (모달창 추가)
6. mandoo.function.php 수정 (헬퍼 버튼)
================================================================================
테스트 방법
================================================================================
1. 게시판 관리에서 여분필드 설정: 제품특징|type=textarea
2. 글쓰기에서 help_li, help_테이블 버튼 클릭하여 HTML 생성
3. 글보기(갤러리 스타일2)에서 테이블 밖에 심플하게 출력되는지 확인
================================================================================
7. 첨부파일 삭제 기능 추가 (write.skin.php, write_edit.php)
================================================================================
[문제]
- 그누보드 get_file() 함수가 캐시 문제로 파일 정보를 제대로 가져오지 못함
- 수정 페이지에서 기존 첨부파일이 보이지 않아 삭제 불가
[해결]
- get_file() 대신 DB에서 직접 조회하도록 변경
[7-1] write.skin.php - 첨부파일 조회 코드 수정
위치: 첨부파일 섹션 시작 부분 (attach-section 내부)
---코드 시작---
0);
?>
0) {
global $g5;
$sql = "SELECT * FROM {$g5['board_file_table']} WHERE bo_table = '$bo_table' AND wr_id = '$wr_id' ORDER BY bf_no";
$result = sql_query($sql);
while ($row = sql_fetch_array($result)) {
$bf_no = (int)$row['bf_no'];
$existing_files[$bf_no] = $row;
}
}
?>
---코드 끝---
[7-2] 첨부파일 행에 기존 파일 정보 + 삭제 체크박스 표시
위치: foreach ($attach_files as $idx => $file_title) 루프 내부
---코드 시작---
$file_title):
$file_idx = $file_counter; // 실제 파일 저장 인덱스
?>
( bytes)
* 새 파일을 선택하면 기존 파일이 교체됩니다.
---코드 끝---
[7-3] write_edit.php - 관리자 수정 페이지도 동일하게 수정
변수명만 다름: $existing_files_edit, $file_counter_edit, $file_idx_edit
---코드 시작---
0) {
global $g5;
$sql = "SELECT * FROM {$g5['board_file_table']} WHERE bo_table = '$bo_table' AND wr_id = '$wr_id' ORDER BY bf_no";
$result = sql_query($sql);
while ($row = sql_fetch_array($result)) {
$bf_no = (int)$row['bf_no'];
$existing_files_edit[$bf_no] = $row;
}
}
?>
---코드 끝---
[동작 방식]
1. 수정 페이지 진입 시 DB에서 해당 글의 첨부파일 목록 조회
2. bf_no (파일 인덱스)를 키로 하여 $existing_files 배열에 저장
3. 첨부파일 영역에서 해당 인덱스에 파일이 있으면:
- 초록색 박스로 파일명 표시
- 다운로드 링크 제공
- 빨간색 "삭제" 체크박스 표시
4. 삭제 체크 후 저장하면 그누보드 기본 처리로 파일 삭제됨
5. 새 파일 선택 시 기존 파일 교체
================================================================================
8. 리스트 HTML 생성기 출력 형식 (help_li)
================================================================================
리스트 생성기에서 출력되는 HTML 형식:
---코드 시작---
1단계 항목 내용
2단계 하위항목
2단계 하위항목
다음 1단계 항목
---코드 끝---
클래스 설명:
- w500, w400: 폰트 굵기
- em-w500: 강조 텍스트 굵기
- li_pl_20: 리스트 왼쪽 패딩
- f_sm: 작은 폰트 크기
- lh120, lh110: 줄간격
- scale-09, scale-08: 스케일 조절
- gray666: 회색 텍스트
================================================================================
작성일: 2024년
================================================================================