実装覚え書き。
例題
以下のように、カンマ区切りのデータを格納するカラムを持ったテーブルがあったとする。
製品テーブル
- id/製品名/カテゴリ
- 1/掃除機/1,2,5
- 2/食器洗い機/1,2,3
- 3/テレビ/1,2
カテゴリテーブル
- id/製品名
- 1/家電
- 2/生活家電
- 3/キッチン用品・食器
- 4/インテリア・雑貨
- 5/掃除・洗濯
このカンマ区切りデータを一連のチェックボックスから入力させたい。
入力画面イメージ
1 2 3 4 5 6 |
カテゴリ [X] 家電 [X] 生活家電 [ ] キッチン用品・食器 [ ] インテリア・雑貨 [X] 掃除・洗濯 |
実装
やってみると思ったよりも簡単だった。
コントローラ
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 |
public function edit($id = null) { if (!$this->Product->exists($id)) { throw new NotFoundException('Invalid product'); } if ($this->request->is('post') || $this->request->is('put')) { if (!empty($this->request->data['Product']['categories'])) { // 保存前に配列をカンマ区切りへ変換 $this->request->data['Product']['categories'] = implode(',', $this->request->data['Product']['categories']); } if ($this->Product->save($this->request->data)) { // 保存完了 } else { // 保存失敗 } } else { $product = $this->Product->find(...); } $categories = ClassRegistry::init('Category')->find('all', array( 'order' => array( 'Category.id' => 'ASC' ), )); $this->set(compact('product','categories')); } |
ビュー
1 2 3 4 5 6 7 |
<?php echo $this->Form->input('categories' , array( 'type' => 'select' , 'multiple' => 'checkbox', 'options' => $categories, 'selected' => explode(',', $product['Product']['categories']), 'div' => false, )); ?> |