CakePHPのFormHelper入門をさくっと+複数チェックボックスとかdiv消したり
今回検索機能の実装時に初めてFormHelperを使いました。しかし元々できることを別の方法でやるために勉強するのは辛いですね。ちょっとした詰まりで悲しい気持ちになるので、同様の境遇の人の参考になればと思います。なお、細かいことはCakePHP1.3準拠です。
内容
- FormHelperの意義
- FormHelperの基本
- Tips
- 複数チェックボックスの作成
- 余分なdivタグやhiddenフィールドを消す
FormHelperの意義
FormHelperはPHPのコードでフォームを自動で生成してくれるものです。フォームを非常にCakePHPっぽく扱うことができるのですが、下手すると記述量が逆に増えたりもします。トータルで見るとメリットの方が多いと感じましたが、Cakeと一度限りの付き合いなら使わないという選択肢もありかと。
メリット
デメリット
- ・viewにPHPコードが混ざる
- viewはデザイナーさんがという場合はわかりにくくなるかもしれません
- ・デフォルトで変なコードが多々付加される
- フォームが勝手にdivで囲まれてたりして、消すためには一々引数で指定する必要があります。結果必要な記述量は多くなりがちです
FormHelperの基本
全部マニュアルに書いてありますが、さくっと書くために必要なことだけ抜粋して単純化しています。詳しくはマニュアルをご覧ください。
記述方法
だいたいこんな感じです。最初の引数でフォームのname属性、次の引数の連想配列でオプションとして属性やラベルなんかを設定します。オプションの種類はHTMLタグ内のプロパティ名と対応しているものが多く、フォームに添える文字列の設定等も可能です。良く使うメソッド
以下では、'Shop'という名前のモデルを使用する、ShopsControllerのSearchアクションにおける挙動を紹介します。
create-フォームの開始
end-フォームの終了
閉じタグが出力されます。input(チェックボックス)
- //展開後
- <div class="input checkbox">
<input type="hidden" name="data[Shop][hoge]" id="ShopHoge_" value="0" />
<input type="checkbox" name="data[Shop][hoge]" value="1" id="ShopHoge" />
<label for="ShopHoge">Hoge</label>
- </div>
input(セレクトボックス)
'type' => 'select' ,
'options' => array(1,2,3)
)); ?>
- //展開後
- <div class="input select">
<label for="ShopHoge">Hoge</label>
<select name="data[Shop][hoge]" id="ShopHoge">
</select>
- </div>
input(テキストボックス)
- //展開後
- <div class="input text">
<label for="ShopHoge">Hoge</label>
- <input name="data[Shop][hoge]" type="text" id="ShopHoge" />
- </div>
submit-入力内容の送信
- //展開後
- <div class="submit">
<input type="Submit" value="Submit" />
- </div>
入力データの取得
Controller内で
$this->data;
例えば、以下のように記述すれば、送信した際に取得したデータをviewで確認することができます。
$this->set( 'data' , $this->data );
//view search.ctp
debug($data);
Tips
余分なdivタグやhiddenフィールドを消す
デフォルトで出力されるコードたち。かなり余計なお世話です。オプション内でFALSEを記述することで消せます。個別に消すことも、まとめて消すこともできます。
- 個別に消す
- ・divタグ 'div' => FALSE
- ・hiddenフィールド 'hiddenField' => FALSE
- ・labelタグ 'label' => FALSE
- まとめて消す
- ・create内 ’inputDefaults’ => array(‘label’ => false,’div’ => false)
一々指定すると記述量が増えますので、メソッドを直接書き換えて、デフォルトをFALSEにすることも可能です。下記では、coreの中のform.phpをapp内にコピー→inputメソッド内のデフォルト値を書き換えとやっています。が、inputDefaults指定で十分かな?
これで何も指定しなくても、inputメソッドにはdivがつかなくなりました。複数チェックボックスの作成
inputメソッドのオプションで'type' => 'select'、'multiple' => 'checkbox'と指定します。
- echo $this->Form->input('新宿' , array(
- 'type' => 'select' ,
- 'multiple' => 'checkbox',
- 'options' => array(1,2,3,4,)
));?>
//展開後
<label for="ShopHoge">Hoge</label>
<input type="hidden" name="data[Shop][hoge]" value="" id="ShopHoge" />
<div class="checkbox"><input type="checkbox" name="data[Shop][hoge]" value="0" id="ShopHoge0" /><label for="ShopHoge0">1</label></div>
<div class="checkbox"><input type="checkbox" name="data[Shop][hoge]" value="1" id="ShopHoge1" /><label for="ShopHoge1">2</label></div>
<div class="checkbox"><input type="checkbox" name="data[Shop][hoge]" value="2" id="ShopHoge2" /><label for="ShopHoge2">3</label></div>
<div class="checkbox"><input type="checkbox" name="data[Shop][hoge]" value="3" id="ShopHoge3" /><label for="ShopHoge3">4</label></div>
ん〜2.0ではこの部分に変更があるのか気になります。