개발 Q&A

제목 select box 관련 2가지 질문입니다.
글쓴이 ryuppp 작성시각 2013/01/03 06:48:48
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 20016   RSS
1. 일단 select box 두개를 배열을 이용해서 option들을 달아주었습니다. 
그리고 이제 이 option값이 바뀔때 마다 값을 전달해 페이지를 새로 열려고 하는데요, 
문제가 동적으로 생성된 select box의 값을 유지하면서 전달을 어떻게 해야하나 궁금합니다. 
무슨말이냐 하면, department를 바꿔서, 예를 들어 26번으로 하면 semester가 기본값(처음값)으로 같이 전달되고 
반대로 semester를 바꾸면 이젠 department가 바뀐 26번이 아니라 그냥 기본값으로 함께 전달이 됩니다.
물론 화면에서도 잠시 선택값으로 바꼈다가 초기값으로 돌아가 버립니다. 
어떻게 설정해야 두 변경된 값을 같이 유지하면서 controller에 넘겨 줄 수 있을까요?

view입니다. 
 <form action="<?php echo site_url('reports/app_stats');?>" id="select_dep_and_term" method="GET">
  <select id="dep_select" name="department">
   <?php foreach($departments as $dep): ?>
      <option value="<?php echo $dep['id'];?>">
       <?php echo $dep['full_name']; ?>
      </option>
    <?php endforeach ?>
  </select>


  <select id="term_select" name="semester">
   <?php foreach($semesters as $sem): ?>
      <option value="<?php echo $sem['id'];?>">
        <?php echo $sem['name']; ?>
      </option>
    <?php endforeach ?>
  </select>
 </form>
 
//select box 변경시 전송하는 부분입니다. 
<script type="text/javascript">
$(function(){
 $('#term_select').change(function(){
  $(this).parents().submit();
 });
});
controller의 부분입니다. select box의 두 값을 받아서 이 function을 돌려 페이지를 새로 열고 싶습니다. 
public function app_stats()
  {
   
   $program = $this->input->get('program', TRUE);
   if(!$program){
    $program = "1"; // default = Elementary
   }

   $term_id = $this->input->get('term', TRUE);
   if(!$term_id){
    $term_id = '20125'; // default = fall 2012
    
   }

   $term_id_next = $this->input->get('next_term', TRUE);
   if(!$term_id_next){
    if($term_id%5==0){
     $term_id_next = $term_id+6;
    }
    if($term_id%5==1){
     $term_id_next = $term_id+2;
    }
    if($term_id%5==3){
     $term_id_next = $term_id+1;
    }
    if($term_id%5==4){
     $term_id_next = $term_id+1;
    }
   }

   $this->load->model('reports_model');
   $data['applications_all'] = $this->reports_model->app_stats_all();
   $data['applications_is_submitted'] = $this->reports_model->app_stats_is_submitted();

   $data['applications_part'] = $this->reports_model->app_stats_part($program, $term_id);
   $data['applications_part_submitted'] = $this->reports_model->app_stats_part_submitted($program, $term_id);

   $data['applications_part_next'] = $this->reports_model->app_stats_part($program, $term_id_next);
   $data['applications_part_next_submitted'] = $this->reports_model->app_stats_part_submitted($program, $term_id_next);

   $data['departments'] = $this->reports_model->departments();
   $data['semesters'] = $this->reports_model->semesters();

   $this->load->view('header');
   $this->load->view('navigation');
   $this->load->view('reports/app_stats', $data);
   $this->load->view('footer');
  }


2. 두번째는 구조에 대한 문제인데요, 제가 database에서 select를 해올때(join된 동일 테이블에서입니다.) 
1) 그냥 모든 자료 다 가져오는 경우(select *) 와
2)where을 써서  어떤 경우만 가져오는 경우를 따로 다뤄야 되는데요, 
이걸 어떻게 다르게 할까 하다가 걍 model에 여러 다른 경우의 select구문을 다 만들어 버렸습니다. 
예를 들자면 
1) select A, B, C from Table 
2) select A, C from Table where k=1, j=2
3) select B, C from Table where k=1, f=4
이런식으로 말입니다. 그렇게 하긴했는데 아시다시피 그럼 code가 중복되는게 많아서 혹시나 
이런 반복을 피할 좋은 방법이 없나 질문 드립니다. 예를 들어 where k=*, j=*뭐 이렇게라도 할 수 있다면
중복을 꽤 피할 수 있을텐데...이런 구문은 없더라구요...

많이 찾아본다고 했는데 그래도 아직 기본이 약해 많이 어렵습니다. 
늘 잘 알려주시는 분들께 감사합니다. 새해 복 많이 받으시길... 
 다음글 보통 today 같은거 어떻게 구현하시나요? (3)
 이전글 안녕하세요~ (2)

댓글

변종원(웅파) / 2013/01/03 09:27:08 / 추천 0
 1. 폼에서 전송한 semester, department를 컨트롤러에서 받는 부분이 없네요.
받아서 다시 뷰에 보내주면 됩니다.

$data['semester'] = $this->input->get('semester', true);
$this->load->view('뷰', $data);

뷰에서는 option부분에 
$sem['id']와 컨트롤러에서 넘어온 $semester 값이 같을 경우
selected 구문을 넣어주는 if문 추가하면 됩니다.

2. 1,2,3번 구문 모두 하나의 함수 작성으로 처리할 수 있는 부분입니다.
테이블 갯수에 따라 배열로 넘어온 테이블배열을 implode() 함수로 풀고 
where절도 있으면 만들어주고 없으면 빈값으로 처리하면 됩니다.


ryuppp / 2013/01/04 04:34:57 / 추천 0
웅파님 정말 감사드립니다. 
2번 답은 아직 잘 몰라 좀 더 찾아봐야겠지만 
1번에 대한 답 주신것 적용해서 잘 처리했습니다. 
코드도 엉성할텐데 그럼에도 잘 알려주신 것 너무나 감사합니다. 
휴가시즌이라 일을 별로 안했지만 한 3주 가까이 끌어오던게 한방에 해결되었습니다. 
초보의 길은 멀고 험합니다. ^^;

새로운 한해 정말 복 많이 받으시길....감사합니다. 
변종원(웅파) / 2013/01/04 09:22:27 / 추천 0
처음 개발할때 구조를 잡고 공통모듈을 만들고 시작하면 좋은데 
실제론 만들다보니 공통화할 것이 생기죠.

2번 함수 같은 경우 제 경우엔 몇가지 케이스가 안됩니다.

코드 같은 것을 가져오는 함수나 토탈 갯수 가져오는 정도.
join 들어가면 정규화하기 귀찮고 막상 만들어도 거대 공룡이 되기 십상이어서 안하는 편입니다.