텍스트큐브 댓글, 방명록을 write-once로 바꾸기

"댓글을 실수로 지워버릴 수 있기 때문에 write-once 방식으로 바꾸면 아주 좋을 것 같다"는 개인적인 애로사항이 꽃폈다. 하지만 텍스트큐브는 댓글/방명록을 '쓰기 전용'으로 만드는 옵션을 제공하지 않는 것 같다.

그래서 직접 한번 코드를 고쳐보기로 했다.

어떻게 고치지?

텍스트큐브의 내부 구조라든가, 코드가 어떤 방식으로 짜여있는가 하는 등은 전~혀 모르지만 텍스트큐브의 코드 자체가 나름 구조화(?) 되어있어서 그런지 해당 부분은 금방 찾을 수 있었다.

이번에 수정할 파일은 interface/comment/delete/index.php 하나 뿐이다.

이 파일은 디렉토리에서 풍기는 분위기와는 달리 delete, edit, commit이라는 세가지 기능을 모두 수행한다. (그 때문에 이 파일만 고치면 되는거다!)

코드는 대략 다음처럼 되어있다:

list($replier) = getCommentAttributes($blogid, $suri['id'], 'replier');
if (!empty($_POST['mode'])) {
    switch ($_POST['mode']) {
        case 'delete':
            // ...
        case 'edit':
            // ...
        case 'commit':
            // ...
    }
    respond::ErrorPage();
}
// ...

이야.. 다 끝났군하!

코드 중간 중간에 보면 에러 메시지를 출력해주는 훌륭한 함수 respond::ErrorPage(_text('msg'));가 쓰이고 있다. 이걸 그대로 써먹으면 되겠다.

write-once로 바꾸려면 delete와 edit가 불가능하면 되니까 주1 이 두 case 맨 위에 다음과 같이 추가하면 된다:

respond::ErrorPage(_text('댓글은 수정/삭제가 불가능합니다.'));
exit;

별로 많이 고칠 거 없이 간단하게 끝났다.

관리자가 스팸을 못지우는건 곤란;

그렇다! 적어도 관리자는 스팸을 지우기 위해서라도 댓글을 수정/삭제 할 수 있어야한다.

그 방법도 간단하다. 관리자인지 확인하는 코드는 이미 doesHaveOwnership()라는 함수로 잘 만들어져 있는데다가, 각 case에서는 항상 관리자인지 여부를 먼저 확인하도록 되어있다. 그러므로 관리자가 아닐 경우에만 위의 저 코드를 넣어주면 되는거다.

예를 들어, 관리자가 아닐 경우 delete를 못하게 하려면 다음처럼 수정한다:

        case 'delete':
            if (!list($entryId) = getCommentAttributes($blogid, $suri['id'], 'entry'))
                respond::ErrorPage(_text('댓글이 존재하지 않습니다.'));
            $result = false;
            if (doesHaveOwnership()) {
                $result = trashComment($blogid, $suri['id'], $entryId, isset($_POST['password']) ? $_POST['password'] : '');
            } else {
                respond::ErrorPage(_text('댓글은 수정/삭제가 불가능합니다.'));
                exit;
            }
            // ...

이렇게 하면 관리자일 경우엔 delete가 제대로 처리되서 휴지통에 들어가고, 그 외의 사용자는 에러 메시지를 보게 될 것이다.

이 정도면 얼추... 정리가 된건가?

주의 사항?

여기서 소개한 내용을 그대로 적용해버리면 관리자도 수정할 수 없게 된다. 그러므로 관리자는 수정 할 수 있도록 하고 싶다면, 약간의 꼼수를 더 써야한다.

하지만 그것은 이 글의 목적과 어긋나고, 어떻게 하면 되는지에 대한 기본적인 설명은 다 된 것으로 보이므로 다른 사람의 몫으로 남겨둔다.

유용한 정보였다면 트랙백 날려주시라!

  1. delete만 금지하고 edit는 가능하게 할 경우 글을 수정해서 빈 내용으로 바꿀 수 있으므로 엄밀히 말해 write-once가 아니다. 그러므로 write-once로 만들려면 delete 뿐 아니라 edit도 막아야 한다.
이올린에 북마크하기(0) 이올린에 추천하기(0)

,

2010/01/13 12:59 2010/01/13 12:59
[로그인][오픈아이디란?]