AI 단계별 작업 문서 02 — 2단계: 목록 노출
목록 노출 요청에 해당하는 원본 설명과 코드 블록을 보존했습니다. 목록 노출만 요청된 경우 검색 필터 단계는 수행하지 않습니다.
4. 2단계 — 목록 노출 (is_list)
4-1. 동작 원리
칸(열)은 필드 정의를 읽어 자동 생성된다. 스킨을 한 번만 고쳐 두면, 이후 관리자가 필드에서 "목록 노출"을 체크/해제하는 것만으로 목록에 칸이 생기고 사라진다. (코드 재수정 불필요)
4-2. 공통: 루프 시작 전에 준비
스킨 list.php 의 글 루프 앞에 넣는다. ($posts, $notices, $board 는 모든 스킨의 list.php 에서 사용 가능한 변수)
<?php
// 목록 노출 대상 필드 + 현재 페이지 글들의 값을 한 번에 조회
$_bfCols = function_exists('dx_bf_list_fields') ? dx_bf_list_fields($board['id']) : array();
$_bfMeta = $_bfCols
? dx_bf_meta_map(array_merge(isset($notices) && is_array($notices) ? $notices : array(), $posts))
: array();
?>
글마다
getMeta()/dx_get_post_meta()를 호출하면 글 수만큼 쿼리가 실행된다(N+1). 반드시dx_bf_meta_map()로 일괄 조회한다.
4-3. 표(테이블)형 스킨
<!-- thead 안, 제목 th 뒤 -->
<?php foreach ($_bfCols as $_f): ?>
<th><?php echo htmlspecialchars($_f['field_label'], ENT_QUOTES, 'UTF-8'); ?></th>
<?php endforeach; ?>
<!-- 각 행 tr 안, 제목 td 뒤 ($p = 현재 글 변수. 스킨의 루프 변수명에 맞출 것) -->
<?php $_m = isset($_bfMeta[(string)$p['id']]) ? $_bfMeta[(string)$p['id']] : array(); ?>
<?php foreach ($_bfCols as $_f): ?>
<td><?php echo dx_bf_display($_f, isset($_m[$_f['field_key']]) ? $_m[$_f['field_key']] : ''); ?></td>
<?php endforeach; ?>
공지 행($notices)이 별도 루프라면 같은 방식으로 칸을 추가하거나, 칸 수를 맞추기 위해 빈 <td> 를 넣는다. (colspan 도 기본열수 + count($_bfCols) 로 수정)
4-4. 카드/갤러리형 스킨
번들 gallery 는 list.php(약 652행 foreach($posts as $_i=>$_p))에서 카드를 그린다. 카드 내부 원하는 위치에 넣는다.
<?php
$_m = isset($_bfMeta[(string)$_p['id']]) ? $_bfMeta[(string)$_p['id']] : array();
if ($_bfCols):
?>
<div class="dx-bf-meta" style="display:flex;flex-wrap:wrap;gap:2px 10px;font-size:.75rem;color:var(--text-muted,#888)">
<?php foreach ($_bfCols as $_f):
$_v = isset($_m[$_f['field_key']]) ? $_m[$_f['field_key']] : '';
if ($_v === '') continue; ?>
<span><b><?php echo htmlspecialchars($_f['field_label'], ENT_QUOTES, 'UTF-8'); ?></b> <?php echo dx_bf_display($_f, $_v); ?></span>
<?php endforeach; ?>
</div>
<?php endif; ?>
- gallery 는 행 렌더링이
_list_rows.php로 분리되어 있고view.php하단 목록과 공유한다. 양쪽에 모두 보이게 하려면_list_rows.php에 넣고, 그 partial 을 include 하기 전에 4-2 의 준비 코드가 실행되도록 한다. - 스킨 파일은 업데이트 시 덮어써질 수 있으므로, 번들 스킨을 직접 고치기보다 복사본 스킨(예:
gallery-bf)을 만들어 게시판에 적용하는 것을 권장한다.
4-5. 알려진 한계
list-live.js가 새 글을 실시간으로 끼워 넣을 때는/api/post_row가 만든 행을 쓰므로 여분 필드 칸이 없다. 새로고침하면 정상 표시된다. (필요하면api/post_row를 별도로 확장해야 하며, 이 문서의 범위 밖)- textarea 값은 한 줄로 출력된다. 긴 값은 목록 노출에 부적합하다.
- 목록 노출 필드는 4~5개 이내를 권장한다. (모바일 레이아웃)