ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeIgniter] 4. 게시판 프로젝트 - 검색, 입력, 보기 기능
    Web/CodeIgniter 2015. 8. 23. 14:00

     4.2.3 검색 만들기

      이번 절은 게시물 목록의 마지막인 검색 만들기입니다. 앞 절에서 기본 목록 모델에 페이지 변수를 추가한 것을 만들었습니다.


      뷰에서 검색어를 컨트롤러에 전송하고, 컨트롤러는 검색어를 처리해서 모델을 통해 데이터를 가져와서 다시 뷰로 전달해 화면에 출력합니다. 


      이번 절은 뷰 파일부터 살펴보겠습니다. 바로 위 참고에서 설명했던 것처럼 게시물 목록 화면이 출력된 후의 검색어 입력 부분부터 시작하므로 뷰 파일에서 시작하겠습니다.



     * bbs/application/views/board/list_v.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8"/>
            <meta name="apple-mobile-web-app-capable" content="yes" />
            <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
            <title>CodeIgniter</title>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
            <link type="text/css" rel="stylesheet" href="/bbs/include/css/bootstrap.css" />
            <script>
                $(document).ready(function() {
                    $("#search_btn").click(function() {
                        if ($("#q").val() == '') {
                            alert("검색어를 입력하세요!");
                            return false;
                        } else {
                            var act = "/bbs/board/lists/ci_board/q/" + $("#q").val() + "/page/1";
                            $("#bd_search").attr('action', act).submit();
                        }
                    });
                });
     
                function board_search_enter(form) {
                    var keycode = window.event.keyCode;
                    if (keycode == 13)
                        $("#search_btn").click();
                }
           </script>
        </head>
        <body>
            <div id="main">
                <header id="header" data-role="header" data-position="fixed">
                    <blockquote>
                        <p>
                            만들면서 배우는 CodeIgniter
                        </p>
                        <small>실행 예제</small>
                    </blockquote>
                </header>
                <nav id="gnb">
                    <ul>
                        <li>
                            <a rel="external" href="/bbs/<?php echo $this -> uri -> segment(1); ?>/lists/<?php echo $this -> uri -> segment(3); ?>"
                                게시판 프로젝트 </a>
                        </li>
                    </ul>
                </nav>
     
                <article id="board_area">
                    <header>
                        <h1></h1>
                    </header>
                    <h1></h1>
                    <table cellpadding="0" cellspacing="0">
                        <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); ?>/<?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("%Y-%M-%j", human_to_unix($lt -> reg_date));?>
                                </time></td>
                            </tr>
                            <?php
                            }
                           ?>
                        </tbody>
                        <tfoot>
                            <tr>
                                <th colspan="5"><?php echo $pagination;?></th>
                            </tr>
                        </tfoot>
                    </table>
                    <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>
                <footer id="footer">
                    <dl>
                        <dt>
                            <a class="azubu" href="http://www.cikorea.net/" target="blank"> CodeIgniter 한국 사용자포럼 </a>
                        </dt>
                        <dd>
                            Copyright by <em class="black">Palpit</em>.
                        </dd>
                    </dl>
                </footer>
            </div>
        </body>
    </html>
    cs



     

      Line 12: id가 search_btn인 부분을 클릭했을 때 function 부분을 실행하라는 의미입니다. 

      Line 13: 검색어 입력 없이 검색 버튼을 눌렀을 때 경고창을 띄어주는 부분입니다.

      Line 17: Form 전송의 action 부분을 만들어 주는 것으로 이 부분을 이용하지 않을 경우 검색 후 첫 번째 페이지에는 검색어가 적용된 게시물 목록이 뜨는데 2페이지, 3페이지 등 페이지를 이동한 경우에는 검색된 결과가 아닌 일반 게시물 목록을 불러옵니다.

      Line 18:  id가 bd_search 부분의 action 속성(attribute)으로 지정되고, 바로 submit 액션이 일어납니다.





      이제 뷰에서 전송한 주소를 컨트롤러에서 어떻게 처리하여 검색 결과를 만드는지 알아봅시다.



    * bbs/application/controllers/board.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    <?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');
            $this -> load -> helper(array('url''date'));
        }
     
        /**
         * 주소에서 메서드가 생략되었을 때 실행되는 기본 메서드
         */
        public function index() {
            $this -> lists();
        }
     
        /**
         * 목록 불러오기
         */
        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_segment1);
     
            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);
        }
     
        /**
         * url 중 키 값을 구분하여 값을 가져오도록
         *
         * @param Array $url : segment_explode 한 url 값
         * @param String $key :  가져오려는 값의 key
         * @return String $url[$k] : 리턴 값
         */
     
        function url_explode($url$key) {
            $cnt = count($url);
     
            for ($i = 0$cnt > $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($seg01== '/') {
                $seg = substr($seg1$len);
            }
     
            $len = strlen($seg);
     
            if (substr($seg-1== '/') {
                $seg = substr($seg0$len - 1);
            }
     
            $seg_exp = explode("/"$seg);
            return $seg_exp;
        }
     
    }
     
    cs



      Line 31: 컨트롤러 내부에서 사용하는 변수를 초기화 한 것입니다. $uri_segment 변수는 페이징 시 몇 번째 세그먼트가 실제 페이지 수인지를 pagination 라이브러리에 알려줍니다.

      Line 35: 주소의 세그먼트를 배열로 만들어주는 부분입니다. 세그먼트를 배열에 담아 배열 검색을 통해 주소에 검색어가 포함되어 있는지 검출할 때 사용합니다. 




     이것으로 컨트롤러는 처리했고, 모델만 수정하면 검색어가 적용된 결과를 돌려줘서 뷰에서 화면을 출력할 수 있습니다.




    * bbs/application/models/board_m.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    /**
     * 공통 게시판 모델
     */
     
    class Board_m extends CI_Model {
        function __construct() {
            parent::__construct();
        }
     
        function get_list($table = 'ci_board'$type = ''$offset = ''$limit = ''$search_word = '') {
     
            $sword = '';
     
            if ($search_word != '') {
                // 검색어 있을 경우
                $sword = ' WHERE subject like "%' . $search_word . '%" or contents like "%' . $search_word . '%" ';
            }
     
            $limit_query = '';
     
            if ($limit != '' OR $offset != '') {
                // 페이징이 있을 경우 처리
                $limit_query = ' LIMIT ' . $offset . ', ' . $limit;
            }
     
            $sql = "SELECT * FROM " . $table . $sword . " ORDER BY board_id DESC " . $limit_query;
            $query = $this -> db -> query($sql);
     
            if ($type == 'count') {
                $result = $query -> num_rows();
            } else {
                $result = $query -> result();
            }
     
            return $result;
        }
     
    }
     
    cs




     Line 15: 맨 마지막에 검색어가 다섯 번째 파라미터로 추가되었습니다.

     Line 19: 검색어가 있을 경우 $sword 변수에 검색 쿼리를 넣어줍니다. 이 소스에서는 검색어 구분없이 하나의 단어가 넘어 왔을 경우 제목과 글 내용에서 모두 찾을 수 있도록 되어있습니다.

     Line 31: 중간에 $sword 부분이 추가되었습니다. 검색어가 있을 경우 'WHERE subejct like "%검색어%" or contents like "%검색어%" 라는 WHERE 절이 포함됩니다.













     













    4.3 보기 기능 추가하기

     이번 절은 게시물 목록에서 해당 게시물을 클릭하여 게시물 보기로 이동하는 기능을 추가해보겠습니다. 


     게시물 목록에서는 SELECT 구문만 있었는데 게시물 보기도 SELECT 문이 중요하지만 조횟수를 올리는 부분에서 UPDATE 문도 사용합니다.


      컨트롤러를 먼저 보겠습니다. 소스를 보면 게시물 목록과 동일한 board.php 컨트롤러에 view 메서드가 추가되었습니다.

     

      board.php에 아래 함수를 추가해주시길 바랍니다.



    * board.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    /**
     *  게시판 메인 컨트롤러
     */
     
    class Board extends CI_Controller {
     
        ........
     
        /**
         * 게시물 보기
         */
        function view() {
            // 게시판 이름과 게시물 번호에 해당하는 게시물 가져오기
            $data['views'= $this -> board_m -> get_view($this -> uri -> segment(3), $this -> uri -> segment(4));
     
            // view 호출
            $this -> load -> view('board/view_v'$data);
        }
     
    }
     
    cs




      Line 18: board_m 모델에서 get_view 함수를 실행하여 데이터를 가져옵니다. 첫 번째 파라미터에 게시판 이름을, 두 번째에는 가져올 게시물 번호를 넘겨줍니다. 가져온 데이터를 $data['views'] 배열에 담습니다.

      Line 21: application/views/board/view_v.php 파일을 로딩하여 화면에 출력합니다. 게시물 상세내용에 대한 것은 $data 배열로 넘깁니다.



     게시물 보기 컨트롤러 부분은 간단합니다. 원하는 게시물의 내용을 가져와서 뷰에 전달만 합니다.



    * board_m.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    /**
     * 공통 게시판 모델
     */
     
    class Board_m extends CI_Model {
        function __construct() {
            parent::__construct();
        }
     
        function get_list($table = 'ci_board'$type = ''$offset = ''$limit = ''$search_word = '') {
     
            $sword = '';
     
            if ($search_word != '') {
                // 검색어 있을 경우
                $sword = ' WHERE subject like "%' . $search_word . '%" or contents like "%' . $search_word . '%" ';
            }
     
            $limit_query = '';
     
            if ($limit != '' OR $offset != '') {
                // 페이징이 있을 경우 처리
                $limit_query = ' LIMIT ' . $offset . ', ' . $limit;
            }
     
            $sql = "SELECT * FROM " . $table . $sword . " ORDER BY board_id DESC " . $limit_query;
            $query = $this -> db -> query($sql);
     
            if ($type == 'count') {
                $result = $query -> num_rows();
            } else {
                $result = $query -> result();
            }
     
            return $result;
        }
     
        /**
         * 게시물 상세보기 가져오기
         *
         * @param string $table 게시판 테이블
         * @param string $id 게시물 번호
         * @return array
         */
        function get_view($table$id) {
            // 조횟수 증가
            $sql0 = "UPDATE " . $table . " SET hits = hits + 1 WHERE board_id='" . $id . "'";
            $this -> db -> query($sql0);
     
            $sql = "SELECT * FROM " . $table . " WHERE board_id = '" . $id . "'";
            $query = $this -> db -> query($sql);
     
            // 게시물 내용 반환
            $result = $query -> row();
     
            return $result;
     
        }
     
    }
     
    cs







      게시물 보기는 삭제 부분과 같이 게시판 프로젝트에서 간단한 편에 속합니다. 이제 뷰 부분을 살펴보겠습니다.



     * bbs/application/views/board/view_v.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8"/>
            <meta name="apple-mobile-web-app-capable" content="yes" />
            <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
            <title>CodeIgniter</title>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
            <link type="text/css" rel="stylesheet" href="/bbs/include/css/bootstrap.css" />
            <script>
                $(document).ready(function() {
                    $("#search_btn").click(function() {
                        if ($("#q").val() == '') {
                            alert("검색어를 입력하세요!");
                            return false;
                        } else {
                            var act = "/bbs/board/lists/ci_board/q/" + $("#q").val() + "/page/1";
                            $("#bd_search").attr('action', act).submit();
                        }
                    });
                });
     
                function board_search_enter(form) {
                    var keycode = window.event.keyCode;
                    if (keycode == 13)
                        $("#search_btn").click();
                }
           </script>
        </head>
        <body>
            <div id="main">
                <header id="header" data-role="header" data-position="fixed">
                    <blockquote>
                        <p>
                            만들면서 배우는 CodeIgniter
                        </p>
                        <small>실행 예제</small>
                    </blockquote>
                </header>
                <nav id="gnb">
                    <ul>
                        <li>
                            <a rel="external" href="/bbs/<?php echo $this -> uri -> segment(1); ?>/lists/<?php echo $this -> uri -> segment(3); ?>"
                                게시판 프로젝트 </a>
                        </li>
                    </ul>
                </nav>
                <article id="board_area">
                    <header>
                        <h1></h1>
                    </header>
                    <table cellspacing="0" cellpadding="0" class="table table-striped">
                        <thead>
                            <tr>
                                <th scope="col"><?php echo $views -> subject;?></th>
                                <th scope="col">이름: <?php echo $views -> user_name;?></th>
                                <th scope="col">조회수: <?php echo $views -> hits;?></th>
                                <th scope="col">등록일: <?php echo $views -> reg_date;?></th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <th colspan="4">
                                    <?php echo $views -> contents;?>
                                </th>
                            </tr>
                        </tbody>
                        <tfoot>
                            <tr>
                                <th colspan="4">
                                    <a href="/bbs/board/lists/<?php echo $this -> uri -> segment(3); ?>/
                                        page/<?php echo $this -> uri -> segment(7); ?>" class="btn btn-primary">목록 </a>
                                    <a href="/bbs/board/modify/<?php echo $this -> uri -> segment(3); ?>/board_id/
                                        <?php echo $this -> uri -> segment(4); ?>/page/<?php echo $this -> uri -> segment(7); ?>"
                                        class="btn btn-warning"> 수정 </a>
                                    <a href="/bbs/board/delete/<?php echo $this -> uri -> segment(3); ?>/board_id/
                                        <?php echo $this -> uri -> segment(5); ?>/page/<?php echo $this -> uri -> segment(7); ?>"
                                        class="btn btn-danger"> 삭제 </a>
                                    <a href="/bbs/board/write/<?php echo $this -> uri -> segment(3); ?>/page/<?php echo $this -> uri -> segment(7); ?>"
                                        class="btn btn-success">쓰기</a>                    
                                </th>
                            </tr>
                        </tfoot>
                    </table>
                </article>
                <footer id="footer">
                    <dl>
                        <dt>
                            <a class="azubu" href="http://www.cikorea.net/" target="blank"> CodeIgniter 한국 사용자포럼 </a>
                        </dt>
                        <dd>
                            Copyright by <em class="black">Palpit</em>.
                        </dd>
                    </dl>
                </footer>
            </div>
        </body>
    </html>
    cs



      Line 56: 첫 번째 라인에는 제목($views->subject)과 이름, 조회수, 등록일을 보여줍니다. 컨트롤러에서 $data['views'] 변수에 게시물 상세 내용을 담았고, view에는 $data 변수 전체를 넘겼습니다. 이것은 view에 하나의 데이터가 아닌 여러 개의 데이터를 넘기기 위해 배열 형태로 넘기는 것입니다. 


      Line 72: 목록, 수정, 삭제 쓰기 액션을 모아놓은 라인입니다. segment 3은 게시판 테이블 명이고, segment 5는 게시물 번호, segment 7은 페이지 수입니다.





     











    4.4 입력 기능 추가하기

     입력 기능에서는 폼 전송을 이용해 데이터를 전달하는 방법 jQuery를 이용해 전송 시 빈 값을 체크하는 방법에 대해 알아봅니다.


     먼저, 컨트롤러 소스를 살펴보겠습니다.



     * board.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    /**
     *  게시판 메인 컨트롤러
     */
     
    class Board extends CI_Controller {
        
         .....
     
     
        /**
         * 게시물 쓰기
         */
        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(
                    'subject' => $this -> input -> post('subject', TRUE), 
                    'contents' => $this -> input -> post('contents', TRUE), 
                    'table' => $this -> uri -> segment(3)
                );
     
                $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);
                    exit;
                }
            } else {
                // 쓰기 폼 view 호출
                $this->load->view('board/write_v');
            }
        }
     
    }
     
    cs




      Line 40: 데이터베이스에 넣을 값을 배열로 만듭니다. "데이터베이스 필드명" => "넣을 값" 형태입니다.

      Line 46: board_m 모델의 insert_board 함수에 Line 40에서 만든 배열을 전달하여 데이터베이스를 입력하고, 그 결과를 돌려받습니다. 




      board.php에서 alert 헬퍼를 사용하기에 alert_helper.php 를 작성해야 합니다.




    * bbs/system/helpers/alert_helper.php



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    function alert($msg = '이동합니다'$url = '') {
        $CI = &get_instance();
        echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . $CI -> config -> item('charset') . "\">";
     
        echo "
            <script type='text/javascript'>
                alert('" . $msg . "');
                location.replace('" . $url . "');
            </script>
        ";
        exit ;
    }
     
    // 창 닫기
    function alert_close($msg) {
        $CI = &get_instance();
        echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . $CI -> config -> item('charset') . "\">";
     
        echo "<script type='text/javascript'> alert('" . $msg . "'); window.close(); </script>";
        exit ;
    }
     
    function alert_only($msg$exit = TRUE) {
        echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . $CI -> config -> item('charset') . "\">";
     
        echo "<script type='text/javascript'> alert('" . $msg . "'); </script>";
     
        if ($exit)
            exit ;
    }
     
    function replace($url = '/') {
        echo "<script type='text/javascript'>";
        if ($url)
            echo "window.location.replace('" . $url . "');";
        echo "</script>";
        exit ;
    }
     
    cs






      이번 입력 부분에서 컨트롤러의 새로운 형태가 나왔습니다. 뷰를 보여주는 부분과 글 입력 액션 부분이 하나의 컨트롤러에 있고 POST 전송 값 여부에 따라 분기합니다. 


      실무에서 자주 사용하는 형태 중 하나 입니다. 지금까지는 컨트롤러의 메서드에서 분기 없이 변수 처리, 모델 호출, 뷰 형태였습니다.


      이제 board_m 모델에서 insert_board 함수를 살펴보겠습니다.



     * board_m.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    /**
     * 공통 게시판 모델
     */
     
    class Board_m extends CI_Model {
        function __construct() {
            parent::__construct();
        }
     
        function get_list($table = 'ci_board'$type = ''$offset = ''$limit = ''$search_word = '') {
     
            $sword = '';
     
            if ($search_word != '') {
                // 검색어 있을 경우
                $sword = ' WHERE subject like "%' . $search_word . '%" or contents like "%' . $search_word . '%" ';
            }
     
            $limit_query = '';
     
            if ($limit != '' OR $offset != '') {
                // 페이징이 있을 경우 처리
                $limit_query = ' LIMIT ' . $offset . ', ' . $limit;
            }
     
            $sql = "SELECT * FROM " . $table . $sword . " ORDER BY board_id DESC " . $limit_query;
            $query = $this -> db -> query($sql);
     
            if ($type == 'count') {
                $result = $query -> num_rows();
            } else {
                $result = $query -> result();
            }
     
            return $result;
        }
     
        /**
         * 게시물 상세보기 가져오기
         *
         * @param string $table 게시판 테이블
         * @param string $id 게시물 번호
         * @return array
         */
        function get_view($table$id) {
            // 조횟수 증가
            $sql0 = "UPDATE " . $table . " SET hits = hits + 1 WHERE board_id='" . $id . "'";
            $this -> db -> query($sql0);
     
            $sql = "SELECT * FROM " . $table . " WHERE board_id = '" . $id . "'";
            $query = $this -> db -> query($sql);
     
            // 게시물 내용 반환
            $result = $query -> row();
     
            return $result;
     
        }
        
        /**
         * 게시물 입력
         * 
         * @param array $arrays 테이블 명, 게시물 제목, 게시물 내용 1차 배열
         * @return boolean 입력 성공여부
         */
        function insert_board($arrays) {
            $insert_array = array(
                'board_pid' => 0,
                'user_id' => 'advisor',
                'user_name' => 'palpit',
                'subject' => $arrays['subject'],
                'contents' => $arrays['contents'],
                'reg_date' => date("Y-m-d H:i:s")
            );
            
            $result = $this->db->insert($arrays['table'], $insert_array);
            
            return $result;
        }
     
    }
     
    cs




      입력 부분도 간단합니다. 컨트롤러에는 로그인 여부와 권한을 체크하는 부분이 있습니다.


      게시판을 만들 때 읽기, 쓰기, 수정, 삭제에 대한 권한을 줍니다. 보통 읽기는 아무나 가능하고 쓰기는 로그인한 사람에게만 주고, 수정과 삭제는 글쓴이 본인에게만 권한을 줍니다.

     

      이제 뷰를 살펴보겠습니다.



    * bbs/application/views/board/write_v.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8"/>
            <meta name="apple-mobile-web-app-capable" content="yes" />
            <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
            <title>CodeIgniter</title>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
            <link type="text/css" rel="stylesheet" href="/bbs/include/css/bootstrap.css" />
            <script>
                $(document).ready(function() {
                    $("#write_btn").click(function() {
                        if ($("#input01").val() == '') {
                            alert('제목을 입력해 주세요.');
                            $("#input01").focus();
                            return false;
                        } else if ($("#input02").val() == '') {
                            alert('내용을 입력해 주세요.');
                            $("#input02").focus();
                            return false;
                        } else {
                            $("#write_action").submit();
                        }
                    });
                });
           </script>
        </head>
        <body>
            <div id="main">
                <header id="header" data-role="header" data-position="fixed">
                    <blockquote>
                        <p>
                            만들면서 배우는 CodeIgniter
                        </p>
                        <small>실행 예제</small>
                    </blockquote>
                </header>
                <nav id="gnb">
                    <ul>
                        <li>
                            <a rel="external" href="/bbs/<?php echo $this -> uri -> segment(1); ?>/lists/<?php echo $this -> uri -> segment(3); ?>"> 게시판 프로젝트 </a>
                        </li>
                    </ul>
                </nav>
                <article id="board_area">
                    <header>
                        <h1></h1>
                    </header>
                    <form class="form-horizontal" method="post" action="" id="write_action">
                        <fieldset>
                            <legend>
                                게시물 쓰기
                            </legend>
                            <div class="control-group">
                                <label class="control-label" for="input01">제목</label>
                                <div class="controls">
                                    <input type="text" class="input-xlarge" id="input01" name="subject">
                                    <p class="help-block">
                                        게시물의 제목을 써주세요.
                                    </p>
                                </div>
                                <label class="control-label" for="input02">내용</label>
                                <div class="controls">
                                    <textarea class="input-xlarge" id="input02" name="contents" rows="5"></textarea>
                                    <p class="help-block">
                                        게시물의 내용을 써주세요.
                                    </p>
                                </div>
     
                                <div class="form-actions">
                                    <button type="submit" class="btn btn-primary" id="write_btn">
                                        작성
                                    </button>
                                    <button class="btn" onclick="document.location.reload()">
                                        취소
                                    </button>
                                </div>
                            </div>
                        </fieldset>
                    </form>
                </article>
                <footer id="footer">
                    <dl>
                        <dt>
                            <a class="azubu" href="http://www.cikorea.net/" target="blank"> CodeIgniter 한국 사용자포럼 </a>
                        </dt>
                        <dd>
                            Copyright by <em class="black">Palpit</em>.
                        </dd>
                    </dl>
                </footer>
            </div>
        </body>
    </html>
    cs








     








    다음 포스트에서는 게시물 수정 및 삭제 기능에 대해 보도록 하겠습니다.






    * 이 포스트는 서적 '만들면서 배우는 CodeIgniter 프레임워크'를 참고하여 작성하였습니다

    댓글

Designed by Tistory.