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