xe 게시판에서 권한이 없으면, 글 쓰기 버튼이 나타나지 않게 하는 방법


게시판 스킨을 들여다 보면, list.html 파일이 있습니다.



 <div class="btnArea">
    <span class="btn"><a href="{getUrl('act','dispBoardWrite','document_srl','')}">{$lang->cmd_write}...</a></span>


이부분이 게시판 글 목록 페이지에서 [쓰기...]라는 버튼을 표시해주는 부분입니다.

<a >태그 안에 XE에서 사용가능한 조건문을 넣어주면 쓰기 버튼을 감출 수 있습니다.


조건문은 아래와 같습니다. 로그인을 했고, 또 쓰기 권한이 있으면, 버튼을 표시하는거죠.


cond="$is_logged && $grant->write_document"




<div class="btnArea">
    <span class="btn"><a href="{getUrl('act','dispBoardWrite','document_srl','')}" cond="$is_logged && $grant->write_document" >{$lang->cmd_write}...</a></span>


이렇게 했더니, 글 쓰기 권한이 없을 경우, [쓰기]버튼이 표시되지 않았습니다.



Posted by 똑똑한 영장류


지금까지 구현한, 아주 기초적인 내용만 포함하고 있는 소스입니다.


조금씩 더 뼈대를 세우고 살을 붙여갈 생각입니다.

앞으로도 자세하게 설명글을 올리지는 못 해도, 업그레이드 되는 내용들 포스팅하도록 하겠습니다.


이건 출발점일 뿐입니다. ^^;



기존소스는 삭제했습니다.


22번 글에 정리된 소스를 다시 올리겠습니다.


Posted by 똑똑한 영장류


Chap 17.



view.php 에서 글을 삭제하는 버튼을 하나 만들어 주고 글 삭제를 해봅시다.


수정 버튼 다음에 아래처럼 삭제버튼을 추가합시다.


<?php
    if( $_SESSION['member_idx']==$data['member_idx']) {
        echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/bbs/delete.php?doc_idx='.$doc_idx.'">삭제</a>';
    }
?>


그리고, delete.php 를 만듭시다.


전달받은 doc_idx를 이용해서 DB에서 해당 데이터를 지워버리고 완료페이지를 표시하도록 합시다.


쿼리가 달라집니다.


$q = "DELETE FROM ap_bbs WHERE doc_idx=$doc_idx";
$result = $mysqli->query($q);


전체 코드는 아래와 같습니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
?>
<?php

$q = "DELETE FROM ap_bbs WHERE doc_idx=$doc_idx";
$result = $mysqli->query($q);

if ($result==false) {
    $_SESSION['delete_status'] = 'NO';
}
else {
    $_SESSION['delete_status'] = 'YES';
}

//$result->free();

$mysqli->close();
//var_dump($url);

header('Location: '.$url['root'].'bbs/delete_done.php');
exit();

?> 


delete_done.php 는 아래와 같습니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';


$delete_status = $_SESSION['delete_status'];
if($delete_status=='YES') {
    $message = '글이 삭제되었습니다.';
}
else {
    $message = '삭제 실패했습니다.';
}
?>
        delete_done.php - 게시판 글 삭제 완료 페이지<br />
        <hr />
<?php
    echo $message;
?>
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?>
 



지금까지 가장 기초적인 게시판을 제작해봤습니다.


고려해야 할 부분들이 많이 빠져있습니다.

각자 필요에 따라 하나하나 수정해 나가면서, 좋은 공부 되시길 바랍니다.



이상!







Posted by 똑똑한 영장류


Chap 16.



수정은 글 보기 와 매우 유사합니다. 우선 글 내용을 가져와서 화면에 뿌려주는데, Form 태그로 뿌려주어 수정할 수 있도록 하면 됩니다.


view.php를 수정해야겠네요.


현재 사용자와 글을 작성자가 같을 경우, 아래 쪽에 수정으로 가는 링크를 달아줍시다.


<?php
    if( $_SESSION['member_idx']==$data['member_idx']) {
        echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/bbs/modify.php?doc_idx='.$doc_idx.'">수정</a>';
    }

?>


그리고, modify.php 를 작성합시다.


write.php 와 유사하니까, 그대로 가져오고, 입력하는 부분에 문서 내용을 초기 값으로 노출시키면 되겠습니다. 그리고, modify_check.php에게 현재 글번호를 전달하기 위해 doc_idx  를 hidden으로 전송합니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';
?>
<?php
if(isset($doc_idx)==false) {
    echo '글번호가 지정되지 않았습니다.';
    exit();
}

$q = "SELECT * FROM ap_bbs WHERE doc_idx = $doc_idx";
$result = $mysqli->query($q);
$data = $result->fetch_array();

?>
글수정하기<br />
<form name ="modify_form" method = "POST" action = "./modify_check.php">
<input type="hidden" name="doc_idx" value="<?php echo $doc_idx ?>">
<table>
    <tr>
        <td>
    제목
    </td>
    <td>
            <input type ="text" name = "subject" size ="90" value="<?php echo $data['subject'];?>">
    </td>
    </tr>
    <tr>
        <td>
            내용
    </td>
    <td>
            <textarea name="content" cols="100" rows="10" ><?php echo $data['content'];?></textarea>
    </td>
    </tr>
</table>

<div>
    <input type = "submit" value = "저장">
</div>
   

</form>

<div>
    <?php
    echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/bbs/list.php" class="btn" >목록</a>';
    ?>
</div>



<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?> 


그리고,  submit 버튼이 클릭되면 받아서 처리할 modify_check.php를 만들어 줍시다.


modify_check.php 가 하는 일은 write_check.php와 유사합니다만, DB에 저장을 하는 것이 아니라, 기존 정보를 업데이트를 해야합니다. 쿼리가 달라지지요.

INSERT 가 아니라, UPDATE 문을 사용해야 합니다.


아래와 같습니다.


$q = "UPDATE ap_bbs SET subject='$subject',content='$content' WHERE doc_idx=$doc_idx";
$result = $mysqli->query($q); 



modify_check.php는 아래와 같습니다.


<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
?>
<?php

$q = "UPDATE ap_bbs SET subject='$subject',content='$content' WHERE doc_idx=$doc_idx";
$result = $mysqli->query($q);

if ($result==false) {
    $_SESSION['modify_status'] = 'NO';
}
else {
    $_SESSION['modify_status'] = 'YES';
}

//$result->free();

$mysqli->close();
//var_dump($url);

header('Location: '.$url['root'].'bbs/modify_done.php');
exit();

?> 


write_done.php 처럼 modify_done.php 를 작성해서 수정 후 결과 페이지를 만들어 줍니다. 내용을 거의 같습니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';


$modify_status = $_SESSION['modify_status'];
if($modify_status=='YES') {
    $message = '글이 수정되었습니다.';
}
else {
    $message = '수정 실패했습니다.';
}
?>
        modify_done.php - 게시판 글 수정 완료 페이지<br />
        <hr />
<?php
    echo $message;
?>
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?>
 



여기까지 글 수정에 관한 내용이었습니다.


이상!






Posted by 똑똑한 영장류


Chap 14.



리스트 화면의 아래 쪽에 각각의 페이지로 이동할 수 있는 링크를 만들어 보겠습니다.


페이지 표시하는 구간을 블럭이라고 이름하고, 현재 표시하고 있는 페이지를 포함하는 블럭 내의 페이지를 링크로 제공하도록 하겠습니다.


블럭은 10 개 단위로 끊겠습니다.

1페이지~10페이지가 블럭 1, 11페이지~20페이지가 블럭 2..이런 식입니다.


현재 3페이지를 표시하고 있으면, 아래와 같이 표시한다는 말입니다.


[1] [2] 3 [4] [5] [6] [7] [8] [9] [10] [다음]


현재 페이지가 속해 있는 블록 번호는 아래와 같이 구할 수 있습니다.


$page_per_block = 10;

$now_block = ceil($now_page / $page_per_block);



전체 게시물의 숫자와 페이지당 표시할 글의 수를 이용해서 전체 페이지 수를 구해낼 수 있습니다.


$total_page = ceil($total_record / $record_per_page);


전체 페이지수를 구했으니, 블럭 당 페이지 수를 이용해서 전체 블럭 수를 구할 수 있습니다.


$total_block = ceil($total_page / $page_per_block);


부트스트랩의 pagination 관련 CSS를 이용해서 아래와 같이 작성할 수 있습니다.


<div class="pagination">
    <ul>
<?php
$total_page = ceil($total_record / $record_per_page);
$total_block = ceil($total_page / $page_per_block);

if(1<$now_block ) {
  $pre_page = ($now_block-1)*$page_per_block;
  echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/bbs/list.php?page='.$pre_page.'">이전</a>';

}

$start_page = ($now_block-1)*$page_per_block+1;
$end_page = $now_block*$page_per_block;
if($end_page>$total_page) {
  $end_page = $total_page;
}

?>
   
<?php for($i=$start_page;$i<=$end_page;$i++) :?>
    <li><a href="./list.php?id=<?php echo $id ?>&page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
<?php endfor?>
</ul>
<?php
if($now_block < $total_block) {
  $post_page = ($now_block)*$page_per_block+1;
  echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/bbs/list.php?page='.$post_page.'">다음</a>';
}

?>
</div><!-- .pagination --> 




아래쪽에 페이지 표시가 되었습니다.

2페이지를 눌러볼까요?






2페이지에 글이 하나 보이는군요.


글목록 표시가 잘 되는군요.


이제 제목을 클릭했을 때, 글 내용을 보여주는 기능을 추가해보겠습니다.


우선 list.php 에서 제목 표시 부분에 링크를 걸어줘야겠군요.

클릭하면, 글의 id를 가지고 가서 글내용을 가져와 뿌려주는 view.php가 실행되도록 해야겠습니다.


글목록을 뿌려주는 부분에 제목 부분이 아래와 같이 수정됩니다.


<td><a href="http://<?php echo $_SERVER['HTTP_HOST'];?>/bbs/view.php?doc_idx=<?php echo $data['doc_idx']; ?>" ><?php echo $data['subject']?></a></td>


list.php는 이정도로 하고, 이어서, view.php를 작성해 보겠습니다.


이상!













Posted by 똑똑한 영장류


Chap. 13


이어서 목록 보여주기 위한 기능을 구현해 봅시다.


http://mydomain.com/bbs/list.php 로 접근하면 글 목록을 보여줘야겠군요.

한번에 다 못 보여주면 페이지를 지정해줘야겠지요?

GET 방식으로 아래와 같이 페이지를 지정할 수 있도록 합시다.


http://mydomain.com/bbs/list.php?page=1


아래코드로 list.php 를 시작합시다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';
?>
        목록<br />
       
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?> 




이렇게 시작합니다.



$q = "SELECT * FROM ap_bbs";
$result = $mysqli->query( $q);
$total_record = $result->num_rows;


우선 ap_bbs 에 글이 있는지 없는지 부터 확인을 합니다.

$total_record 가 0이 아니면, 테이블을 이용해서 목록을 표시하고 아니면, 글이 없다고 표시합니다.


php 변수를 체크해서 html로 화면에 뿌려야합니다. php와 html이 섞이게 됩니다.

이때 if 문을 효율적으로 사용할 수 있는 방법은 아래와 같습니다.


<?php if($total_record==0) :?>
    글이 없습니다.
<?php else :?>
              
<?php endif?>



php 문법에서 if 뒤에 따라오는 { } 들을 위 방식으로 대체해서 손쉽게 html 코드와 섞어 쓸 수 있습니다.


목록<br /> 아래에 위 코드를 기록합시다.


else 안을 작성해 봅시다.

뭔가 표시를 할 것이 있으니까, 제대로 값을 가져와야겠지요.


글목록을 표시할 때, 한 페이지에 몇개를 표시할지, 현재 몇번째 페이지를 표시할지를 알아야겠지요?


if( isset($page) ) {
    $now_page = $page;
}
else {
    $now_page = 1;
}


한 페이지에 표시할 글 수를 5개로 설정합시다.


$record_per_page = 5;


한페이지에 표시할 글 수와 현재 페이지를 아니까, 쿼리에서 가져올 글의 위치와 갯수를 설정해 줍시다.



$start_record = $record_per_page*($now_page-1);
$record_to_get = $record_per_page;

if( $start_record+$record_to_get > $total_record) {
  $record_to_get = $total_record - $start_record;
}

$q = "SELECT * FROM ap_bbs WHERE 1 ORDER BY doc_idx DESC LIMIT $start_record, $record_to_get";
$result = $mysqli->query($q);


테이블 안에 데이터들이 쭈욱~ 있는데, 원하는 페이지의 글들만 가져오려면, 몇번 데이터부터 몇개를 가져와야하는지를 계산하고, 쿼리에 적용을 한 내용입니다.


$result 안에 있는 데이터들을 하나씩 fetch 해서 화면에 뿌려주면 되겠습니다.


<table class="table">
    <thead>
        <th>글번호</th>
        <th>제목</th>
        <th>작성자 인덱스</th>
        <th>등록일시</th>
    </thead>
<?php while($data = $result->fetch_array()) :?>
    <tr>
        <td><?php echo $data['doc_idx']?></td>
        <td><?php echo $data['subject']?></td>
        <td><?php echo $data['member_idx']?></td>
        <td><?php echo $data['reg_date']?></td>
    </tr>
   
<?php endwhile ?>
</table>


table 태그에 클래스를 table 로 설정해줬습니다. 이 클래스는 부트스트랩에서 제공합니다.


이제 list.php에 접속해 봅시다.




위 처럼 보입니다.


위에 header 부분이 이전과 바뀌었죠?

'홈'은 index.php 로, '게시판 글쓰기'는 write.php로 가는 링크입니다. 뒤에 보이는 숫자는 로그인한 사용자의 member_idx 를 나타냅니다.


더 수정할 내용들은 다음 편에 계속하겠습니다.


이상!








Posted by 똑똑한 영장류


Chap 12.



어제 작성해놓은게 다 날아가버렸네요.


그래서, 다시 작성합니다.


www 디렉토리 아래에 bbs 라고 만들고 그 안에 관련 파일들을 작성하겠습니다.



그에 앞서, 이전에 작성했던 것 중에 몇가지 수정을 하겠습니다.


먼저 main.css

header, footer 에 테두리를 빨간색에서 회색(#C1C1C1)으로 변경합니다. content 는 #0FF 로 변경합니다. 빨간색이 너무 강렬해서 ㅋㅋ


그리고, header.php

css를 읽어오는 부분이 상대경로로 되어있으니, 범용 이용가능하게 수정을 합니다.


<link href="http://<?php echo $_SERVER['HTTP_HOST']; ?>/bootstrap/css/bootstrap.css" rel="stylesheet">
<link href="http://<?php echo $_SERVER['HTTP_HOST']; ?>/main.css" rel="stylesheet">



자..그럼..bbs 갑시다.

게시판의 내용을 저장할 테이블을 DB에 마련해둬야겠네요. 테이블 명은 ap_bbs 로 합시다.




간단히 위처럼 만들어두고, 먼저 글을 작성하기 위한 폼을 만들어봅시다.


로그인 폼에서 해 봤던 거랑 기본적 구조는 별 차이가 없습니다. form 태그로 입력폼 만들어 주고, 받아서 DB에 저장하면 되지요.


write.php 작성해 봅시다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';
?>
글쓰기<br />
<form name ="write_form" method = "POST" action = "./write_check.php">
<input type="hidden" name="member_idx" value="<?php echo $_SESSION['member_idx'] ?>">
<table>
    <tr>
        <td>
    제목
    </td>
    <td>
            <input type ="text" name = "subject" size ="90">
    </td>
    </tr>
    <tr>
        <td>
            내용
    </td>
    <td>
            <textarea name="content" cols="100" rows="10"></textarea>
    </td>
    </tr>
</table>

<div>
    <input type = "submit" value = "저장">
</div>
   

</form>
       
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?> 


쉽죠? login.php 와 유사합니다. 각 항목값의 name 잘 봐두세요. 저값을 받아서 DB에 저장하게 됩니다.


write_check.php 를 만듭시다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
?>
<?php

$reg_date = time();
$member_idx = $_SESSION['member_idx'];

$q = "INSERT INTO ap_bbs (member_idx, subject,content,reg_date) VALUES('$member_idx', '$subject', '$content', '$reg_date')";

$result = $mysqli->query($q);

if ($result==false) {
    $_SESSION['writing_status'] = 'NO';
}
else {
    $_SESSION['writing_status'] = 'YES';
}

$mysqli->close();

header('Location: '.$url['root'].'bbs/write_done.php');
exit();

?> 


글 등록시간을 구하기 위해 time() 함수를 이용했습니다. UNIX Timestamp 를 구해주는 함수입니다.


그리고, 글 작성자가 누구인지를 기록하기 위해, 세션에 저장된 member_idx 를 가져옵니다.

이 값은 login_check.php 에서 세션에 기록을 해두어야하는데요, 이전 작업에서 빠져있습니다.

login_check.php에서 암호확인이 성공한 부분에 아래 내용을 더 추가해줍시다.


$_SESSION['member_idx'] = $row['member_idx'];


전달받은 값들을 쿼리를 통해 DB에 저장을 하고, 저장이 성공하면, writing_status 에 'YES'를 , 그렇지 않으면, 'NO'를 기록해두고, write_done.php 로 리다이렉트를 합니다.


write_done.php에서는 이 세션값을 확인하고, 글저장 결과를 메세지로 뿌려주게 됩니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';


$writing_status = $_SESSION['writing_status'];
if($writing_status=='YES') {
    $message = '글이 저장되었습니다.';
}
else {
    $message = '저장에 실패했습니다.';
}
?>
        write_done.php - 게시판 글 저장 완료 페이지<br />
        <hr />
<?php
    echo $message;
?>
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?>
 


여기까지가 게시판에 글 저장하는 write 관련 내용이었습니다.







Posted by 똑똑한 영장류