게시판 추가필드로 검색하기( 커스터 마이징 )
- 쎈돌
- 0
- 8,966
- 글주소
- 07-18
- Download
- ciboard_custom.zip(12.5 KB) 2016-07-1826
게시판생성시 추가필드 관리
http://www.ciboard.co.kr/tiptech/p/24
위의 url 을 보고,
추가된 필드로 리스트 페이지에서 검색을 할수 있도록 코드를 고쳐 보았습니다.
먼저 게시판 관리 -> 사용자정의에서 필드를 추가해 보겠습니다.
이렇게 하고 나면 글쓰기 할때 아래와 같이 핸드폰 번호 입력을 할수 있습니다.
글와 함께 추가필드인 핸드폰번호를 입력한다면 아래와 같이 post_extra_vars 테이블에 데이터가 입력되는 것을 확인할수가 있습니다.
이제 소스코드를 고쳐서 추가필드를 리스트 페이지에서 검색할수 있도록 바꿔 보겠습니다.
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>
위와 같이 변경해 보았습니다.
그 다음 변경할 파일은
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 버젼 기준 )
참고 용도로 확인해 주세요. ( 프리미엄 버젼은 베이직에 있는 파일과 다릅니다. )