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系でも全く同じコードで実現可能です。

  • このエントリーをはてなブックマークに追加

関連記事

no image

radioボタンを実装

Radioボタンの実装は、セレクトボックスとほぼ同じです。 個人的にはラジオボタンをすすんで使用することは少ないのですが、2択くらいの選択肢であれば非常に便利ですよね。 今回は、その実装方法 デモ

バリデーションエラーメッセージの取得

CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.

テーブルからランダムにデータを取り出す(find)

CakePHPでテーブルから特定件数のレコードをランダムに取得するには以下のように指定するとできます。 $this->data = $this->Bulkdata->find( 'all',

独自のバリデーションルールを作成

CakePHPで組み込みバリデーションルールをつくる方法は、正規表現を定義する方法と独自メソッドを定義する方法の2つがあるようです。 参考 Custom Validation Rules 正規

Js/Cssファイルの読み込みや出力する方法

CakePHPのHTMLヘルパーにはjsファイルやcssファイルを読み込むためのメソッドが用意されています。ファイルを読み込むのに加えて、出力先を複数指定できるようになっています。 また、インライン

Jsヘルパーを使用してAjax更新

更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。デモ head

CSS/JSをひとまとめにして軽量化するプラグイン「Minify plugin for CakePHP」

「Minify plugin for CakePHP」は、インクルードするCSSもしくはJSファイルをひとまとめにしてキャッシュ化してくれるプラグインです。 導入 ダウンロード・解凍し

hasOne アソシエーション

hasOneアソシエーションはテーブル間で1つのレコードに対して他のテーブルに紐付くレコードが1つの場合にjoinする場合に使用します。 CakePHPのドキュメントにならってUserモデルとP

ログインに追加の条件を付与する「scope」

ユーザ登録では、仮登録処理(status=1)から送付したメール内のリンクをクリックしてもらい本登録(status=0)を行ってもらう実装をしました。仮登録の状態ではログインできないように実装するには

アップロードファイルのバリデーションルール

CakePHP 2.2や2.3になってファイルアップロードに対するルールがコアバリデーションに追加されているようで、まとめてみました。 コアバリデーション 関連しそうなルールは以下の4つの

Comment

selectボックスを実装 | Web memo へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

    PAGE TOP ↑