CakePHPで一つの編集ページから複数のレコードを更新する

CakePHPでアプリケーションの設定を編集するページを作りたい」と「CakePHPでgenerateList()の結果からモデルデータ形式の配列に戻す」からの続きです。

フォームから送信された複数レコードのデータをモデルクラスで扱える配列に変換するところまでできていましたが、さらにコントローラに次のようなコードを書き加えて、複数のレコードを更新できるようにしてみました。

/app/controllers/configs_controller.php
    // データを更新するアクションメソッド
    function admin_edit() {
        // ビュー用にnameフィールドをキーにしたvalueフィールドの配列を作成
        $data['Config'] = $this->Config->generateList(null, 'Config.name', null, '{n}.Config.name', '{n}.Config.value');

        // データベースにデータがない場合はエラーぺージを表示
        if (!$data['Config']) {
            $this->cakeError('error404', array(array('message' => '404 Not Found')));
            exit;
        }

        // POSTされたデータがあれば更新処理
        if (!empty($this->data)) {
            // 保存するフィールドのホワイトリスト
            $whiteList = array(
                'Config' => array(
                    'name' => '',
                    'value' => ''
                )
            );

            // フォームからのデータ(generateList()と同じ形式)をモデルデータ形式の配列に変換
            $data = $this->Config->generateData($this->data['Config'], 'Config.name', 'Config.value');

            $is_valid = true;  // バリデーション結果の保存用

            // レコード分のデータを更新
            foreach ($data as $row) {
                // ホワイトリストを基にデータをフィルタリング
                // (CakePHPで外部からのデータ改竄を防止する)
                $row = $this->Config->filter($row, $whiteList);

                if ($this->Config->validates($row)) {
                    $this->Config->save($row, false);
                } else {
                    $is_valid = false;
                }
            }

            // 保存に成功した場合は管理ページを、失敗した場合は編集画面を表示
            if ($is_valid) {
                $this->flash('設定を保存しました。', '/' . CAKE_ADMIN . '/');
                return;
            } else {
                $this->flash('エラーが発生しました。', '/' . CAKE_ADMIN . '/configs/');
                return;
            }
        }

        $this->set('data', $data);
    }

バリデーションに失敗した場合の処理の仕方がかなり納得がいかない感じですが、自分しか使わないので簡単な方法を選んでおきます。

コメント (0)

この記事へのコメントはまだありません。

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/25/trackback/
この記事のURI
http://dxd8.com/archives/25/