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

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

 

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

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 버젼 기준 )

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

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오톡으로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

팁&테크

번호 제목 글쓴이 날짜 조회수
공지 프리미엄 버전의 판매는 중단 되었습니다. +18 icon 관리자 08-09 10,642
공지 휴대폰본인인증, 아이핀본인인증 기능 런칭 icon 관리자 04-08 11,259
공지 씨아이보드 테이블구조 icon 관리자 03-22 12,300
공지 PHP 7 지원 +3 icon 관리자 02-01 9,417
공지 씨아이보드 매뉴얼 +4 icon 어드민 08-31 10,851
공지 CI 3.0 한글 매뉴얼 +3 icon 어드민 08-24 9,690
27 씨아이보드 초보팁] 모든 페이지에서 로그인여부 검사하기 할때 주의 할점. 발자취 10-03 2,016
26 씨아이보드 게시판 추가필드로 검색하기( 커스터 마이징 ) 쎈돌 07-18 2,808
25 씨아이보드 네이버 블로그 자동포스팅 기능 런칭 +1 icon 관리자 04-01 5,096
24 씨아이보드 bit.ly 짧은 주소 적용하기 icon 관리자 02-19 3,991
23 씨아이보드 휴면계정 관리 기능 런칭 icon 관리자 02-06 2,599
22 씨아이보드 사이트맵 기능 런칭 icon 관리자 02-03 2,245
21 씨아이보드 스케쥴러 기능 런칭 icon 관리자 02-01 2,381
20 씨아이보드 프로파일링 기능 런칭 icon 관리자 01-26 1,914
19 씨아이보드 베이직 -> 프리미엄 업그레이드 방법 icon 관리자 12-24 2,196
18 코드이그나이터 mysqli 와 pdo 설정 방법 +1 icon 관리자 11-12 3,080
17 씨아이보드 PHP 5.5.x preg_replace() : The /e modifi… +11 매너달팽이 11-06 2,531
16 씨아이보드 CI nginx rewrite rules +1 철수킹 11-05 2,276
15 씨아이보드 Event Trigger 기능 추가 +4 icon 관리자 11-03 2,828
14 씨아이보드 배너관리 기능 +5 icon 관리자 10-05 2,056
13 씨아이보드 구글 래캡챠 (Google reCaptcha) 사용방법 +1 icon 관리자 09-21 4,847
12 씨아이보드 소셜로그인 - 카카오 연동방법 +1 icon 관리자 09-14 3,970
11 씨아이보드 소셜로그인 - 네이버 연동방법 icon 관리자 09-14 3,289
10 씨아이보드 소셜로그인 - 구글 연동방법 icon 관리자 09-14 5,812
9 씨아이보드 소셜로그인 - 트위터 연동방법 icon 관리자 09-14 3,222
8 씨아이보드 소셜로그인 - 페이스북 연동방법 +1 icon 관리자 09-14 5,307