selectボックスを実装
今まで、selectボックスのgroupを作成するのにSet::Combineを使用していましたが、意外と簡単にできることに気付いてしまったので、ご紹介。(自分だけ知らなかったことに気付いた と言ったほうが近い。) デモ(データ配列なども)
モデルは、散々出尽くしているかもしれませんが、以下
CREATE TABLE IF NOT EXISTS `prefectures` ( `id` INT NOT NULL AUTO_INCREMENT, -- id `prefecture` VARCHAR(8) NOT NULL, -- 都道府県 `area` VARCHAR(8) NOT NULL, -- 地方 PRIMARY KEY (`id`) )
単一選択のselectボックス
一般的なセレクトボックス。中から1つを選ぶものです。
find('list')でfieldsに対して2項目設定します。1つ目がvalue、2つ目が実際に画面に表示される値が設定されます。規定値(初期値)を指定する場合は、単一の値でvalueを指定します。
// コントローラ
$this->set( 'select1', $this->Prefecture->find( 'list', array(
'fields' => array( 'id', 'prefecture')
)));
// ビュー
echo $this->Form->input( 'prefecture', array(
'type' => 'select',
'options' => $select1
// 'selected' => $selected // 規定値をvalueで指定
// 'div' => false // div親要素の有無(true/false)
// 'size' => 5 // 高さ設定(リストボックスとして表示)
// 'empty' => true // 空白を許可
));
複数選択できるselectボックス
'multiple'=> trueを指定することで、セレクトボックスの中から複数を選べるようにできます。
findの方法は1つ目と同じです。
// コントローラ
$this->set( 'select1', $this->Prefecture->find( 'list', array(
'fields' => array( 'id', 'prefecture')
)));
// ビュー
echo $this->Form->input( 'prefecture', array(
'type' => 'select',
'multiple'=> true,
'options' => $select1
// 'selected' => $selected // 規定値は、valueを配列にしたもの
// 'div' => false // div親要素の有無(true/false)
));
通常、データ内にカンマがない場合は、DBへ保存する際に配列からCSVデータに変換しています。
// ビューから受け取ったprefecture配列をカンマ区切りに変換
$this->request->data['Model']['prefecture'] =
implode( ',', $this->data['Model']['prefecture']);
ページ読み込み時に、保存されたデータを取得・設定するためにcsvデータから配列へ変換しています。($selected)
// 規定値をビューへ渡す $this->set( 'selected', explode( ',', $this->data['Model']['prefecture']));
selectボックスのオプションをグループ化
セレクトボックスの中身をグループ化できるものです。
find('list')の1,2つ目は同じで、fieldsに3つ指定すると、その3つ目の項目でグループ化してくれるようです。(1.3系でも同じです。)
// コントローラ
$this->set( 'select2', $this->Prefecture->find( 'list', array(
'fields' => array( 'id', 'prefecture', 'area')
)));
// ビュー
echo $this->Form->input( 'prefecture', array(
'type' => 'select',
'multiple'=> true, // 複数選択を可能にする場合
'options' => $select2
));
規定値の設定や保存時のやりとりは、上の2つと同じですので、単一/複数に従ってそれぞれ実装してください。
今回、2.xとして投稿しましたが、1.3系でも全く同じコードで実現可能です。
関連記事
-
-
アップロードファイルのバリデーションルール
CakePHP 2.2や2.3になってファイルアップロードに対するルールがコアバリデーションに追加されているようで、まとめてみました。 コアバリデーション 関連しそうなルールは以下の4つの
-
-
Jsヘルパーを使用してAjax更新
更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。デモ head
-
-
SQLクエリーをログに出力する
SQLのクエリーをデバッグするには、Debug Kitを使用すればできますが、デバッグログと一緒に出したいのでやり方を調査してみました。 別々のログやビューでみるのもいいですが、秒単位で実行される処
-
-
RSSフィードの取得
コンロトーラ public function getrssfeed() { try { $newsItems = $this->Rss->read( 'http://
-
-
入力文字列の長さ(文字数)をバリデーション
CakePHP 2には、コアバリデーションに文字列の長さを検証する関数が用意されています。 文字列長(コア)バリデーション minLength - 最小文字数以上であること maxLengt
-
-
recursive設定によるfind()性能改善
CakePHPでは、モデルにアソシエーションを設定している場合、recursive(=>joinする階層)はデフォルトで0に設定されています。「recursiveゼロ」の意味するところとは、「1跨ぎま
-
-
ハッシュ関数の選択とハッシュ化処理
CakePHPでは、ログイン時にはpasswordを自動的にハッシュ化して認証を行ってくれますが、そのパスワードを登録する際は、明示的にハッシュ化する必要があります。 ハッシュ関数の選択 ハッ
-
-
バリデーション前後に処理を追加できる「beforeValidate」「afterValidate」
CakePHPでは、「beforeValidate」「afterValidate」というバリデーション処理の前後で追加の処理を実装できるコールバック関数が用意されています。 beforeVali
-
-
(メール・URL・電話・郵便・IP) データ バリデーション
今回は、プロフィール情報に使用されるデータに絞ったバリデーションルールです。 バリデーションルール 以下の5つのバリデーションルールがコアに用意されています。 email メールアドレス
-
-
数値系バリデーション
CakePHP 2になっていくつか数値用バリデーションルールが追加されています。 数値用 (コア)バリデーション decimal - 十進数であること numeric - 数値であること



Comment
[…] http://kwski.net/cakephp-2-x/1088/ […]
[...] 参考サイトhttp://kwski.net/cakephp-2-x/1088/ [...]