| 제목 | DB TABLE column comment 를 이용한 손쉬운 폼빌더 | ||
|---|---|---|---|
| 글쓴이 | 에반스 | 작성시각 | 2016/02/16 12:24:58 |
|
|
|||
|
안녕하세요. 어느덧 코드이그나이터로 8개월째 작업하면서 많은 걸 배워가는 유저입니다. 보통 Form 태그 안에 여러가지 input를 구성한 폼을 만드실텐데요. 보통 그 인풋값이 DB TABLE 의 Column 과 매칭되는 경우가 많더군요. 그래서 저는 column comment 안에 폼 빌딩에 필요한 몇가지 정보를 추가하여 사용하고 있습니다.
/**
* 컬럼정보 생성
* @param String $table 디비 테이블명
* @return array() Field,Type,
*/
function create_columns($table=""){
if(!$table) $table = $this->table;
$query ="show full columns from `$table`";
$tmps = $this->db->query($query)->result_array();
foreach ($tmps as $tmp) {
$this->columns[$tmp['Field']] = $this->reset_columns($tmp);
}
return $this->columns;
}
/**
* 디비 필드 정보들을 재조작 하여 저장
* @param array $col 필드정보를 가지고 있는 배열
* @return array 변경된 정보
*/
function reset_columns($col){
if( preg_match("/date/i", $col['Type']) ) $col['Type'] = "date";
if( preg_match("/datetime/i", $col['Type']) ) $col['Type'] = "datetime";
else if( preg_match("/여부/i", $col['Comment']) ) $col['Type'] = "switcher";
else if( preg_match("/파일경로/i", $col['Comment']) ) $col['Type'] = "file";
else if( preg_match("/varchar/i", $col['Type']) ) $col['Type'] = "text";
else if( preg_match("/text/i", $col['Type']) ) $col['Type'] = "textarea";
else if( preg_match("/enum/i", $col['Type']) ){
//enum 세팅 코멘드에서 셀렉트 옵션값 추출 또는 쿼리
preg_match("/\'.*\'/i", $col['Type'], $matches);
$values = explode(",", preg_replace("/\'|\"/i", "", $matches[0]));
$fd = explode("|", $col['Comment']);
$col['Comment'] = $fd[0];
$fds = explode(",", $fd[1]);
for ($n=0; $n < count($fds); $n++) {
$col['options'][] = array("value"=> $values[$n], "label"=> $fds[$n]);
}
$col['Type'] = "select";
}else if( preg_match("/int|float|double/i", $col['Type']) ){
$col['vali_rules'][] = "numeric";
if( preg_match("/int/i", $col['Type']) )
$col['options'] = 0;
else
$col['options'] = 2;
$col['Type'] = "number";
}
if($col['Key'] == "PRI"){
$this->primary = $col['Field'];
if($col['Extra'] == 'auto_increment'){
$col['Type'] = "hidden";
}
}
if($col['Null'] == "NO") $col['vali_rules'][] = "required";
$this->selections[] = $col['Field'];
$col['auth'] = "c,u,r,d";
unset($col['Null']);
unset($col['Key']);
unset($col['Extra']);
unset($col['Default']);
unset($col['Collation']);
unset($col['Privileges']);
return $col;
}
애초에 디비 테이블에 컬럼에는 자료형이 입력되어 있고 컬럼명도 있으니 여러가지로 재활용할 구석이 많습니다. 예를 들어, datetime 의 자료형의 경우, 폼 빌드할 때에 datetimepicker 같은 JS 플러그인을 달아 놓을 수 있죠. 데이터형이 varchar(10) 라면 폼검증시에 입력값의 MAX = 10 으로 검증하는 배열을 사전에 만들어 놓을 수 있습니다. enum()의 경우, 레이블 값을 코멘트에 미리 넣어놓으면 셀렉트 박스도 쉽게 만들 수 있죠. 코멘트를 보다 표준화 해서 입력한다고 가정하면, "~~여부" 의 경우, T or F 체크 박스로 활용할 수 있습니다. 무엇보다 DB 정보를 기준으로 폼빌딩 할 수 있기 때문에 개발과정에서 DB가 변경되거나 하면 관련 폼도 동시에 적용되어 개발시간 감축에 많은 도움이 됩니다. DB 설계가 완벽하지 않으면 자주 발생하는 일이라... 저에겐...^^;;;; 이제 막 시작하신 분들에게 작은 참고가 되길 바라며 어쭙지 않은 저의 코드를 올려 봅니다.
감사합니다.
function render_input($col,$value="",$no=""){
if(is_array($value)){
// 값이 배열로 들어오면 그 배열에서 해당 값을 찾아내
$arrValue = $value;
$value = $value[$col['Field']];
}
if($col['vali_rules'] && $no != "filter"){
foreach ( $col['vali_rules'] as $vali ) {
if($vali=="required")
$required = "required = 'required'";
else
$required = "";
}
}
if($no == "filter"){
$required = "";
}elseif($no=="insert"){
}else{
$col['Field'] .="[$no]";
}
ob_start();
if(preg_match("/c|u/i", $col['auth'])){
if( preg_match("/date/i", $col['Type']) ){ //날짜고르기 ?>
<?php if ($no=="filter"): ?>
<div class="input-daterange input-group no-padding">
<input id='<?=$col['Field']?>_datepicker_sp' type="text" name="<?=$col['Field']?>_sp" placeholder="<?=$col['Comment']?>" class="form-control" value="<?=$arrValue[$col['Field']."_sp"]?>" ><span class="input-group-addon">to</span>
<input id='<?=$col['Field']?>_datepicker_ep' type="text" name="<?=$col['Field']?>_ep" placeholder="<?=$col['Comment']?>" class="form-control" value="<?=$arrValue[$col['Field']."_ep"]?>" >
</div>
<script>
$('#<?=$col['Field']?>_datepicker_sp').datepicker({
format: "yyyy-mm-dd",
todayBtn: "linked",
language: "kr",
autoclose: true,
todayHighlight: true
});
$('#<?=$col['Field']?>_datepicker_ep').datepicker({
format: "yyyy-mm-dd",
todayBtn: "linked",
language: "kr",
autoclose: true,
todayHighlight: true
});
</script>
<?php else: ?>
<input id='<?=$col['Field']?>_datepicker' type="text" name="<?=$col['Field']?>" placeholder="<?=$col['Comment']?>" class="form-control" value="<?=$value?>" >
<script>
$('#<?=$col['Field']?>_datepicker').datepicker({
format: "yyyy-mm-dd",
todayBtn: "linked",
language: "kr",
autoclose: true,
todayHighlight: true
});
</script>
<?php endif ?>
<? }else if( $col['Type'] == "switcher" ){ //스위치 ?>
<input <?=($value)?"checked='checked'":"" ?> value='1' type="checkbox" id="<?=$col['Field']?>_switch" name="<?=$col['Field']?>" placeholder="<?=$col['Comment']?>" class="form-control i-checker">
<? }else if( $col['Type'] == "file" ){ // 파일업로드 ?>
<input value="<?=$value?>" type="file" name="<?=$col['Field']?>" placeholder="<?=$col['Comment']?>" value='' class="form-control" <?=$required?>>
<? }else if( $col['Type'] == "textarea" ) { //에디터 ?>
<textarea id='<?=$col['Field']?>_editor' name="<?=$col['Field']?>" placeholder="<?=$col['Comment']?>" class="form-control" <?=$required?>>
<?=$value?>
</textarea>
<script>
CKEDITOR.replace( '<?=$col['Field']?>_editor' );
</script>
<? }else if( $col['Type'] == "select" && $col['options'] ) { //셀렉트박스
if(!is_array($col['options'])){
$query = $this->CI->db->query($col['options']);
$col['options'] = array();
foreach ($query->result_array() as $row)
{
$col['options'][] = $row;
}
} ?>
<select id='<?=$col['Field']?>_select' name="<?=$col['Field']?>" class="form-control" value='<?=$value?>' <?=$required?>>
<option value="">선택안함</option>
<? foreach ($col['options'] as $opt) {
if($value == $opt['value']) $selected = "selected='selected'";
else $selected='';
?>
<option value="<?=$opt['value']?>" <?=$selected?> ><?=$opt['label']?></option>
<? } ?>
</select>
<? }else{ ?>
<input value="<?=$value?>" type="text" name="<?=$col['Field']?>" placeholder="<?=$col['Comment']?>" value='' class="form-control datalist-input" <?=$required?>>
<? } ?>
<? } ?>
<?
$html = ob_get_contents();
ob_end_clean();
return $html;
}
|
|||
| 다음글 | MY_Loader 확장을 이용한 레이아웃 구조 사용 | ||
| 이전글 | 초보팁] 모든 페이지에서 로그인여부 검사하기 (5) | ||
|
변종원(웅파)
/
2016/02/16 16:05:47 /
추천
0
|
|
한대승(불의회상)
/
2016/02/16 21:36:26 /
추천
0
좋은 아이디어 같습니다. 테스트 해봐야 겠네요. 정보 공유 감사 드립니다. |
|
방문넷
/
2016/02/16 21:40:01 /
추천
0
추천 +1
|
저는 comment 이용해서 db table 생성하고 스키마에 맞는 crud 파일 생성과 api에서 필수값 유무를 전처리하도록 할때 사용했었습니다.
최초 개발시 유용하겠네요. ^^