生活の跡

個人的な備忘録

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>
<html lang="ja">
<head>
  <meta charset="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しつつ、コードマスタの組み合わせを連想配列で一気に渡したかったので、別の方法を試してみました。