viewでもinitialize

2006/03/05 | mojavi2

mojaviではactionクラス内のinitializeメソッドで、必要な初期化処理をおこなうのが通常だ。しかしviewにも同様にinitializeメソッドがあり、action同様初期化処理が可能。
CustomSmaryRenderer.class.phpの初期化処理をこんなふうにやってます。

function initialize(&$controller, &$request, &$user)
{
 $myRenderer=& new CustomSmartyRenderer(&$controller, &$request, &$user);
 $request->setAttributeByRef(‘myRenderer’,$myRenderer);
 return true;
}

これでviewを継承したクラスを作っておいて、新たにviewを作成するときはコレを継承して使用しています。

Action Chain

2006/03/04 | mojavi2

「Action Chain」は複数のアクションの結果を組み合わせて表示させたりするときに使用する(他にも使い方があるかもしれない)。
基本的にactionからでもviewからでも呼び出せるが、actionから呼び出したほうが簡単っぽい(いろいろやったけど自前のライブラリの絡みのせいか、viewの中で上手く呼び出すことができなかった)。
使い方はこんな感じ。

$actChain=new ActionChain();
$actChain->setPreserve(true);
$actChain->register(‘myChain’,’callModule’,’callAction’,array());
$actChain->execute($controller, $request, $user);
$myChain=$actChain->fetchResult(‘myChain’);
$request->setAttribute(‘myChainBody’,$myChain);

setPreserve(true)はちょっとしたおまじない。
registerで「チェーンの名前」「呼び出すモジュール」「呼び出すアクション」「アクションに与える引数」により、Action Chainに登録。
executeで登録したアクションを実行。
fetchResultでアクションの実行結果を取得。

ただいろいろと工夫は必要です。

モジュール単位のフィルタ

2006/02/09 | mojavi2

GlobalFilterに登録しておくと全モジュールに対して共通した処理を施せるが、モジュール毎に共通処理を含むことができるmoduleFilterという機能もある。これについてもまともに解説してあるページはない。
ようやくわかりやすく解説してあるページを見つけることができ、理解できたのでここに掲載(参照元にトラックバック:感謝)。

□moduleFilterの設置場所:
各モジュールのディレクトリ直下には「actions」「views」「templates」などのディレクトリが存在するが、それらのディレクトリと同じ階層に記述したファイルを設置する。

□記述・設置方法:
ファイル名は「(モジュール名)FilterList.class.php」とし、記述方法はGlobalFilterと同様、FilterListを継承して記述する。
このファイルを設置するだけで、mojaviは自動的にファイルの有無を確認し、存在すれば自動的に取り込んで実行する、ということらしい。Filterの適用順序は以前に述べたとおり。

Filterの適用について

2006/02/08 | mojavi2

フィルターの雛形に続き、フィルター適用順序(というかmojaviの挙動)に関する比較的わかりやすい説明が先ほど同様の2chフレームワークスレにあった(以下引用)。


個々のフィルタには前処理・後処理という2段階の実行順序があって、登録した順に前処理が全て実行されてから、今度は逆順に後処理が実行される。

Actionの実行部分もフィルタの一種として扱われていて(ExecutionFilter)、全てのフィルタの登録後に登録されている。
Viewの実行(View::execute())はExecutionFilterの中で実行されている。

結果、登録順に1,2…の番号を付けた時に、
1. GlobalFilterのpre-filter1,pre-filter2…を実行
2. moduleFilterのpre-filter1,pre-filter2…を実行
3. ExecutionFilterを実行(認証や特権の判定、action処理)
4. Viewの実行
5. moduleFilterの…post-filter2,post-filter1を実行
6. GlobalFilterの…post-filter2,post-filter1を実行
という順番で処理されることになる。

mojaviのソースを読めばわかることだけど、この程度の情報がドキュメントとしてしっかり用意されているとうれしいんだけれど・・・。

Filter雛形

2006/02/08 | mojavi2

Filterの例が少なく困っていたけれど、最近はgoogleの検索で日本語サイトがぽつぽつと引っかかってくるようになった。以下はFilterクラスの雛形。引用元は2chのフレームワークスレ

<filter>.class.php
class <filter名> extends Filter{
 function execute(&$filterChain,&$controller,&$request,&$user){
  static $loaded;
  // ActionChainやAction::forwardを使った時にフィルタが複数回適用されるのを防ぐ
  if($loaded == NULL){
   $loaded = TRUE;
   //前処理フィルタ
   …
   //filter chain の次のフィルタを実行
   //pre-filterとpost-filterの分岐点
   $filterChain->execute($controller,$request,$user);
   //後処理フィルタ
   …
  }else{
   $filterChain->execute($controller,$request,$user);
  }
 }
}


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net