はじめに
S2Base.PHP5 には、Smarty をコントローラとするシンプルなフレームワークが含まれています。
Smarty と S2Base.PHP5 を組合わせる場合は、このフレームワークをご利用下さい。
ページ遷移
モジュールとアクション
withSmartyフレームワークでは、ディスパッチページ( public/d.php ) にモジュール名とアクション名をリクエストして ページ遷移を制御します。デフォルトでは、モジュールを指定するリクエストパラメータ名は「 mod 」、アクションを指定するリクエストパラメータ名は「 act 」です。 例えば、Default モジュールの hello アクションにアクセスする場合は、次のようになります。
http://localhost/s2base/d.php?mod=Default&act=hello上記の場合、Defaultモジュールの view/hello.tpl テンプレートを Smarty が処理して、その結果が表示されます。 Default モジュールに action/HelloAction.class.php が存在した場合は、Smarty がテンプレートを処理する前に HelloActionクラスの execute メソッドが実行されます。
リクエストパラメータ名やデフォルトモジュール名、アクション名等は、d.php にて設定できます。
% more public/d.php <?php ・・・ define('S2BASE_PHP5_REQUEST_MODULE_KEY','mod'); define('S2BASE_PHP5_REQUEST_ACTION_KEY','act'); define('S2BASE_PHP5_DEFAULT_MODULE_NAME','Default'); define('S2BASE_PHP5_DEFAULT_ACTION_NAME','index'); ・・・ ?>モジュールの作成やアクション名の決定については、module コマンド、action コマンドを参照下さい。、
テンプレートの指定
テンプレートファイルは、デフォルトではディスパッチページにリクエストされたアクション名.tpl になります。 例えばモジュール名が Default でアクション名が hello の場合は、テンプレートファイルは app/modules/Default/view/hello.tpl になります。
helloアクション用のアクションクラス HelloAction を用意した場合は、HelloAction::execute メソッドの戻り値としてテンプレートファイルを指定できます。<?php class HelloAction implements S2Base_Action { public function execute(S2Base_Request $request, S2Base_View $view){ return 'hello2.tpl'; <--- テンプレートは view/hello2.tpl になります。 } } ?>アクションクラスの execute メソッドの戻り値が null の場合は、デフォルトのテンプレートファイル( view/hello.tpl )が使用されます。
特殊なケースとして、アクションクラスの execute メソッドの戻り値に file: プレフィックスと redirect: プレフィックスを付加することができます。
アクションのリダイレクト
アクションクラスの execute メソッドの戻り値に redirect プレフィックスを指定して、別のアクションにリダイレクトできます。
[ redirect:モジュール名:アクション名 ] として、モジュール名とアクション名を指定します。
<?php class HelloAction implements S2Base_Action { public function execute(S2Base_Request $request, S2Base_View $view){ return 'redirect:Default:goodbye'; <--- [ redirect:モジュール名:アクション名 ] //return 'redirect:goodbye'; <--- モジュール名は省略できます。 } } ?>
レイアウトの指定
レイアウトの指定は S2BASE_PHP5_LAYOUT 定数で行います。vendor/plugins/smarty/config/environment.inc.php で定義します。
% more vendor/plugins/smarty/config/environment.inc.php ・・・ /** * global lyaout setting */ //define('S2BASE_PHP5_LAYOUT','file:' . S2BASE_PHP5_ROOT . '/app/commons/view/layout.tpl'); ↑ デフォルトではコメントアウトされています。 ・・・ %レイアウトファイル内でテンプレートファイルは $content_for_layout 変数で参照できます。app/commons/view/layout.tpl を参照下さい。
アクションクラスの execute メソッド
アクションクラスの execute メソッドは、Smarty がテンプレートを処理する前に実行されます。リクエストパラメータの処理や、サービスの呼び出し、結果のアサイン等の処理を記述します。execute メソッドの引数は 2 つです。
<?php class HelloAction implements S2Base_Action { public function execute(S2Base_Request $request, S2Base_View $view){ $id = $request->getParam('id'); $request->setParam('year','2006'); $view->assign('id','2006'); } } ?>
S2Base_Request $request
$_GET または $_POST のコピーを保持します。getParam メソッドでリクエストパラメータ名を指定してデータを取得できます。 setParam メソッドでデータ名を指定してデータを追加できます。
S2Base_View $view
Smarty オブジェクトです。リクエストの処理結果やサービス結果等をテンプレートに assign します。
自動で読み込まれる設定ファイル
- config/environment.inc.php (必須)
ディスパッチページ( public/d.php )の先頭で読み込まれます。 - vendor/plugins/smarty/config/environment.inc.php (必須)
ディスパッチページ( public/d.php )の先頭で environment.inc.php に続いて読み込まれます。 - app/modules/モジュール名/モジュール名.inc.php
module コマンドで生成されます。 コントローラとアクションがインスタンス化される直前に読み込まれます。 - app/modules/モジュール名/action/アクションクラス名.inc.php
action コマンドで生成されます。 コントローラとアクションがインスタンス化される直前に、モジュール名.inc.php に続いて読み込まれます。
Smarty の環境設定
Smarty の環境設定は、vendor/plugins/smarty/config/environment.inc.php で行います。
/** * Smarty config * S2Base_SmartyController::$config['property name'] = property value */ S2Base_SmartyController::$config['compile_dir'] = S2BASE_PHP5_VAR_DIR . '/smarty/template_c'; S2Base_SmartyController::$config['config_dir'] = S2BASE_PHP5_VAR_DIR . '/smarty/config'; S2Base_SmartyController::$config['cache_dir'] = S2BASE_PHP5_VAR_DIR . '/smarty/cache'; S2Base_SmartyController::$config['caching'] = 0;S2Base_SmartyController クラスの config プロパティに環境設定変数名とその値を設定します。
アクションからサービスを利用する
アクションクラスから service コマンドや goya コマンドで作成したサービスを利用する場合、アクションダイコンにてサービスダイコンを include し、アクションクラスでサービスクラス用のセッターメソッドを実装します。 HelloAction クラスから service コマンドで作成した足し算サーボスを利用する場合は次のようになります。
サービスダイコンの include
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <include path="%S2BASE_PHP5_ROOT%/app/modules/smarty/dicon/CulcService.dicon"/> <component name="hello" class="HelloAction"/> </components>
サービスクラス用のセッターメソッドを実装
<?php class HelloAction implements S2Base_Action { private $service; public function execute(S2Base_Request $request, S2Base_View $view){ $result = $this->service->add(2,3); <--- サービスの利用 $view->assign('result',$result); } public function setService(CulcService $service){ <--- サービス用のセッタメソッド $this->service = $service; } } ?>他のモジュールのサービスを利用する場合は、モジュール設定ファイル (モジュール名.inc.php) も読み込んで下さい。
アクションにフィルタを適用する
アクションに interceptor コマンドで作成したフィルタを適用する場合は、アクションダイコンで aspect 設定を行ます。 HelloAction クラスに TestBeforeFilter を適用する場合は次のようになります。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <component name="hello" class="HelloAction"> <aspect>testFilter</aspect> </component> <component name="testFilter" class="TestBeforeFilter"/> </components>
Validateフィルタを作成する
interceptor コマンドの validate タイプを指定して NumericValidator を作成します。 NumericValidator は、is_numeric関数を使用してリクエストパラメータ値が numeric かを確認します。 validate設定iniファイルの suffix 名は [ numeric ] とします。validate設定iniファイルは、セクション名にリクエストパラメータ名を使用し、リクエストパラメータ値が numeric でない場合の遷移先とメッセージを設定します。
% more app/modules/smarty/validate/アクション名.numeric.ini [id] page = "error.tpl" <--- 遷移先テンプレートファイル msg = "id must be numeric" <--- エラーメッセージ %interceptor コマンドで NumericValidator を作成します。
% phing Buildfile: /seasar.php/workspace/s2base.php5/build.xml project > prepare: [php] Evaluating PHP expression: require_once('config/environment.inc.php') [php] Evaluating PHP expression: require_once('lib/S2Base/S2Base.cmd.php') project > com: [ Command list ] 0 : [ EXIT ] 1 : action 2 : interceptor 3 : module 4 : command 5 : dao 6 : dicon 7 : entity 8 : goya 9 : service choice ? : 2 [ Module list ] 0 : [ EXIT ] 1 : Default 2 : smarty choice ? : 2 [ Type list ] 0 : [ EXIT ] 1 : default 2 : arround 3 : before 4 : after 5 : validate choice ? : 5 class name ? : NumericValidator [INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/smarty/interceptor/NumericValidator.class.php BUILD FINISHED Total time: 15.6232 seconds %NumericValidator を実装します。
% more app/modules/smarty/interceptor/NumericValidator.class.php <?php /** * available properties. * protected $invocation; <--- S2Container_MethodInvocation オブジェクト * protected $request; <--- S2Base_Request オブジェクト * protected $moduleName; <--- モジュール名 ( string ) * protected $actionName; <--- アクション名 ( string ) * protected $action; <--- アクションオブジェクト * protected $view; <--- S2Base_SmartyController オブジェクト * protected $rule; <--- validate設定iniファイルの parse_ini_file 関数の結果配列 * protected $controller; <--- S2Base_SmartyController オブジェクト ( $view と同じです ) */ class NumericValidator extends S2Base_AbstractValidateFilter { public function getSuffix(){ return "numeric"; <--- validate設定iniファイルの suffix 名 (アクション名.numeric.ini となります。) } public function validate(){ <--- validate 処理を実装します。 if($this->rule == null){ return; } $page = null; foreach($this->rule as $key => $val){ $paramVal = $this->request->getParam($key); if (!is_numeric($paramVal)){ $page = $val['page']; $this->controller->putError('numeric_validator',$val['msg'] . " [ $paramVal ]"); } ↑ } コントローラに登録したエラーメッセージは、テンプレートファイルでは {$errors} で参照できます。 $this->rule = null; <--- rule 配列は保持されるので初期化 return $page; } } ?> %作成したフィルタの適用については、「アクションにフィルタを適用する」を参照下さい。