테스트 사이트 - 개발 중인 베타 버전입니다

비회원의 글작성 후 자신이 쓴 비밀글 게시물 보기 채택완료

토루크막토 1개월 전 조회 177

안녕하세요. 

 

어려운 문제에 직면했습니다.

 

이 게시판은 비회원이 글을 작성할 수 있으며

글을 읽을 수 있는 레벨은 2입니다.

그리고 작성된 글은 비밀글이 됩니다.

 

이렇게 되어 있다보니 문제가 있습니다.

 

비회원이 글을 작성한 후 바로 글을 읽을 수 없게 됩니다.

그러다보니 글작성 후 읽을 수 없다는 경고창이 나오고 

바로 로그인 화면이 나오니 뭔가 좀 흐름이 안좋아 보입니다.

 

회원이 글 작성 후에 우선 자기가 작성한 글을 보고 목록으로 나가게 하고 싶은데
(원래 그누보드에서 기본적으로 이렇게 처리되는 것으로 알고 있는데

문제는 위에도 썼지만 작성한 글이 무조건 비밀글로 설정되기 때문에

그렇게 안되는 것 같습니다.)


어떻게 하면 자기가 쓴 글은 일단 한번 읽을 수 있게 할 수 있을까요?

 

고수님의 도움이 필요합니다 ㅠ_ㅠ

 

댓글을 작성하려면 로그인이 필요합니다.

답변 5개

채택된 답변
+20 포인트
1개월 전

질문을 댓글의 추가설명 처럼 실제 사용 상황을 설명했으면 좋았겠습니다

다음 두가지 방법이 있습니다

 

관리자가 글 내용을 수정한 후 비밀글을 풀고 있으며 ==>

1. 읽기권한을 1 로 설정시 

읽기권한을 1로 해도 관리자 수정전에는 비밀글이니 비번 모르면 읽지 못하겠지요

그런 상태로 둔 후 view.skin.php 상단에 비밀글이 아닐 때 레벨이 2 이상만 내용보기 가능하게 조건을 넣으면 되겠습니다

if ( strpos($view['wr_option'], "secret") ===false && $member['mb_level'] < 2) alert('회원만 읽기 가능');

 

2. 읽기권한을 2로 설정시

extend/user.config.php에서 방금 등록한 글이면 읽기 레벨을 임시로 1로 해주면 되겠습니다

if($bo_table =='qa' && $wr_id){
  if( get_session("ss_secret_{$bo_table}_{$write['wr_num']}" )) $board['bo_read_level'] = 1; 
}

 

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

토루크막토
1개월 전
안녕하세요 균이님. 답변 감사드립니다.
if($bo_table =='qa' && $wr_id){
if( get_session("ss_secret_{$bo_table}_{$write['wr_num']}" )) $board['bo_read_level'] = 1;
}
이 것을 user.extend.php 에 추가하니 말씀대로 비밀글임에도 읽을 수 있게 되었습니다.

어떻게 이렇게 한두줄로 가능한지는 불가사의 하지만
궁금한 것은 임시로 1레벨로 바뀐 것은 얼마나 지속되는 지 궁금합니다.
즉 임시의 기간이 어느정도인지, 그 임시의 기간을 수정할 수는 있는지 ... 가르침을 주시면 감사하겠습니다 !!


ps. 질문을 드리고 그누보드 전체파일에서 set_session을 검색해보고 있는데 워매...머가 먼지 모르겠구먼요.
토루크막토
1개월 전
// 비밀글이라면 세션에 비밀글의 아이디를 저장한다. 자신의 글은 다시 비밀번호를 묻지 않기 위함
if ($secret) {
if (!(isset($wr_num) && $wr_num)) {
$write = get_write($write_table, $wr_id, true);
$wr_num = $write['wr_num'];
}

set_session("ss_secret_{$bo_table}_{$wr_num}", TRUE);
set_session("ss_secret_{$bo_table}_{$wr_num}_expire", time() + (60 * 60 * 1)); // 1시간
}

write_update.php 파일에 위처럼
set_session("ss_secret_{$bo_table}_{$wr_num}_expire", time() + (60 * 60 * 1)); // 1시간
이거 한줄 추가 했습니다.

이렇게 사용해도 될까요?
균이
1개월 전
세션 유지시간은 common.php에 시간 설정이 있습니다
ini_set("session.gc_maxlifetime", 10800); <--3시간으로 되어있는데 사이트 전체 세션에 적용됩니다
3시간으로 되어있어도 브라우저를 닫으면 세션은 즉시 사라집니다
세션마다 따로 시간을 설정지시간은 common.php에 시간 설정이 있습니다
ini_set("session.gc_maxlifetime", 10800); <--3시간으로 되어있는데 사이트 전체 세션에 적용됩니다
3시간으로 되어있어도 브라우저를 닫으면 세션은 즉시 사라집니다
세션마다 따로 시간을 설정하는 것은 없습니다

1시간만 유지하는 것과 같은 처리는 다음과 같은 방법이 있겠습니다
1. view스킨에서 등록 시간이 1시간 지났으면 본인 글도 읽기시간이 경과 했다고 돌려보내기

2. set_session("ss_secret_{$bo_table}_{$wr_num}_expire", time() + (60 * 60 * 1)); // 1시간
이것처럼 세션에 시각을 넣도록 수정하려면 새로은 세션을 만들 것이 아니라
set_session("ss_secret_{$bo_table}_{$wr_num}", TRUE); 여기에 true 대신 시각을 넣으면 되겟습니다
set_session("ss_secret_{$bo_table}_{$wr_num}", G5_SERVER_TIME);
그런 후 user.config.php에서 조건을 변경해주면 되겠습니다

$sess_time = get_session("ss_secret_{$bo_table}_{$write['wr_num']);
if( empty($sess_time) ) $sess_time =0;

if( G5_SERVER_TIME - $sess_time ) < 3600 ) $board['bo_read_level'] = 1;

댓글을 작성하려면 로그인이 필요합니다.

1개월 전

본인이 어디 어디에 써야하고 고쳐야 하는지 어느 정도 아시니 한번 더 차분히 살펴보세요 ^^;;

저는 이야기로만 다시 한번 짚어 드릴께요

 

예를 들어 쿠키를 굽는다고 했을 때

필요한 것은 현재 게시판만 필요해야할거 같구( 모든 게시판 오픈 보다는 특정 게시판으로 한정하는게 좋습니다 )  위에서 잠깐 언급했듯이 쿠키의 생존 시간을 되도록 짧게하는게 좋습니다 비회원이니

누군가 현재의 컴퓨터로 다시 접근해서 비밀글을 볼 여지가 있기 때문에 최대한 10분 내외로 잡는게 좋을듯 합니다  필요시  본인 글 확인 페이지에서 쿠키를 삭제해도 됩니다

 

자 위의 것을 토대로 글 작성시 저장되는 페이지에서 이프문등을 구분해 넣어서 쿠키 처리합니다

 

글 저장 페이지 ============

if( 게시판 아이디 ==='게시판 아이디1' ||  게시판 아이디 ==='게시판 아이디2' ){

     if( 유저 아이디가 없는 ){

            10분짜리  A라는 이름의 쿠키 굽기

     }

}

위에서는 쿠키만 구우면 됩니다

//기존  글 입력 저장 소스들 ~~~

 

대략 위와 같은 프로세스일거구

 

 

 

글 보기 페이지 ============

 

글저장시 10분짜리 A라는 이름의 쿠키가 구워졌으니 해당 쿠키를 글보기 페이지에 적용합니다

글보기 페이지에 권한 설정된 부분을 

if( 기존 권한 설정 레벨 체크 부분){

    글 내용

}

 

위와 같은 형태를 

if( 기존 권한 설정 레벨 체크 부분 || 비회원이지만 쿠키가 남아 있다면 ){

글 내용  

// 필요시 쿠키를 바로 삭제

}

 

아쉬운대로

위와 같이하면 되긴 하지만   OR로 원본 소스를 추가해 주기에 썩 좋은 소스라 할 수는 없을거 같습니다 더 좋은 방법이 있으면 그 방법을 한번 써보세요

 

 

 

덧붙여 소스 작업중 막히시면

제일 좋은 것은 흐름도를 직접 타이핑해서 한줄 한줄 써보세요

그 구문들을 가지고 이프문을 만들고 그 흐름을 타면 됩니다

 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

1개월 전

세션이나 쿠키 이용하세요

글 저장시 쿠키 또는 세션을 따로 굽고

해당 쿠키가 살아 있는 동안 입장이 가능하도록 할 것인지등을 커스마이징하면 될듯 합니다

 

비회원이

글쓰기 후 쿠키나 세션이 살아 있으니 자신이 쓴 글을 읽을 수 있고

다음에 접근했을 때는 세션 혹은 쿠키가 없으니 패스워드 입력후 글 쓸때와 마찬가지로 쿠키나 세션을

구워서 같은 형식으로 보게하면 될듯 합니다

 

대신 비회원이니 되도록  세션이나 쿠키의 생존 시간을 길게 잡아서는 안됩니다

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

토루크막토
1개월 전
예뜨락 님의 말씀대로 해보려고 AI까지 써보면서 물어봤지만 제가 이해를 못하니 정확한 답은 안나오네요.

현재 board.php 파일의
// 자신의 글이거나 관리자라면 통과
if (($write['mb_id'] && $write['mb_id'] === $member['mb_id']) || $is_admin) {
;
} else {
// 비밀글이라면
if (strstr($write['wr_option'], "secret"))
{
// 회원이 비밀글을 올리고 관리자가 답변글을 올렸을 경우
// 회원이 관리자가 올린 답변글을 바로 볼 수 없던 오류를 수정
$is_owner = false;
if ($write['wr_reply'] && $member['mb_id'])
{
$sql = " select mb_id from {$write_table}
where wr_num = '{$write['wr_num']}'
and wr_reply = ''
and wr_is_comment = 0 ";
$row = sql_fetch($sql);
if ($row['mb_id'] === $member['mb_id'])
$is_owner = true;
}

$ss_name = 'ss_secret_'.$bo_table.'_'.$write['wr_num'];

if (!$is_owner)
{
//$ss_name = "ss_secret_{$bo_table}_{$wr_id}";
// 한번 읽은 게시물의 번호는 세션에 저장되어 있고 같은 게시물을 읽을 경우는 다시 비밀번호를 묻지 않습니다.
// 이 게시물이 저장된 게시물이 아니면서 관리자가 아니라면
//if ("$bo_table|$write['wr_num']" != get_session("ss_secret"))
if (!get_session($ss_name))
goto_url(G5_BBS_URL.'/password.php?w=s&amp;bo_table='.$bo_table.'&amp;wr_id='.$wr_id.$qstr);
}

set_session($ss_name, TRUE);
}
}

이 부분을

if (strstr($write['wr_option'], "secret")) {
// 작성자 본인 확인 로직
$is_author = false;

// 회원인 경우: 회원 ID로 확인 (기존 로직)
if ($write['mb_id'] && $member['mb_id'] && $write['mb_id'] === $member['mb_id']) {
$is_author = true;
}
// 비회원인 경우: 특정 게시판들에서만 세션으로 확인
else if (!$write['mb_id'] && $is_guest && in_array($bo_table, ['sell_a', 'sell_b', 'sell_c', 'buy_a', 'buy_b', 'buy_c'])) { // 지정된 게시판들만
$guest_session_name = 'ss_guest_author_'.$bo_table.'_'.$wr_id;

if (get_session($guest_session_name)) {
$is_author = true;
}
else if (get_cookie('guest_author_'.$bo_table.'_'.$wr_id) == 'Y') {
$is_author = true;
set_session($guest_session_name, true);
}
}

// 자신의 글이거나 관리자라면 통과
if ($is_author || $is_admin) {
;
} else {
// 기존 비밀글 처리 로직...
$is_owner = false;
if ($write['wr_reply'] && $member['mb_id']) {
$sql = " select mb_id from {$write_table}
where wr_num = '{$write['wr_num']}'
and wr_reply = ''
and wr_is_comment = 0 ";
$row = sql_fetch($sql);
if ($row['mb_id'] === $member['mb_id'])
$is_owner = true;
}

$ss_name = 'ss_secret_'.$bo_table.'_'.$write['wr_num'];

if (!$is_owner) {
if (!get_session($ss_name))
goto_url(G5_BBS_URL.'/password.php?w=s&amp;bo_table='.$bo_table.'&amp;wr_id='.$wr_id.$qstr);
}

set_session($ss_name, TRUE);
}
}


이렇게 수정하고

write_update.php 파일에
// 비밀글이라면 세션에 비밀글의 아이디를 저장한다. 자신의 글은 다시 비밀번호를 묻지 않기 위함
if ($secret) {
if (!(isset($wr_num) && $wr_num)) {
$write = get_write($write_table, $wr_id, true);
$wr_num = $write['wr_num'];
}

set_session("ss_secret_{$bo_table}_{$wr_num}", TRUE);
}

이 다음 라인에

// 비회원 본인 확인을 허용할 게시판 목록
$allowed_guest_boards = ['sell_a', 'sell_b', 'sell_c', 'buy_a', 'buy_b', 'buy_c'];

// 허용된 게시판에서 비회원이 글을 작성했을 때만 세션 설정
if (!$member['mb_id'] && $w == '' && in_array($bo_table, $allowed_guest_boards)) {
$guest_write_session = 'ss_guest_author_'.$bo_table.'_'.$wr_id;
set_session($guest_write_session, true);

// 선택사항: 쿠키로도 설정 (24시간 유지)
$cookie_name = 'guest_author_'.$bo_table.'_'.$wr_id;
set_cookie($cookie_name, 'Y', 86400);
}

이렇게 작성해 보았는데, 동작은 하지 않습니다 ㅠ_ㅠ

댓글을 작성하려면 로그인이 필요합니다.

1개월 전

글 작성은 '비회원' 가능인데..

글 읽기는 레벨 2 이상이라 '비회원' 불가라서.. 
이상해 보입니다.

글 읽기 레벨도 1 (이상) 로 설정하면 해결될 것 같습니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

토루크막토
1개월 전
답변 감사합니다. 글 읽기 레벨을 비회원으로 할 수 없는 이유가 있어서 그렇지요 ^^;;
간단히 회원가입 후 글 작성하게 해도 되고
글 읽기를 비회원으로 해도 문제가 해결되지만

글 하나 작성하라고 회원가입을 유도하면 글을 안쓰고...
글 내용을 비회원이 보게 되면 안되는 내용이 적혀 있어서
일단 비밀글로 한 후 관리자가 글 내용을 수정한 후 비밀글을 풀고 있으며
수정된 내용조차 아무나 읽으면 안되기 때문에 회원만 글 읽기가 가능하게 되어 있습니다.

댓글을 작성하려면 로그인이 필요합니다.

플라이
1개월 전

소스를 커스텀 해야 하는데

현재 자신의 글인경우는 해당글을 레벨권한이 아닌 자신의 글은 읽을수 있게 커스텀하면 가능하리라 보입니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

토루크막토
1개월 전
답변 감사합니다. board.php를 커스텀하면 될까요?
플라이
1개월 전
네 권한은 board.php 파일에서 권한체크를 하고 있습니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인