TIP게시판

제목 게시판 검색 폼을 세그먼트로 변환하기
글쓴이 드림 작성시각 2009/10/16 10:29:49
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 18296   RSS

아 첫 글이네요;;
CI 를 사용해보면서 좀 귀찮은 부분들을 최대한 간결하게 해결해보고 있는 중입니다 ^^;

그중에서 애매했던게 게시판 검색폼인데요.
이 부분이 세그먼트로 연결되야하는데 스크립트나 번거로운 방법을 최대한 줄여보고자 작성해봤습니다.

(controller) utility.php

<?php
class Utility extends Controller {

	function __construct()
	{
		parent::Controller();	
	}

	function search()
	{
		if($this->input->post('srchform_encode'))
		{
			$encode_field = explode(',', $this->input->post('srchform_encode'));
		}

		$segment = array();
		foreach($_POST as $key => $value)
		{
			if(substr($key,0,8) != 'srchform')
			{
				if(in_array($key, $encode_field))
				{
					$segment[$key] = $key;
					$segment[$key.'__'] = base64_encode_url($value);
				}
				else
				{
					$segment[$key] = $key;
					$segment[$key.'__'] = $value;
				}
			}
		}
		$result = $this->input->post('srchform_act').'/'.implode('/', $segment);

		redirect($result, 'refresh');
	}

}
그리고 각 게시판의 검색 폼에서는
<?
$attributes = array('name' => 'formname');
echo form_open('utility/search', $attributes);
?>
<input type="text" name="srchform_act" value="board/list">
<input type="text" name="srchform_encode" value="keyword,search">
<input type="text" name="search" value="aa">
<input type="text" name="type" value="tp">
<input type="submit" value="go">
</form>


srchform_ 으로 된 부분 값은 search 에서 필요한 값을 넘기는 것입니다.
srchform_act 는 현재 게시판의 주소라고 보면됩니다.

board/list/search/YWE~/type/tp

의 세그먼트 값으로 리턴됩니다.

srchform_encode 의 경우엔 base64 인코딩을 할 필드명을 넣어주시면 됩니다. 분리자는 , 입니다.
(다른 방법들로 문자열을 처리하셔도됩니다 ^^)

base64 관련 함수는 ci세상님의 board 소스에서 발췌했습니다. (http://codeigniter-kr.org/source/view/2/page/4/)

		/**
		* base64encode_url
		*
		*/
		if ( ! function_exists('base64_encode_url'))
		{
		function base64_encode_url($plainText)
		{
		$base64 = base64_encode($plainText);
		$base64url = strtr($base64, '+/=', '-_~');
		return $base64url; 
		}
		}

		/**
		* base64decode_url
		*
		*/
		if ( ! function_exists('base64_decode_url'))
		{
		function base64_decode_url($encoded) 
		{
		$base64 = strtr($encoded,'-_~','+/=');
		$plainText = base64_decode($base64);
		return $plainText;
		} 
		}
이후에 세그먼트 처리는.. 다른 팁들이나 추가로 쪼개서 쓰시면 하나의 룰로 통일 될 수 있을 듯 합니다.


(그나저나 팁이 될지 모르겠네요 -ㅅ-);;
 다음글 CI 쿼리 캐시의 캐시 경로 설정시 주의 사항 (1)
 이전글 codeigniter 트위터를 통한 최신동향 분석

댓글

ci세상 / 2009/10/16 10:50:24 / 추천 0
WOW~~ 왜? 이 생각을 못했을까요^^

검색폼이 하나일때에는 이러한 고민을 안하지만 10개만 넘어도 정말로 머리가 아파오는 부분이었습니다.

그래서 jQuery로 캐치를 해서 넘겨주거나 post값을 바로 받아서 처리를 하는 부분으로 처리를 해주었습니다.

1. jQuery로 넘기는 것은 불필요한 코딩을 하기 때문에 비효율적일것이구요
2. post값을 바로 받아서 처리하면 검색과 주소가 따로 놀기 때문에 좀 이상해 보일것입니다.

드림님께서 지금 해주신 이방식대로라면 저의 2가지 고민거리가 해결되었다고 생각이 듭니다.^^

<좀더 고려를 해본다면>
1. 인코딩, 디코딩을 제가 어제 배포한 패턴을 이용하면 위 과정을 생략할 수 있을것 같습니다.
2. 폼에서 바로 get 처럼 바로 간단하게 세그먼트로 넘겨줄 수는 없을까? (방법찾는중)

이상입니다.^^


※ 위와같은 좋은 생각들이 많이 공유가 될때 ~~ codeigniter 세상이 빨리 올것이라고 생각합니다.^^
드림 / 2009/10/16 12:27:49 / 추천 0
아.. 잠시하다보니.. encode 관련해서 미지정되버리면 array 가 없어서 문제가 되네요;

	function search()
	{
		if($this->input->post('srchform_encode'))
		{
			$encode_field = explode(',', $this->input->post('srchform_encode'));
		}
		else
		{
			$encode_field = array();
		}

		$segment = array();
		foreach($_POST as $key => $value)
		{
			if(substr($key,0,8) != 'srchform')
			{
				if(in_array($key, $encode_field))
				{
					$segment[$key] = $key;
					$segment[$key.'__'] = base64_encode_url($value);
				}
				else
				{
					$segment[$key] = $key;
					$segment[$key.'__'] = $value;
				}
			}
		}
		$result = $this->input->post('srchform_act').'/'.implode('/', $segment);

		redirect($result, 'refresh');
	}
우선 간단하게 수정..

인코딩 디코딩의 경우에 jquery 로 하신 패턴 리플레이스를 이야기하시는건가요? ^^
고민해보긴하는데 텍스트 입력에서는 언어문제가 될 경우들이 있을거 같아서 우선은 저렇게해놓고 고민중이긴합니다.

외부로 안나가고 바로바로 넘기는 방법도 좋을거같긴한데 전처리기를 한군데에 집중하는 것과 어느것이 나을지랑 최대한 코드 자체에 군더더기가 없게 하고싶은데 아직 이해가 떨어져서 그런지 딱 방법이 안떠오르네요