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 メソッドは、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 の環境設定は、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>
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;
}
}
?>
%
作成したフィルタの適用については、「アクションにフィルタを適用する」を参照下さい。
|