| 제목 | 4.4 입력 기능 추가하기 쓰기 질문드립니다. | ||
|---|---|---|---|
| 글쓴이 | 솔로군사 | 작성시각 | 2015/12/11 14:16:02 |
|
|
|||
[board.php]
<?php if(!defined('BASEPATH')) exit('No direct script access allowed');
/**
* 게시판 메인 컨트롤러
*/
class Board extends CI_Controller{
function __construct(){
parent::__construct();
$this->load->database();
$this->load->model('board_m');
}
/**
* 주소에서 메서드가 생략되었을 때 실행되는 기본 메서드
*/
public function index(){
$this->lists();
}
/**
* 사이트 헤더, 푸터가 자동으로 추가된다.
*
*/
public function _remap($method){
// 헤더 include
$this->load->view('header_v');
if(method_exists($this, $method)){
$this->{"{$method}"}();
}
// 푸터 include
$this->load->view('footer_v');
}
/**
*목록 불러오기
*/
public function lists(){
$this->output->enable_profiler(TRUE);
//검색어 초기화
$search_word = $page_url = '';
$uri_segment = 5;
//주소 중에서 q(검색어) 세그먼트가 있는지 검사하기 위해 주소를 배열로 변환
$uri_array = $this->segment_explode($this->uri->uri_string());
if(in_array('q', $uri_array)){
//주소에 검색어가 있을 경우의 처리. 즉 검색 시
$search_word = urldecode($this->url_explode($uri_array, 'q'));
//페이지네이션용 주소
$page_url = '/q/'.$search_word;
$uri_segment = 7;
}
//페이지네이션 라이브러리 로딩 추가
$this->load->library('pagination');
//페이지네이션 설정
$config['base_url'] = '/bbs/board/lists/ci_board'.$page_url.'/page/'; // 페이징 주소
$config['total_rows'] = $this->board_m->get_list($this->uri->segment(3), 'count', '', '', $search_word);
//게시물의 전체 개수
$config['per_page'] = 5; // 한 페이지 표시할 게시물 수
$config['uri_segment'] = $uri_segment; // 페이지 번호가 위치한 세그먼트
// 페이지네이션 초기화
$this->pagination->initialize($config);
// 페이징 링크를 생성하여 view에서 사용할 변수에 할당
$data['pagination'] = $this->pagination->create_links();
//게시물 목록을 불러오기 위한 offset, limit 값 가져오기
$page = $this->uri->segment($uri_segment, 1);
if($page > 1){
$start = (($page/$config['per_page'])) * $config['per_page'];
}else{
$start = ($page-1) * $config['per_page'];
}
$limit = $config['per_page'];
$data['list'] = $this->board_m->get_list($this->uri->segment(3), '', $start, $limit, $search_word);
$this->load->view('board/list_v', $data);
}
/**
* 게시물 보기
*/
function view(){
//게시판 이름과 게시물 번호에 해당하는 게시물 가져오기
$data['views'] = $this->board_m->get_view($this->uri->segment(3), $this->uri->segment(5));
// view 호출
$this->load->view('board/view_v', $data);
}
/**
* 게시물 쓰기
*/
function write(){
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
if($_POST){
//글쓰기 POST 전송 시
// 경고창 헬퍼 로딩
$this->load->helper('alert');
//주소 중에서 page 세그먼트가 있는지 검사하기 위해 주소를 배열로 변환
$uri_array = $this->segment_explode($this->uri->uri_string());
if(in_array('page', $uri_array)){
$pages = urldecode($this->url_explode($uri_array, 'page'));
}else{
$pages = 1;
}
if(!$this->input->post('subject', TRUE) AND !$this->input->post('contents', TRUE)){
//글 내용이 없을 경우, 프로그램단에서 한번 더 체크
alert('비정상적인 접근입니다.', '/bbs/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
exit;
}
//var_dump($_POST);
$write_data = array(
'table' => $this->uri->segment(3),
'subject' => $this->input->post('subject', TRUE),
'contents' => $this->input->post('contents', TRUE)
);
$result = $this->board_m->insert_board($write_data);
if($result){
// 글 작성 성공 시 게시물 목록으로
alert('입력되었습니다.', '/bbs/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
exit;
}else{
//글 실패 시 게시물 목록으로
alert('다시 입력해 주세요.', '/bbs/board/lists/'.$this->uri->segment(3).'/page/',$pages);
}
}else{
//쓰기 폼 view 호출
$this->load->view('board/write_v');
}
}
/**
* url 중 키값을 구분하여 값을 가져오도록
*
* @param Array $url : segment_explode 한 url 값
* @param String $key : 가져오려는 값의 key
* @return String $url[$k] : 리턴값
*/
function url_explode($url, $key){
$ctn = count($url);
for($i=0; $ctn>$i; $i++){
if($url[$i] == $key){
$k = $i+1;
return $url[$k];
}
}
}
/**
* HTTP의 URL을 "/"를 Delimiter로 사용하여 배열로 바꿔 리턴한다.
*
* @param string 대상이 되는 문자열
* @return string[]
*/
function segment_explode($seg){
// 세그먼트 앞뒤 '/' 제거 후 uri를 배열로 변환
$len = strlen($seg);
if(substr($seg, 0, 1) == '/'){
$seg = substr($seg, 1, $len);
}
$len = strlen($seg);
if(substr($seg, -1) == '/'){
$seg = substr($seg, 0, $len-1);
}
$seg_exp = explode("/", $seg);
return $seg_exp;
}
}
/* End of file board.php */
/* Location: ./application/controllers/board.php */
[list_v.php]
<article id="board_area">
<header>
<h1></h1>
</header>
<table cellspacing="0" cellpadding="0" class="table table-striped">
<thead>
<tr>
<th scope="col">번호</th>
<th scope="col">제목</th>
<th scope="col">작성자</th>
<th scope="col">조회수</th>
<th scope="col">작성일</th>
</tr>
</thead>
<tbody>
<?php
foreach($list as $lt){
?>
<tr>
<th scope="row">
<?php echo $lt->board_id;?>
</th>
<td><a rel="external" href="/bbs/<?php echo $this->uri->segment(1);?>/view/<?php echo $this->uri->segment(3);?>/board_id/<?php echo $lt->board_id;?>"><?php echo $lt->subject;?></a></td>
<td><?php echo $lt->user_name;?></td>
<td><?php echo $lt->hits;?></td>
<td><time datetime="<?php echo mdate("%Y-%M-%j", human_to_unix($lt->reg_date));?>"><?php echo mdate("%M. %j, %Y", human_to_unix($lt->reg_date));?></time></td>
</tr>
<?php
}
?>
</tbody>
<tfoot>
<tr>
<th colspan="5"><?php echo $pagination;?></th>
</tr>
</tfoot>
</table>
<div><p><a href="/bbs/board/write/<?php echo $this->uri->segment(3);?>/page/<?php echo $this->uri->segment(5);?>" class="btn btn-success">쓰기</a></p></div>
<div>
<form id="bd_search" method="post">
<input type="text" name="search_word" id="q" onKeyPress="board_search_enter(document.q);" /> <input type="button" value="검색" id="search_btn" />
</form>
</div>
</article>
제가 질문드릴 부분은 페이징을 넘기면 주소에 http://localhost:8080/bbs/board/lists/ci_board/page/5 라고 뒤에 page/ 뒤에 숫자가 나타나는데 제일처음접속시나 게시판 프로젝트 클릭해서 제일처음 1페이지가 뜰때는 페이지가 안뜹니다. 그래서 제가 하고 싶은말은 글내용 쓰기하고 리스트에 첫페이지에서 쓰기할 때 페이지 번호가 안 넘어갑니다. $pages = urldecode($this->url_explode($uri_array, 'page')); 이 값이 없는거죠.그리고 if(in_array('page', $uri_array)){ $pages = urldecode($this->url_explode($uri_array, 'page')); }else{ $pages = 1; } 쓰기버튼누를때 항상 true가 아닌지... 글 작성 버튼을 누르면 undefinde offset 이 뜨지만 리스트로 넘어가면서 저장까지는 다 됩니다. Q&A에서 찾아보니 비슷한 해답은 있는데 page 부분이 없을시 1로 만들어주는 부분이 어디인지 모르겠습니다. 질문이 맞는지 모르겠지만 잘 안풀리네요... |
|||
| 다음글 | 8.2 댓글쓰기 ajax로 구현하기 질문 (1) | ||
| 이전글 | p56 페이지 mdate 부분 질문드립니다. (3) | ||
|
변종원(웅파)
/
2015/12/11 15:37:44 /
추천
0
|
|
솔로군사
/
2015/12/11 16:12:41 /
추천
0
답변 감사합니다~ 얼추 이해는 갑니다~ alert로 찍어보면서 하고 있는데 한가지만 더 질문 드릴게요~
list_v 나 view_v 부분에서 쓰기버튼에 <a href="/bbs/board/write/<?php echo $this->uri->segment(3);?>/page/<?php echo $this->uri->segment(5);?>" class="btn btn-success">쓰기</a> 이런식으로 되어있자나요? 그러면 무조건 $uri_array에 page가 무조건 있는거 아닌가요...? view_v 부분에서야 /page/<?php echo $this->uri->segment(5);?> 이부분을 없애면 해결되는데 list_v 에서는 어떻게 넘겨줘야할까요? |
|
변종원(웅파)
/
2015/12/11 17:05:21 /
추천
0
무엇때문에 그러는건지 이해가 잘 안되네요. ^^; 페이지 변수가 없으면 내부적으로 선언하여 모델에서 문제가 없이 작동하고 페이지변수가 있으면 그걸로 작동하는건데요.
무엇이 궁금한지 다시 정리를 해보세요. |
|
솔로군사
/
2015/12/11 17:38:40 /
추천
0
아 제가 부족해서 잘못이해하고 있나봐요 ㅎㅎ 다시 차근차근 보겠습니다~ 주말 잘보내세요~
|
if(in_array('page', $uri_array))
{
$pages = urldecode($this->url_explode($uri_array, 'page'));
}else{
$pages = 1;
}
이 부분이 page 변수가 없을때 1로 할당해주는 부분입니다.
소스에서는 page 변수가 항상 쫓아다니기 때문에 초기화가 되지 않는거구요.
http://localhost:8080/bbs/board/write/ci_board/ 이렇게 넘어가면 $uri_array에 page가 없기 때문에 $pages =1 이 되는겁니다.
이해가 안되시면 해당 값들을 출력해보세요. 배열이던지 변수던지 print_r이나 echo로 출력해보면서 작업하세요.