Formヘルパーというものがあるので検索フォームを簡単に作成できます。
cake_sample/formに作成してみます。
formアクションはとりあえず何もしない。
app/controllers/cake_sample_controller.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/*
CakeSampleコントローラ
*/
class CakeSampleController extends AppController{
//自分の名前
var $name = 'CakeSample';
//CakeSample/form
public function form() {
//入れる
$this->set('cake_sample', $this->paginate('CakeSample'));
}
}
|
ビューは$formを適当に呼び出すだけで簡単に入力欄ができあがります。
/app/views/cake_sample/form.ctp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//フォームオプション
$options=array();
$options['action']='form';
$options['type']='text';
//フォーム作成
$a=array();
$a[]=$form->create($options);
$a[]=$form->input('id',$options);
$a[]=$form->input('title',$options);
$a[]=$form->end('検索');
foreach($a as $val){
print($val);
}
//検索結果表示
if(isset($cake_sample)){
var_dump($cake_sample);
}
|
注意点として、初期状態だと新規登録を行うことに特化されたフォームになります。
フォームの名前としてCakeSampleモデル、即ちcake_samplesテーブルにあるカラム名を使うと、勝手にそこからデータ型を取得し、それに沿ったタグを出力します。
たとえばcake_samples.createdはdatetimeとして作成したので、年月日時分を選択させる<select>で表示されます。
主キーであるcake_samples.idなど、デフォルトではhiddenになってしまいます。
検索を行いたい場合こういった機能は邪魔なので、第二引数のオプションで出力形式を規定しなければなりません。
$options['type']で、形式を指定することができます。
また、$options['action']で、送信先のアクション名を指定しています。
デフォルトの送信先アクションは'add'になっているので、formアクションに戻ってくるようにします。
$formを使用すると各タグの名前が、
<input name="data[CakeSample][hoge]" />
といった変な値になってしまいます。
なんか気持ち悪いですが、コントローラ側で$this->dataで一括して受け取ることができます。
というわけで、その受け取った値を利用して検索する処理をformアクションに追加。
/app/controllers/cake_sample_controller.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/*
CakeSampleコントローラ
*/
class CakeSampleController extends AppController{
//自分の名前
var $name = 'CakeSample';
//CakeSample/form
public function form() {
//引数があれば検索条件に入れる
$params=array();
if($this->data['CakeSample']['id']){
$params['conditions']['CakeSample.id']
=$this->data['CakeSample']['id'];
}
if($this->data['CakeSample']['title']){
$params['conditions']['CakeSample.title LIKE']
= '%'.$this->data['CakeSample']['title'].'%';
}
//念のためlimit
$params['limit']=10;
//検索
$ret=$this->CakeSample->find('all',$params);
//表示
$this->set('cake_sample', $ret);
}
}
|
これでidをイコール、titleをLIKEで検索できるようになりました。
ただ、せっかく作ったはいいのですが検索条件作成のあたりがどうにもCakePHPの作法に則ってないように見えてしょうがないんだがまあいいか。
さて、検索フォームができたのはいいのですがここで不思議現象が。
画面遷移後に入力値が保存されています。
えっと……なんで?
見ての通りコントローラでもテンプレートでも何もしていません。
激しく気持ち悪い。
PR
トラックバック
トラックバックURL: