モデルを使っていない方法です。
コントローラ
Controller/SamplesController.php
App::uses('AppController', 'Controller'); class SamplesController extends AppController { $rets=array( 0=>array('pid'=>100,'title'=>'a'), 1=>array('pid'=>200,'title'=>'b'), 2=>array('pid'=>300,'title'=>'c'), 3=>array('pid'=>400,'title'=>'d'), 4=>array('pid'=>500,'title'=>'e'), ); $this->set('rets',$rets); $this->modelClass = null; }
解説
- フォームの表示データを$retsに入れてコントローラから渡しています。
- $this->modelClass = null;を設定することで、モデルを読み込まないようにしている。
ビュー
View/samples/index.ctp
<div> <h3>Samples</h3> <table> <thead> <tr> <th>ckeck</th> <th>pid</th> <th>title</th> </tr> </thead> <tbody> <?php echo $this->Form->create(null, array('type'=>'post','action'=>'.')); ?> <?php foreach ($rets as $ret): ?> <tr> <td><?php echo $this->Form->checkbox('pid.',array('value'=>$ret['pid'],'hiddenField' => false,'checked'=> @in_array($ret['pid'], $this->request->data['Sample']['pid']))); ?></td> <td><?= h($ret['pid']) ?></td> <td><?= h($ret['title']) ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php echo $this->Form->end("送信"); ?>
解説
- $this->Form->create()の第一引数は、モデルを使わないのでnullに。
- $this->Form->checkbox()の第一引数の名前にピリオドをつけることによって、nameの最後に[]がついて、data[Sample][pid][]のような配列になる。
これを、’pid[]’と入れると、data[Sample][pid[]]のようになり、正常になっておかしくなる。 - $this->Form->checkbox()の第二引数の配列に’value’で値を設定できる。
- $this->Form->checkbox()の第二引数の配列にhiddenFieldをfalseに設定することで、 余分なhidden フィールドが生成されるのを防ぐ。
- $this->Form->checkbox()の第二引数の配列のcheckedは、フォーム送信後の選択状態の表示。結果は配列になり、checkboxの標準処理ではチェックできないため、in_arrayで値が選択済みかをチェック。初期状態ではrequest->dataがセットされなくてNoticeが出るので@で警告抑制。
または$this->Form->checkboxの部分を$this->Form->inputにすることもできる。
echo $this->Form->input('pid.', array( 'type'=>'checkbox', 'value'=>$ret['pid'], 'checked'=> @in_array($ret['pid'], $this->request->data['Sample']['pid']) ) );
ネオビットさんを参考にさせていただきました。
http://www.neobit.jp/archives/436