忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/03/19 15:33 |
CakePHP-07:CakePHPで検索フォーム

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
<?php
    
    /*
        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
<?php
    //フォームオプション
        $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
<?php
    
    /*
        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


2009/12/04 22:32 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<ショートカットメニュー:Symfony | HOME | ゲームレビュー:CHAOS;HEAD NOAH>>
忍者ブログ[PR]