코드이그나이터 기반 PHP 오픈소스 게시판 : 씨아이보드

게시판 추가필드로 검색하기( 커스터 마이징 )

  • 쎈돌
  • 0
  • 8,940
  • 글주소
  • 07-18

 

게시판생성시 추가필드 관리

http://www.ciboard.co.kr/tiptech/p/24 

 

위의 url 을 보고,

추가된 필드로 리스트 페이지에서 검색을 할수 있도록 코드를 고쳐 보았습니다.

 

먼저 게시판 관리 -> 사용자정의에서 필드를 추가해 보겠습니다.

 

 

239d38492d7641d0a3c408c5a2f1091f.png
 

 

이렇게 하고 나면 글쓰기 할때 아래와 같이 핸드폰 번호 입력을 할수 있습니다.

 

00fb499239db05cde77391b1214e11e4.png
 

글와 함께 추가필드인 핸드폰번호를 입력한다면 아래와 같이 post_extra_vars 테이블에 데이터가 입력되는 것을 확인할수가 있습니다.

 

89b76f8b9f7188b1104d6e5cb87c6dd9.png

 

 

이제 소스코드를 고쳐서 추가필드를 리스트 페이지에서 검색할수 있도록 바꿔 보겠습니다.

 

view 에서 추가필드를 검색할수 있도록 html 을 변경합니다.

views/board/사용하고있는스킨/list.php

 

                        <select class="form-control pull-left px100" name="sfield">

                            <option value="post_both" <?php echo ($this->input->get('sfield') === 'post_both') ? ' selected="selected" ' : ''; ?>>제목+내용</option>

                            <option value="post_title" <?php echo ($this->input->get('sfield') === 'post_title') ? ' selected="selected" ' : ''; ?>>제목</option>

                            <option value="post_content" <?php echo ($this->input->get('sfield') === 'post_content') ? ' selected="selected" ' : ''; ?>>내용</option>

                            <option value="post_nickname" <?php echo ($this->input->get('sfield') === 'post_nickname') ? ' selected="selected" ' : ''; ?>>회원명</option>

                            <option value="post_userid" <?php echo ($this->input->get('sfield') === 'post_userid') ? ' selected="selected" ' : ''; ?>>회원아이디</option>

<option value="phone" <?php echo ($this->input->get('sfield') === 'phone') ? ' selected="selected" ' : ''; ?>>핸드폰번호</option> 

                        </select> 

 

위와 같이 변경해 보았습니다.

 

 

1bf38f9aba590532e8cda9d6f819f625.png
 

 그 다음 변경할 파일은 

 

controller/Board_post.php

models/Post_model.php

 

입니다.

 

controller/Board_post.php 파일에서는 

 

$this->Post_model->allow_search_field = array('post_id', 'post_title', 'post_content', 'post_both', 'post_category', 'post_userid', 'post_nickname'); // 검색이 가능한 필드 

 

아래에 

 

$this->Post_model->allow_search_etc_field = array('phone'); // 검색이 가능한 추가필드


코드를 추가합니다.

 

 

        /**

         * 게시판 목록에 필요한 정보를 가져옵니다.

         */

        $where = array(

            'brd_id' => $this->board->item_key('brd_id', $brd_key),

        ); 

 

위에 것을 아래와 같이 바꿉니다.

 

 

        /**

         * 게시판 목록에 필요한 정보를 가져옵니다.

         */

        $where = array(

            'post.brd_id' => $this->board->item_key('brd_id', $brd_key),

        ); 

 

models/Post_model.php 에서는 바꿔야 할 부분이 많습니다.

바뀌거나 추가 되어야 할 부분만 볼드체로 강조 하겠습니다.

 

    /**

     * 테이블명

     */

    public $_table = 'post';

    public $allow_search_etc_field; 

 

        $search_or_like = array();

        $etc_search = false; 


            $ssf = $sfield;

            if ($skeyword && $ssf && in_array($ssf, $this->allow_search_field)) {

                if (in_array($ssf, $this->search_field_equal)) {

                    $search_where[$ssf] = $skeyword;

                } else {

                    $swordarray = explode(' ', $skeyword);

                    foreach ($swordarray as $str) {

                        if (empty($ssf)) {

                            continue;

                        }

                        if ($sop === 'AND') {

                            $search_like[] = array($ssf => $str);

                        } else {

                            $search_or_like[] = array($ssf => $str);

                        }

                    }

                }

            } else if ($skeyword && $ssf && in_array($ssf, $this->allow_search_etc_field)) {

                $etc_search = true;

                $search_where['pev_key'] = $ssf;

                $swordarray = explode(' ', $skeyword);

                foreach ($swordarray as $str) {

                    if (empty($ssf)) {

                        continue;

                    }

                    if ($sop === 'AND') {

                        $search_like[] = array('pev_value' => $str);

                    } else {

                        $search_or_like[] = array('pev_value' => $str);

                    }

                }

            } 


$this->db->select('post.*, member.mem_id, member.mem_userid, member.mem_nickname, member.mem_icon, member.mem_photo, member.mem_point');


        $str_select = 'post.*, member.mem_id, member.mem_userid, member.mem_nickname, member.mem_icon, member.mem_photo, member.mem_point';

        if( $etc_search ) {

            $str_select .= ', post_extra_vars.pev_value';

        }


        $this->db->select($str_select);



        $this->db->join('member', 'post.mem_id = member.mem_id', 'left');

        if( $etc_search ) {

            $this->db->join('post_extra_vars', 'post.post_id = post_extra_vars.post_id AND post.brd_id = post_extra_vars.brd_id', 'left');

        }


        $this->db->join('member', 'post.mem_id = member.mem_id', 'left');

        if( $etc_search ) {

            $this->db->join('post_extra_vars', 'post.post_id = post_extra_vars.post_id AND post.brd_id = post_extra_vars.brd_id', 'left');

        }




get_notice_list​ 메소드를 아래와 같이 바꿉니다.

 

        $search_or_like = array();

        $etc_search = false; 

 


            if ($skeyword && $ssf && in_array($ssf, $this->allow_search_field)) {

                if (in_array($ssf, $this->search_field_equal)) {

                    $search_where[$ssf] = $skeyword;

                } else {

                    $swordarray = explode(' ', $skeyword);

                    foreach ($swordarray as $str) {

                        if (empty($ssf)) {

                            continue;

                        }

                        if ($sop === 'AND') {

                            $search_like[] = array($ssf => $str);

                        } else {

                            $search_or_like[] = array($ssf => $str);

                        }

                    }

                }

            } else if ($skeyword && $ssf && in_array($ssf, $this->allow_search_etc_field)) {

                $etc_search = true;

                $search_where['pev_key'] = $ssf;

                $swordarray = explode(' ', $skeyword);

                foreach ($swordarray as $str) {

                    if (empty($ssf)) {

                        continue;

                    }

                    if ($sop === 'AND') {

                        $search_like[] = array('pev_value' => $str);

                    } else {

                        $search_or_like[] = array('pev_value' => $str);

                    }

                }

            }


$this->db->join('member', 'post.mem_id = member.mem_id', 'left');

        if( $etc_search ) {

            $this->db->join('post_extra_vars', 'post.post_id = post_extra_vars.post_id AND post.brd_id = post_extra_vars.brd_id', 'left');

        } 


if ($except_all_notice) {

            $this->db->where('post.brd_id', $brd_id);

            $this->db->where('post_notice', 1);

        } else {

            $this->db->where('(( '.$this->db->dbprefix('post.brd_id').' = ' . $brd_id . ' AND post_notice = 1) OR post_notice = 2) ', null, false);

        }



​실제로 쿼리 검색문이 아래와 같은 형식으로 나오면 성공입니다.

 

SELECT `cb_post`.*, `cb_member`.`mem_id`, `cb_member`.`mem_userid`, `cb_member`.`mem_nickname`, `cb_member`.`mem_icon`, `cb_member`.`mem_photo`, `cb_member`.`mem_point` FROM `cb_post` LEFT JOIN `cb_member` ON `cb_post`.`mem_id` = `cb_member`.`mem_id` LEFT JOIN `cb_post_extra_vars` ON `cb_post`.`post_id` = `cb_post_extra_vars`.`post_id` AND `cb_post`.`brd_id` = `cb_post_extra_vars`.`brd_id` WHERE `cb_post`.`brd_id` = '9' AND `post_del` <> 2 AND `pev_key` = 'phone' AND ( `pev_value` LIKE '%0102222%' ESCAPE '!' ) ORDER BY `post_num`, `post_reply` LIMIT 20


소스상에 바뀐 부분이 많아 첨부파일에

controller/Board_post.php

models/Post_model.php 

 

파일을 올려놓겠습니다. ( 베이직 1.6.6 버젼 기준 )

참고 용도로 확인해 주세요. ( 프리미엄 버젼은 베이직에 있는 파일과 다릅니다. )