メニュー

ドキュメント

はじめに

 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 します。


自動で読み込まれる設定ファイル

  1. config/environment.inc.php (必須)
    ディスパッチページ( public/d.php )の先頭で読み込まれます。
  2. vendor/plugins/smarty/config/environment.inc.php (必須)
    ディスパッチページ( public/d.php )の先頭で environment.inc.php に続いて読み込まれます。
  3. app/modules/モジュール名/モジュール名.inc.php
    module コマンドで生成されます。 コントローラとアクションがインスタンス化される直前に読み込まれます。
  4. 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;
    }
}
?>
%
作成したフィルタの適用については、「アクションにフィルタを適用する」を参照下さい。