生活の跡

個人的な備忘録

FuelPHPでフォームの共通項目をモジュールで作成する

概要

FuelPHPで似たようなフォームを作っていたので、共通の項目をモジュール化しました。

次のようなケースを想定しています。 * データの新規作成と更新で、一部の項目を分けたい(設定するバリデーションなど) * submit の表示内容を「新規作成」と「更新」で分けたい

イメージを示します。共通フィールド1、共通フィールドは同じですが、先頭のフィールドとボタンを区別しています。

  • 新規作成のフォーム

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

  • 更新のフォーム

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

環境

FuelPHP 1.8.2

方法

Fieldsetインスタンスに共通項目を追加する際に、別途用意したモジュールを呼び出します。

コントローラ

Fieldsetインスタンスを作成しておき、共通項目を追加する際にモジュールを呼び出します(※1)。execute の引数にFieldsetインスタンスを渡します。

APPPATH/classes/controller/test.php

<?php

class Controller_Test extends Controller
{
  public function action_index()
  {
    $form = Fieldset::forge();
    
    //ここから呼ぶビューのみ必要な項目を追加
    $form->add('special', '新規作成で必要なフィールド', array('type'=>'text'));
    
    //(※1)他のビューと共通の項目を追加
    Request::forge('mymodule/parts/add_fields', false)->execute(array('form'=>$form));
    
    //submit
    $form->add('submit', '', array('type'=>'submit', 'value'=>'新規作成'));
    
    //ビューを作成
    $view = View::forge('sample');
    $view->set_global('myform', $form->build(), false);
    
    return $view;
  }
}

モジュール

コントローラから渡されたFieldSetに、共通項目を追加します。return は不要です(この仕組みの理解が不十分ですが、return $form してコントローラで受け取ると別の形式のオブジェクトになり、後続処理で項目を add できなくなります)。

APPPATH/modules/mymodule/classes/controller/parts.php

<?php

namespace Mymodule;

class Controller_Parts extends \Controller
{
  public function action_add_fields($form)
  {
    $form->add('common_field_1', '共通フィールド1', array('type'=>'text'));
    $form->add('common_field_2', '共通フィールド2', array('type'=>'text'));
  }
}

ビュー

コントローラから受け取ったフォームを表示するだけです。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Sample</title>
</head>
<body>
  <?php echo $myform; ?>  
</body>
</html>

感想

共通部分をモジュールで処理する事で、呼び出し元のコントローラがすっきりしました。よかった。
ただ、今回の例のように項目が少ないのであれば、わざわざモジュール化しなくてもいいと思います。