CakePHPでアプリケーションの設定を編集するページを作りたい
「CakePHPでアプリケーションの設定をデータベースに保存する」で書いた方法でアプリケーションの設定を編集するページを作っています。
CakePHPの基本通りの作り方で作っていくと、一つのページでは一つのレコードしか更新できません。一つのページで複数のレコードを更新するためにはどうするのが良いか考えています。
今、設定を保存するためのconfigsテーブルは次のような感じで作っています。
CREATE TABLE `configs` (
`name` varchar(255) NOT NULL,
`value` varchar(255),
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `configs` (`name`, `value`) VALUES
('site_name', 'サイトの名前'),
('site_desc', 'サイトの説明');
基本通りの作り方で作ると、site_nameを編集するページ、site_descを編集するページと別々に作ることになりますが、一応、今はモデルクラスのgenerateList()を使って、一ページに全ての設定の編集フォームを表示する部分まではできています。
- /app/controllers/configs_controller.php
class ConfigsController extends AppController { var $name = 'Configs'; 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)) { // 考え中 } $this->set('data', $data); } }
- /app/views/config/admin_edit.thtml
<!-- h関数はENT_QUOTESと文字エンコーディングを自動的に指定するように修正しています。 --> <form action="<?php echo h($html->url('/' . CAKE_ADMIN . '/configs/edit/')); ?>" method="post" id="ConfigEdit"> <fieldset> <legend>アプリケーションの設定</legend> <dl class="field"> <dt><label for="ConfigSiteName">サイトの名前</label></dt> <dd><?php echo $html->input('Config/site_name', array('value' => $data['Config']['site_name'])); ?></dd> <dt><label for="ConfigSiteDesc">サイトの説明</label></dt> <dd><?php echo $html->input('Config/site_desc', array('value' => $data['Config']['site_desc'])); ?></dd> </dl> <ul class="action"> <li><?php echo $html->submit('保存'); ?></li> </ul> </fieldset> </form>
$html->input()の第一引数を'0/Config/value'
などとしてみたり、$html->input(null, array('name' => "data[0]['Config']['value']", 'value' => $data['Config']['site_name']));
などともしてみたものの、HTMLヘルパーを使う場合にはそういう書き方はできないようです。HTMLヘルパーを使わないにしても、配列のキーを数字にしてしまうとわかりにくいので、ビューはこのままでいくことにします。
モデルクラスのgenerateList()の逆バージョンがあれば良いのですが、ないみたいなのでその処理をするメソッドを追加してみようかと思います。あとは、ループでレコード分のデータをsave()するか、自分でSQL文を組み立ててクエリを実行すれば良さそうな気がします。
トラックバック (0)
この記事へのトラックバックはまだありません。
コメント (0)
この記事へのコメントはまだありません。