댓글에 등록순 번호 부여하기
댓글 내용 반영하였습니다.
댓글 목록을 가져오는 html 파일 첫 부분에 DB에서 전체 댓글의 comment_srl을 regdate순으로 추출합니다. DB 프리픽스는 각자 상황에 맞게 변경해야 합니다.
{@
$oDB = &DB::getInstance();
$query = $oDB->_query('select comment_srl from xe_comments where document_srl = '.$document_srl.' order by regdate');
$result = $oDB->_fetch($query);
$no = null;
foreach($result as $k => $c):
$no[] = $c->comment_srl;
endforeach;
array_flip($no);
}
$oDB = &DB::getInstance();
$query = $oDB->_query('select comment_srl from xe_comments where document_srl = '.$document_srl.' order by regdate');
$result = $oDB->_fetch($query);
$no = null;
foreach($result as $k => $c):
$no[] = $c->comment_srl;
endforeach;
array_flip($no);
}
그리고 댓글을 출력하는 영역의 원하는 위치에 댓글의 comment_srl과 대응되는 번호를 출력합니다.
{$no[$comment->comment_srl]+1}
스타일을 주기 위해 클래스를 준다면 이런 식으로 하면 됩니다.
<span class="클래스명">{$no[$comment->comment_srl]+1}</span>
추가로 원하는 다양한 접미어를 붙여서 사용할 수도 있습니다.
<span class="클래스명">{$no[$comment->comment_srl]+1}번 댓글</span>
댓글 9
쿼리할 때 ORDER BY를 하지 않으셨는데요. 그러면 저 순서가 맞다는 보장이 없습니다. 댓글 수가 적을 때는 대체로 맞게 나오겠지만, 댓글 수가 많아지거나 첨부파일이 끼어들어서 시퀀스 순서가 어긋나면 저것도 틀릴 수 있어요.
regdate만을 기준으로 순서를 판단하기 때문에, 초 단위까지 똑같은 시간에 댓글 2개가 등록되면 둘 다 같은 번호로 표시되겠네요. 1 2 3 3 5 6 이런 식?
따로 정렬할 필요는 없이 그냥 쓰면 되겠군요
네, regdate로 정렬하고 comment_srl을 추출하면 제가 말씀드린 두 가지 문제 모두 해결되겠네요.
한 가지 더... 댓글 수가 많으면 array_search가 느려질 수도 있습니다. 키가 아닌 값으로 검색하면 인덱스 타지 않는 DB 검색과 똑같은 알고리즘이 되어 버려서요... $no 배열을 생성한 직후에 array_flip으로 키와 값을 뒤집어 주고, 각각의 댓글 번호를 출력하는 부분에서는 {$no[$comment->comment_srl] + 1}으로 배열 키를 직접 참조하면 성능이 개선됩니다^^
반영하여 내용 수정하겠습니다 ㅎㅎ
제 생각에는 list_order나 comment_srl로 정렬하는 게 좋을 것 같습니다.
그리고 comment 모듈에 document_srl로 테이블 정보 가져오는 쿼리 xml이 있었던 걸로 기억하는데, 이걸 지원해주는 내장 함수가 있는지는 잘 모르겠네요.
따로 정렬할 필요는 없이 그냥 쓰면 되겠군요