端くれプログラマの備忘録 CakePHP [CakePHP] 一連のチェックボックスを使ってカンマ区切りデータを入力する

[CakePHP] 一連のチェックボックスを使ってカンマ区切りデータを入力する

実装覚え書き。

例題

以下のように、カンマ区切りのデータを格納するカラムを持ったテーブルがあったとする。

製品テーブル

  • id/製品名/カテゴリ
  • 1/掃除機/1,2,5
  • 2/食器洗い機/1,2,3
  • 3/テレビ/1,2

カテゴリテーブル

  • id/製品名
  • 1/家電
  • 2/生活家電
  • 3/キッチン用品・食器
  • 4/インテリア・雑貨
  • 5/掃除・洗濯

このカンマ区切りデータを一連のチェックボックスから入力させたい。

入力画面イメージ

カテゴリ
[X] 家電
[X] 生活家電
[ ] キッチン用品・食器
[ ] インテリア・雑貨
[X] 掃除・洗濯

実装

やってみると思ったよりも簡単だった。

コントローラ

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'));
}

ビュー

<?php echo $this->Form->input('categories' , array(
    'type' => 'select' ,
    'multiple' => 'checkbox',
    'options' => $categories,
    'selected' => explode(',', $product['Product']['categories']),
    'div' => false,
)); ?>