【続】initializeでfalseが返されたら

2006/04/09 | mojavi2

表題の件は前回の続編だが、予想通りでした。
mojavi-all-classes.phpのExecutionFilterクラスの中の以下の記述で

if ($action->initialize($controller, $request, $user))

else節を加えて「$controller->forward(ACTION,MODULE)」を書き足すことによって希望のモジュール/アクションに遷移させることができると判明。
ここでさらなる野望。
これまではデータベースへの接続をベースとなるアクションclassを作成し、そのinitialize関数の中でおこなってきたので、データベース接続が失敗したときのエラー表示を美しくしたかったのだけれど、少し欲求が増えた。ぜひともこれをFilterで実現したい。
つまりFilterでデータベースの初期化をおこない、初期化に失敗した場合に単にエラーメッセージを表示するだけでなく、カスタマイズされた画面中にエラーを表示させたい、ということ。
いろいろ調べたけれど今のところわからない。どうすれば実現できるのか、わかる人がいれば是非教えて欲しい。

Read the rest of this entry »

initializeでfalseが返されたら

2006/04/07 | mojavi2

mojaviでinitializeメソッドを使用して初期化することがよくある(例えばデータベースへの接続処理とか)。当然initializeに失敗した際のことも考えないといけないけれど、デフォルトではinitializeでfalseを返すと、画面には何も表示されない。当然エラーメッセージをechoした後falseを返したりするけれど、それでも所詮は味気ないメッセージが表示されるだけ。
やはりエラー画面でも多少デザインテイストを考えたいところ。これはmojavi-all-classes.phpで以下の部分を修正するとよさそうな感じ。

ExecutionFilterクラス内のexecute関数で、以下のように記述されている箇所に注目。
if ($action->initialize($controller, $request, $user))
{
 (中略・いろんな処理が書かれているところ)
}

ここで初期化処理をしているみたいなんだけど、if文のelseに相当するところがない。つまりtrueを返せば処理をするけどfalseを返すと「何にもしません」ということのように見える。きっとここでelse節を書き足せばいいはずだと思う。
まだ検証してないので確実なことはいえないけれど、あとで検証することにしようっと。

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の適用順序は以前に述べたとおり。


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