만들면서 배우는 CodeIgniter Q&A

제목 4.4 입력 기능 추가하기 쓰기 질문드립니다.
글쓴이 솔로군사 작성시각 2015/12/11 14:16:02
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 12512   RSS
[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

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로 출력해보면서 작업하세요.

솔로군사 / 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
아 제가 부족해서 잘못이해하고 있나봐요 ㅎㅎ 다시 차근차근 보겠습니다~ 주말 잘보내세요~