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>
<htmllang="ja">
<head>
 <metacharset="UTF-8">
 <title>Sample</title>
</head>
<body>
<?php echo $myform; ?>
</body>
</html>

感想

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

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