Re: [라공에디션] 그냥사람님의 썰타래 게시판 마개조 기록
1. 끌올 가능한 최신순 정렬
게시글 정렬 기준을 타래가 작성된 최신 순서 정렬로 바꿨다.
연재중인 작품을 보면서 타래를 작성하는 경우가 많아, 트위터처럼 끌올이 가능한 정렬이 가장 사용하기 편할 듯해서 sql문을 조금 수정했음.
list.skin.php 수정
$parent_sql = "
SELECT a.*,
(SELECT COUNT(*) - 1 FROM {$write_table} WHERE tm_origin = a.wr_id) as total_comment_count,
(SELECT MAX(wr_datetime) FROM {$write_table} WHERE tm_origin = a.wr_id) as last_update
FROM {$write_table} a
WHERE a.wr_is_comment = 0
AND (a.wr_4 IS NULL OR a.wr_4 = '' OR a.wr_4 != 'tarae')
{$category_where}
ORDER BY last_update DESC, a.wr_id DESC
LIMIT {$offset}, {$page_rows}
";(1) (SELECT MAX(wr_datetime) FROM {$write_table} WHERE tm_origin = a.wr_id) as last_update
↳ tm_origin을 기준으로 부모글을 찾을 수 있도록 이전에 로직을 변경해주었으므로, tm_origin을 사용하여 가장 최근에 작성된 자식글의 시각을 찾음
(2) ORDER BY last_update DESC, a.wr_id DESC
↳ 쿼리한 데이터를 (1)에서 찾은 갱신시간을 기준으로 정렬하도록 함
// wr_order 기준으로 정렬 (공지글은 그대로, 일반 게시글은 wr_order 순서대로)
usort($normal_list, function ($a, $b) {
$order_a = isset($a['wr_order']) ? (int)$a['wr_order'] : 0;
$order_b = isset($b['wr_order']) ? (int)$b['wr_order'] : 0;
if ($order_a == $order_b) {
// wr_order가 같으면 wr_id 내림차순
$id_a = isset($a['wr_id']) ? (int)$a['wr_id'] : 0;
$id_b = isset($b['wr_id']) ? (int)$b['wr_id'] : 0;
return $id_b - $id_a;
}
return $order_a - $order_b; // wr_order 오름차순
});이 부분을 찾아 주석 처리 하거나 삭제하여 wr_order 기준으로 정렬되지 않도록 함
2. 공지글 출력 시 오류 수정
(1) 공지글 출력 시 글이 중복으로 나오는 문제
중복으로 리스트에 추가되는 것을 막을 수 있도록 로직 변경
// 자식 게시물 필터링 및 공지글 분리
$filtered_list = array();
$normal_list = array();
// 공지 배열 확인 (list.php에서 전달됨)
$notice_array = isset($notice_array) ? $notice_array : array();
foreach ($list as $item) {
$item_wr_4 = isset($item['wr_4']) ? trim($item['wr_4']) : '';
// wr_4가 'tarae'가 아닌 게시물만 표시 (부모 게시물만)
if ($item_wr_4 !== 'tarae') {
$item_wr_id = isset($item['wr_id']) ? (int)$item['wr_id'] : 0;
// 공지글인지 확인
if (in_array($item_wr_id, $notice_array) || (isset($item['is_notice']) && $item['is_notice'])) {
$notice_list[] = $item;
} else {
$normal_list[] = $item;
}
}
}
// 공지글을 먼저, 그 다음 정렬된 일반 게시글 순서로 합치기
$list = array_merge($notice_list, $normal_list);위 부분▲을 찾아서 아래 함수▼로 변경
// 1. 공지글 리스트와 일반 리스트를 담을 배열 초기화
$final_notice_list = array();
$final_normal_list = array();
// 2. DB에서 가져온 공지글들 처리 (이미 위에서 $notice_list로 가져옴)
if (!empty($notice_list)) {
foreach ($notice_list as $n_item) {
$final_notice_list[] = $n_item;
}
}
// 3. DB에서 가져온 일반 부모글들 처리
if (!empty($parent_list)) {
foreach ($parent_list as $p_item) {
$p_wr_id = (int)$p_item['wr_id'];
// 중요: 이미 공지사항에 포함된 글이라면 일반 리스트에서는 제외 (중복 방지)
if (in_array($p_wr_id, $notice_array)) {
continue;
}
$final_normal_list[] = $p_item;
}
}
// 4. 최종 리스트 합치기: 공지사항을 맨 위로, 그 다음 최신 타래순 일반글
$list = array_merge($final_notice_list, $final_normal_list);(2) 공지글 출력 시 댓글개수 안 나오는 문제
notice_sql 에도 total_comment_count 가져오는 구문 추가
$notice_sql = "
SELECT a.*,
(SELECT COUNT(*) - 1 FROM {$write_table} WHERE tm_origin = a.wr_id) as total_comment_count
FROM {$write_table} a
WHERE a.wr_id IN ({$notice_ids_sql})
AND a.wr_is_comment = 0
AND (a.wr_4 IS NULL OR a.wr_4 = '' OR a.wr_4 != 'tarae')
{$category_where}
ORDER BY FIELD(a.wr_id, {$notice_ids_sql})
";3. wr_order 입력 관련 태그 정리
1번 수정으로 wr_order 값이 정렬과는 관련 없어졌기 때문에 공지 설정 시에만 활용하려고 input type을 hidden으로 변경하고 입력과 관련된 태그들을 정리함
write.skin.php 수정
<div class="log20_field_block">
<label for="wr_subject">제목<strong>(필수)</strong></label>
<input type="text" name="wr_subject" value="<?php echo $subject ?>" id="wr_subject" required class="frm_input full_input required" size="50" maxlength="255" placeholder="제목을 입력하세요">
</div>
<input type="hidden" name="wr_order" id="wr_order" value="<?php echo isset($write['wr_order']) ? (int)$write['wr_order'] : 0 ?>">
</div>관련 js 함수를 <section> 태그 위쪽으로 이동, 수정했음
<script>
(function($) {
// 공지 여부에 따라 wr_order 값을 자동으로 설정하는 함수
function updateHiddenOrder() {
var $notice = $('#notice');
var $order = $('#wr_order');
if (!$notice.length || !$order.length) return;
if ($notice.is(':checked')) {
// 공지 선택 시: 무조건 -1로 설정
$order.val(-1);
} else {
// 공지 해제 시: 현재 값이 -1이라면 0으로 복구
if ($order.val() == -1) {
$order.val(0);
}
}
}
// 1. 공지 체크박스 변경 시 즉시 반영
$(document).on('change', '#notice', function() {
updateHiddenOrder();
});
// 2. 페이지 로드 시 실행 (수정 모드 대응)
$(function() {
updateHiddenOrder();
});
})(jQuery);
</script>4. css 부분적 수정
.log20_item_title {
/* 제목 줄바꿈 규칙 추가 */
text-wrap-style: balance;
word-break: keep-all;
/* 텍스트 외곽선 추가 */
text-shadow: -1.5px 0 #fff, 0 1.5px #fff, 1.5px 0 #fff, 0 -1.5px #fff;
}.log20_list_area {
width: 100%;
height: 100%;
margin: 20px 0;
display: flex;
flex-wrap: wrap;
gap: 20px;
justify-content: center; /* 정렬 기준 center로 변경 */
align-items: flex-start;
}- 이전글[라공에디션] 그냥사람님의 썰타래 게시판 마개조 기록 26.03.14
- 다음글[라공에디션] 라공에디터 미사용 스킨에서 큰따옴표 변환 오류 26.03.10
댓글목록
등록된 댓글이 없습니다.