CakePHP 1.2 で複数チェックボックス(その2)
ビューに関しては動作を確認できた。
モデルについて確認する。
コントローラで受け取ったチェックボックスのデータは、配列になっているので、
モデルでは、ちょっと工夫が必要。
以下の機能を実装する。
- DBに保存する際には、カンマ区切りで保存する事にする。
- Model::beforeSave() を実装する。
- 逆に取り出す際には、カンマ区切りを配列に戻す事にする。
- Model::afterFind() を実装する。
以下のようなプログラムを組んでみた。
このままだと Model::save() のあとのデータの扱いには注意が必要なので、
カンマ区切りと配列は別の項目にする方がいいのかもしれない。
<?php class User extends AppModel { var $name = "User"; var $checkboxs = array("hobby"); function beforeSave() { foreach ($this->checkboxs as $field) { if (!array_key_exists($field, $this->data[$this->name])) { continue; } $result = ""; foreach ($this->data[$this->name][$field] as $key => $value) { if ($value != 1) continue; if ($result == "") { $result = $key; } else { $result .= "," . $key; } } $this->data[$this->name][$field] = $result; } return true; } function afterFind($results, $primary = false) { for ($i = 0; $i < count($results); $i++) { foreach ($this->checkboxs as $field) { if (!array_key_exists($field, $results[$i][$this->name])) { continue; } $a = split(',', $results[$i][$this->name][$field]); $results[$i][$this->name][$field] = array(); foreach ($a as $key) { if (empty($key)) continue; $results[$i][$this->name][$field][$key] = 1; } } } return $results; } }