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系でも全く同じコードで実現可能です。
関連記事
-
-
バリデーション前後に処理を追加できる「beforeValidate」「afterValidate」
CakePHPでは、「beforeValidate」「afterValidate」というバリデーション処理の前後で追加の処理を実装できるコールバック関数が用意されています。 beforeVali
-
-
日付・時間のバリデーション
日付や時刻に関するバリデーションは以下のルールがビルトインされています。 date 日付 time 時刻 datetime 日時 (m:「月」を数字表記 / M:「月」を英語表記)
-
-
Formヘルパーのinputタグのdiv/labelなどの設定
Formヘルパーのinputではデフォルトでは以下のようにdivで囲われて、labelが付与されて出力されます。 CSSのフレームワークなどであらかじめ決まったスタイルがある場合に便利に作られていま
-
-
Markdown Plugin
「Markdown CakePHP Plugin」は、MarkDown書式をレンダリングしてくれるビューヘルパーです。MarkDownについて勉強しているうちに出会ったので試し打ちです。 ダウンロー
-
-
Js/Cssファイルの読み込みや出力する方法
CakePHPのHTMLヘルパーにはjsファイルやcssファイルを読み込むためのメソッドが用意されています。ファイルを読み込むのに加えて、出力先を複数指定できるようになっています。 また、インライン
-
-
コントローラ内でバリデーション処理を呼び出す
CakePHPでは、saveメソッドの際にバリデーション処理も自動で行われますが、save処理と切り離してバリデーションを行うこともできます。このときは、save時と若干異なる処理体系になります。
-
-
バリデーションエラーメッセージの取得
CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.
-
-
ユーザ登録(仮登録・メール・本登録)
以前1.3版で投稿した「ユーザ登録」処理の2.x版を作成しました。フローは同じで以下のようにします。 1. メールアドレス・パスワードでユーザ登録 2. この時点では仮登録として、本登録用のU
-
-
パス定数と変更方法やURLの取得
CakePHPは基本的にはディレクトリそのまま配置することで構築が可能ではありますが、設定パスを変更することでセキュリティに考慮した構成にすることや運用性をもたせたものにすることが可能になります。
-
-
CSS/JSをひとまとめにして軽量化するプラグイン「Minify plugin for CakePHP」
「Minify plugin for CakePHP」は、インクルードするCSSもしくはJSファイルをひとまとめにしてキャッシュ化してくれるプラグインです。 導入 ダウンロード・解凍し
Comment
[…] http://kwski.net/cakephp-2-x/1088/ […]
[...] 参考サイトhttp://kwski.net/cakephp-2-x/1088/ [...]