概要
FuelPHPで似たようなフォームを作っていたので、共通の項目をモジュール化しました。
次のようなケースを想定しています。
* データの新規作成と更新で、一部の項目を分けたい(設定するバリデーションなど)
* submit の表示内容を「新規作成」と「更新」で分けたい
イメージを示します。共通フィールド1、共通フィールドは同じですが、先頭のフィールドとボタンを区別しています。
- 新規作成のフォーム
- 更新のフォーム
環境
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>
感想
共通部分をモジュールで処理する事で、呼び出し元のコントローラがすっきりしました。よかった。
ただ、今回の例のように項目が少ないのであれば、わざわざモジュール化しなくてもいいと思います。