S2JSFでWebParts その11
おまたせ。
紆余曲折あったけど、「insertをforEachで繰り返す」事は単純には出来ないので、
- insertタグに自前で属性 (m:items) を追加して、m:itemsが入力された場合は複数繰り返す
- m:srcの値(式言語)がCollectionだった場合には複数繰り返す
の、いずれかになるかと思う。
この結論が出るまで、ちょっと遠回りしたけど、勉強になりました。
insertタグに手を入れる量が増えてきたけど、まぁ、もうちょっと突っ走ります。
現実として、実プロジェクトで使うためには、既存ソースに出来るだけ手を入れないよう
落とし所を考える必要がありそうだけどね。
と言うわけで、早速、実現方法の模索。
修正箇所の見切りとして、InsertProcessor#getSrcを呼んでいる箇所を見る。
前者はS2StateManager#getLastModifiedFromFileから、
ファイルの最終更新日をチェックするために呼ばれている模様。
後者は純粋に、Processor#processとしてタグ解析時に呼ばれているようだ。
そうすると、
- InsertProcessor#getSrcではm:srcの文字列をそのまま返す
- 呼び出し側(ViewProcessor#addIncludes / InsertProcessor#process)で式言語の解釈をする
- 解釈した結果がCollectionなら、ループで処理する
こんな感じにできるかな。
、、、と思ったんだけど、ちょっと難点が。
何かっていうと、
ViewProcessor#addIncludesを辿ると、そもそもの呼び出し元は、LifecyleImpl#restoreViewになっているから、
InitActionが実行されるrenderフェーズよりも前に、ViewProcessor#addIncludesが呼ばれることになる(はず)。
例えば、insertタグにm:src="#{hogeList}"を記述したとして、
- InitAction実行
- InitAction内でhogeListに、表示したいページ一覧を設定する
- getSrc()が呼ばれる
- #{hogeList}を解釈して、ページ一覧を取得できる
という流れを期待するんだけど、
ViewProcessor#addIncludesについては、
- getSrc()が呼ばれる
- #{hogeList}を解釈しても、null。(もしくは前回設定した値など)
- InitAction実行
- InitAction内でm:srcに表示するページ一覧を設定
という順序になっちゃうわけ。期待する値が入らないのよね。
って、あれ? ビュー復元フェーズの役割って、むしろ、これで正しいんだっけ?
やばい、ちょっと調べないと (^^;
まぁ、イベントが処理できるかどうか、、、も含めて、実装しながら、調査してみよう。