1. 필드 등록 (관리자)
- 관리자 → 게시판 관리
- 원하는 게시판 행의 보라색 아이콘 클릭
- 모달에서 + 새 필드 클릭
- 아래 항목 입력 후 저장
| 항목 | 설명 |
|---|---|
| 필드 키 | 영문/숫자/_ 만 가능. 생성 후 변경 불가. 예) price , location |
| 필드 라벨 | 사용자에게 보이는 이름. 예) 가격 , 지역 |
| 타입 | 텍스트 / 숫자 / 선택(드롭다운) / 라디오 / 체크박스 / 날짜 / URL / 전화번호 / 텍스트에어리어 |
| 필수 | 체크 시 글쓰기 폼에서 필수 입력 |
| 목록 노출 | 게시판 목록 페이지에서 컬럼으로 표시 |
| 검색 필터 | 목록 페이지에서 검색/필터 조건으로 사용 |
| 뷰 노출 | 글 상세 페이지에서 값 표시 |
| 정렬 순서 | 숫자가 낮을수록 위에 표시 |
2. 스킨에서 사용하기
스킨 파일 경로: boards/skins/{스킨명}/
중요: 스킨 파일 상단에 아래 한 줄을 추가해야 합니다
require_once DX_ROOT . '/core/BoardFields.php';
3. 글쓰기 / 수정 (write.php)
기본 사용 — 자동 렌더링
<?php require_once DX_ROOT . '/core/BoardFields.php'; ?>
<form method="post" ...>
<!-- 기존 제목, 내용 등 폼 필드 -->
<input type="text" name="title" ...>
<!-- 여분 필드 자동 출력 -->
<?php
/* 수정 시 기존 값 로드, 신규 시 빈 배열 */
$savedMeta = array();
if (!empty($post['id'])) {
$savedMeta = dx_board_fields()->getMeta($post['id']);
}
echo dx_board_fields()->renderWriteForm($board['id'], $savedMeta);
?>
<button type="submit">저장</button>
</form>
renderWriteForm() 이 자동으로 각 필드 타입에 맞는 HTML 입력 요소를 생성합니다.
저장은 extend/top/50_board_fields.php 훅이 자동 처리하므로 별도 저장 코드 불필요.
필드 이름 규칙
여분 필드의 name 속성은 자동으로 bf_{필드키} 형식으로 생성됩니다.
필드 키: price → <input name="bf_price">
필드 키: location → <input name="bf_location">
4. 글 상세 보기 (view.php)
기본 사용 — 자동 렌더링
<?php require_once DX_ROOT . '/core/BoardFields.php'; ?>
<!-- 글 본문 출력 -->
<div class="content"><?php echo $post['content']; ?></div>
<!-- 여분 필드 자동 출력 (is_view=1 인 필드만 표시) -->
<?php echo dx_board_fields()->renderView($board['id'], $post['id']); ?>
renderView() 출력 예시:
가격 50,000원
지역 서울 강남구
연락처 010-1234-5678
개별 값 직접 꺼내기
특정 필드 값을 원하는 위치에 직접 출력하고 싶을 때:
<?php
$price = dx_get_post_meta($post['id'], 'price', '0');
$location = dx_get_post_meta($post['id'], 'location', '미입력');
$contact = dx_get_post_meta($post['id'], 'contact', '');
?>
<div class="post-meta">
<span>가격: <?php echo htmlspecialchars($price, ENT_QUOTES, 'UTF-8'); ?>원</span>
<span>지역: <?php echo htmlspecialchars($location, ENT_QUOTES, 'UTF-8'); ?></span>
</div>
전체 메타 한 번에 로드
$meta = dx_board_fields()->getMeta($post['id']);
// $meta = array('price' => '50000', 'location' => '서울', ...)
$price = isset($meta['price']) ? $meta['price'] : '';
$location = isset($meta['location']) ? $meta['location'] : '';
5. 글 목록 (list.php)
목록에 여분 필드 컬럼 표시
<?php
require_once DX_ROOT . '/core/BoardFields.php';
/* is_list=1 인 필드만 가져오기 */
$listFields = array();
foreach (dx_board_fields()->getFields($board['id']) as $f) {
if ($f['is_list'] == 1) {
$listFields[] = $f;
}
}
?>
<table>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<!-- 여분 필드 컬럼 헤더 -->
<?php foreach ($listFields as $f): ?>
<th><?php echo htmlspecialchars($f['field_label'], ENT_QUOTES, 'UTF-8'); ?></th>
<?php endforeach; ?>
<th>날짜</th>
</tr>
</thead>
<tbody>
<?php foreach ($posts as $p): ?>
<?php $meta = dx_board_fields()->getMeta($p['id']); ?>
<tr>
<td><?php echo $p['id']; ?></td>
<td><?php echo htmlspecialchars($p['title'], ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php echo htmlspecialchars($p['author_name'], ENT_QUOTES, 'UTF-8'); ?></td>
<!-- 여분 필드 값 -->
<?php foreach ($listFields as $f): ?>
<td>
<?php
$val = isset($meta[$f['field_key']]) ? $meta[$f['field_key']] : '';
echo htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
?>
</td>
<?php endforeach; ?>
<td><?php echo $p['created_at']; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
6. 헬퍼 함수 정리
| 함수 | 설명 |
|---|---|
| dx_board_fields() | BoardFields 인스턴스 반환 |
| dx_get_post_meta($postId, $key, $default) | 특정 필드 값 1개 반환 |
| dx_save_post_meta($postId, $values) | 메타 값 배열 저장 (수동 저장 필요 시) |
BoardFields 인스턴스 메서드
| 메서드 | 설명 |
|---|---|
| getFields($boardId, $activeOnly) | 게시판 필드 목록 반환. $activeOnly=true 이면 활성 필드만 |
| getMeta($postId) | 게시글 전체 메타 ['key'=>'value'] 배열 반환 |
| getMetaValue($postId, $key, $default) | 단일 메타 값 반환 |
| renderWriteForm($boardId, $savedMeta) | 글쓰기 폼 HTML 자동 생성 |
| renderView($boardId, $postId) | 뷰 페이지 HTML 자동 생성 |
7. 저장/삭제 자동 처리
extend/top/50_board_fields.php 가 DXCMS 부팅 시 자동 로드되어 아래 훅을 등록합니다.
스킨에서 별도로 저장/삭제 코드를 작성할 필요가 없습니다.글 저장 후 (dx_board_after_save) → POST 데이터에서 bf_ 접두사 필드 자동 추출 후 저장
글 삭제 후 (dx_board_after_delete) → 해당 글의 메타 데이터 자동 삭제
8. 실전 예시 — 중고거래 게시판
필드 설정 (관리자)
| 필드 키 | 라벨 | 타입 | 필수 | 목록 | 뷰 |
|---|---|---|---|---|---|
| price | 가격 | 숫자 | Y | Y | Y |
| location | 거래 지역 | 선택 | Y | Y | Y |
| condition | 상품 상태 | 라디오 | Y | N | Y |
| contact | 연락처 | 전화번호 | N | N | Y |
write.php
<?php require_once DX_ROOT . '/core/BoardFields.php'; ?>
<form method="post">
<input type="text" name="title" placeholder="제목">
<textarea name="content"></textarea>
<?php
$savedMeta = !empty($post['id']) ? dx_board_fields()->getMeta($post['id']) : array();
echo dx_board_fields()->renderWriteForm($board['id'], $savedMeta);
?>
<button type="submit">등록</button>
</form>
view.php
<?php require_once DX_ROOT . '/core/BoardFields.php'; ?>
<h1><?php echo htmlspecialchars($post['title'], ENT_QUOTES, 'UTF-8'); ?></h1>
<!-- 가격을 강조해서 따로 표시 -->
<?php $price = dx_get_post_meta($post['id'], 'price', '0'); ?>
<div class="price"><?php echo number_format((int)$price); ?>원</div>
<!-- 나머지 여분 필드는 자동 렌더링 -->
<?php echo dx_board_fields()->renderView($board['id'], $post['id']); ?>
<div class="content"><?php echo $post['content']; ?></div>
주의사항
$post['id'] 는 BIGINT 밀리초 타임스탬프입니다. (int) 캐스팅 하지 마세요.필드 키는 생성 후 변경이 불가합니다. 신중하게 정하세요.필드 삭제 시 해당 필드에 저장된 모든 게시글의 값이 함께 삭제됩니다.