CI 묻고 답하기

제목 일주일동안 헤메다 체크박스 선택 수정하기 관련 글 올립니다.
글쓴이 rhe 작성시각 2015/07/31 07:11:45
댓글 : 5 추천 : 0 스크랩 : 1 조회수 : 16622   RSS
뷰페이지에서 테이블에서 값을 가져와 리스트로 보여줍니다
리스트에 10개가 보여질 경우 아래와 같이 해서 10개가 보여집니다.
<?
 $k = 0;
 $i = $total_count;
foreach ($item as $row) :

$k += 1;
?>
<tr>
<input type="hidden" name="idx[]" value="<?=$row->idx?>" />
<td><div class="checkbox"><input type="checkbox" name="chk[]" value="<?=$k?>" /></div></td>
<td><span class="label label-success"><?=$k?></span></td>
<td><input type="text" class="form-control" name="name[]" value="<?=$row->name?>"></td>
</tr>
<?
$i--;
endforeach
 ?>
텍스트박스의 이름을 idx[<?=$k?>] name[<?=$k?>] 이렇게도 해보았습니다.


=====================================================================

컨트롤러페이지에서 // 체크박스 수 만큼 포문을 돌려서 

// 폼검증.
$this->form_validation->set_rules('chk[]', 'chk', 'trim|required|xss_clean');
$this->form_validation->set_rules('name[]', 'name', 'trim|required|xss_clean');

 for ($i=0; $iinput->post('chk')); $i++) 
{
 $no = $this->input->post('chk'); // 체크박스 번호
  $idx = $this->input->post('idx');
 $name = $this->input->post('name');
echo "$i ====$no[$i]=======   $idx[$i] ------$name[$i]";
 }

뷰페이지에서 리스트에 10개가 보여지는데 체크박스를 무작위로 4개만 체크하여서 수정을 누를 경우
체크박스의 값은 체크한 부분에 대해서 volue 값을 보여줍니다. (체크한 부분을 true 해서 그런거 아닌가 생각해봅니다)
그런데 텍스트박스의 값을 맨위에서 부터 순서대로 4개가 보여집니다.
체크한 부분의 값을 보여주어야 하는데 뷰페이지 리스트 맨위부터 4개가 순차적으로 보여주어 좀 당황스럽습니다.
질문게시판에서 이리저리 답을 찾아보아도 제가 원하는 답이 없어서
구글링에서도 찾기 어렵고 해서 글을 남깁니다.
컨트롤러에서 배열을 해야하는지 어떻게 해야할지 난감합니다.
체크한 부분의 텍스트박스 값을 보여주려면 어떻게 해야하는지요
답을 좀 상세히 알려주시면 감사하겠습니다. 
 다음글 DB 접속 오류 입니다 (1)
 이전글 파일 업로드 질문입니다. (2)

댓글

ci개밟자 / 2015/07/31 09:37:11 / 추천 0
for 부분 코드가 이상한데요?
kaido / 2015/07/31 09:48:17 / 추천 0
저는 이렇게 만듭니다.

checkbox  name="chk[]" value="{id}"
hidden name="data_{id}"

※ {} 표현은 변한 다는 의미로 넣은 것입니다.

뷰에서는 이렇게 쌍이 되는 배열을 넣습니다.
가령 10개가 있다고 합시다. [0 부터 9까지]

이걸 전송 하면 체크 박스는 체크 된것만 전송 됩니다.
data 는 10개 전부 전송 됩니다.

가령 2번 5번 7번이 체크 되었다고 생각 합니다.

그럼 체크 박스에 들어있는 값들을 뽑아보면 2, 5, 7 번째 애들의 value 값 [2,5,7]를 가져올수 있습니다.
$data_{id} 형태로 가변 변수를 사용 하면 해당 값의 데이터 값들만 찾을 수 있습니다.


요약 하면...
체크박스는 체크된것만 가져옵니다.
데이터 값은 전부 전송 됩니다.
체크박스와 데이터는 매치가 되어서 전송 되지 않습니다.
요 3가지만 인지 하시면 금방 푸실거라 생각 됩니다.

가변이 싫으면 그냥 배열 data[] 로 해서 key 값만 가져오셔도 됩니다.
[전 가변을 사랑 하는 사람이라서... 가변처리 하면 스크립트에서도 처리 하기 편하고 말이죠.]
letsgolee / 2015/07/31 18:00:48 / 추천 0
$chks = $this->input->post('chk');
$idxes = $this->input->post('idx');
$names = $this->input->post('name');

 for ($i=0; count($chks); $i++) 
{
 $no = $chks[$i]; // 체크박스 번호
  $idx = $idxes[$i];
 $name = $names[$i];
echo "$i ====$no[$i]=======   $idx[$i] ------$name[$i]";
 }

중요한 거는 name="name[]"식으로 된다면 php에서는 $this->input->('name')은 array가 된다는 점.
rhe / 2015/08/01 10:23:28 / 추천 0
답변감사합니다
kaido님과 letsgolee님의 말씀이 힌트가 되었습니다.
1.
체크박스는 체크된것만 가져옵니다.
데이터 값은 전부 전송 됩니다.
체크박스와 데이터는 매치가 되어서 전송 되지 않습니다.
2.

중요한 거는 name="name[]"식으로 된다면 php에서는 $this->input->('name')은 array가 된다는 점.

그래서 폼 검증을 하는 점을 고려하여 데이터를 포문으로 배열을 돌리고 이프문으로 데이터 비교를 하였습니다
 
rhe / 2015/08/01 10:27:08 / 추천 0

$cnt = $this->input->post('cnt'); // 총 리스트 갯수 - 데이터는 총 갯수로 넘어온다.
for ($i=0; $i<$cnt; $i++) 
 {
 $idx = $this->input->post('idx');
 $name = $this->input->post('name');

for($k=0; $k < count($this->input->post('chk')); $k++)
{
$no = $this->input->post('chk'); // 체크박스 번호
$chk_no = $no[$k] - 1;
if($i == $chk_no){
echo "$chk_no =======$idx[$i]";
 }
}

}

맨 위의 소스를 보시면 체크박스는 값이 1부터 시작이고 데이터 배열은 0부터 시작이라 $chk_no = $no[$k] - 1; 해서 비교했습니다.
$k= $k+1; 이부분을 $i--; 이부분 근처에 두면 체크박스도 0부터 시작이라 $chk_no = $no[$k]; 이렇게 해도 됩니다.