目的
次のような商品テーブルと種別コードマスタを考えます。
・商品テーブル(products)
・種別コードマスタ(categories)
FuelPHPで商品テーブルの編集を想定した画面を作り、コードに紐づくマスタの category をプルダウンメニューで表示することを目指します。完成イメージは次の通りです。
ひとまず表示するところまでにしたので、データ編集画面なのにsubmitさせていません。また、取得するデータのidはURIの末尾に直打ちしてコントローラの引数に渡しています。
環境
FuelPHP 1.8.2
前提知識
- FuelPHPでのMVCの作り方
- データベースの基礎(2つのテーブルの紐付け)
ソースコード
コントローラ
処理の流れは次の通りです。
1. URIから渡されたidで、該当の商品レコードを抽出する
2. 種別コードのペアをマスタから取得する
3. type=”select”の項目をもつフォームを作成する
4. フォームの初期値に商品レコードの値を設定する
5. ビューに渡して表示する
<?php class Controller_Sample extends Controller { public function action_edit($product_id = null) { // 1. DBから商品情報を取得 $product = Model_Product::select_product($product_id); // 2. DBからカテゴリのペアを取得 $category_pairs = Model_Product::select_category_pairs(); // 3. フォームを作成 $form = Fieldset::forge('sampleform'); $form->add('name', '商品名', array('type'=>'text')); $form->add('category_code', 'カテゴリ', array('type'=>'select', 'options'=>$category_pairs)); // 4. DBから商品情報をフォームの値に設定 $form->populate($product); // 5. ビューを作成 $view = View::forge('sample'); $view->set_global('sampleform', $form->build(''), false); return $view; } }
ポイントは手順3の部分です。Fieldsetインスタンスに対する addメソッドの第3引数に指定する array()の要素に、'options'=>$category_pairs
を記載しています。$category_pairs は連想配列を指定すれば良いので、今回のマスタの例ではarray('001'=>'野菜', '002'=>'果物')
と直接指定しても同じ結果が得られます。
モデル
商品レコードと種別コードを取得する処理を記述します。
<?php class Model_Product extends Model { //商品情報を取得 public static function select_product($id) { //1レコードだけ取得するので、先頭の要素[0]だけ取得 return DB::select()->from('products')->where('id', $id)->execute()->as_array()[0]; } //セレクトボックス用のカテゴリを取得 public static function select_category_pairs() { //セレクトボックスにidは表示しないので、(code, category)のペアの形式で取得 return DB::select()->from('categories')->execute()->as_array('code', 'category'); } }
ビュー
コントローラから渡されたフォーム(sampleform)を表示するだけです。
<!DOCTYPE html> <htmllang="ja"> <head> <metacharset="UTF-8"> <title>Sample</title> </head> <body> <?php echo $sampleform; ?> </body> </html>
おわりに
フォームの項目を個別に作るのであれば、Formクラスのselectメソッドが使えるようです。
Form – クラス – FuelPHP ドキュメント
また、FieldSet にセレクトボックスを一つずつ加えるなら、Fieldsetクラスの set_optionsメソッドが使えます。
Fieldset_Field – クラス – FuelPHP ドキュメント
今回は、FieldSetインスタンスに addしつつ、コードマスタの組み合わせを連想配列で一気に渡したかったので、別の方法を試してみました。