FuelPHPのフォーム項目に、DBのコードマスタを参照したプルダウンメニューを付与する

目的

次のような商品テーブルと種別コードマスタを考えます。

・商品テーブル(products)

f:id:ishii-akihiro:20191024141604p:plain

・種別コードマスタ(categories)

f:id:ishii-akihiro:20191024141732p:plain

FuelPHPで商品テーブルの編集を想定した画面を作り、コードに紐づくマスタの category をプルダウンメニューで表示することを目指します。完成イメージは次の通りです。

f:id:ishii-akihiro:20191024180939g:plain

ひとまず表示するところまでにしたので、データ編集画面なのに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しつつ、コードマスタの組み合わせを連想配列で一気に渡したかったので、別の方法を試してみました。

タイトルとURLをコピーしました