私達は既に非汎用なレンダーシーケンスを知っています。 Legacy のレンダーシーケンスがそうです。 Legacy のレンダリングプロセスは XOOPS2 と同じステップを持たなければならず、以下のようになっています。
(1) モジュールの実行前に、ブロックを描画する
(2) モジュールの実行後、モジュールを描画する
(3) モジュールの描画後、最終出力としてテーマを描画する
このようなレンダリングの手順を汎用的にしたものが、 XOOPS Cube コア 1.0 の汎用レンダーシーケンスです。
XOOPS Cube コア 1.0 のレンダーシーケンスは、すべてのビジネスロジックの後に実行されます。そして BASE が交換可能というコアのフィーチャーに対応するために、コアはブロックやモジュールなどの特定のコンテンツ単位を認識しないようになっています。
レンダーシーケンスにとって、テーマ、モジュール、ブロックといった単位は必要ではありません。重要なことは、レンダリングの順序と、後ろのレンダリングプロセスが前のレンダリング結果(もしくは他のレンダーターゲット)にアクセスできることです。たとえばテーマは、ブロックやモジュールの描画結果を合成しなければいけません。

Legacy の非汎用的なレンダーシーケンスでは、最後にテーマを描画するために、最後にロジックが実行されていました。しかし、汎用レンダーシーケンスでは、一番最初に CMS のタスクがテーマのレンダリングを行うリクエストを出しても、実際のレンダリングは最後行うことが可能になっています。
つまりビジネスロジックの実行順と、描画の実行順を変えることができるのです。

メカニズムをチェックしてみましょう。例のPDFドキュメントも一緒に読んでみてください。
汎用レンダーシーケンスは、同じく汎用のメインシーケンスであるタスクシステムと同時に使うことを前提としています。これは非汎用のメインシーケンスは、 Legacy のような非汎用のレンダーシーケンスを持っているからです。
XCube_Root のメインシーケンスは、各タスクからレンダーオペレーションを収集します。レンダーオペレーションには、使用するレンダーシステムの名前や、描画の順序を示すシーケンス ID が収められています。
レンダーオペレーションは順不同(out-order)に収集されます。たいていの場合、最初のタスクは CMS のタスクであり、テーマの描画リクエストがオーダーされる可能性があります。

そのまま何もしなければ、いくつかのモジュールやブロックは、テーマの描画の後に描画が行われることになります。そのような順序は奇妙です。
そこで、 XOOPS Cube コアは、正しい順序(in-order)で描画シーケンスが行えるように、収集したレンダーオペレーションをソートしています。

ソートによって、正しい順序になりました。ソート後のこの状態は、一種のコマンドキューになっています。コアの汎用レンダーシーケンスは、先頭からひとつずつオペレーションを取り出して描画を行います。汎用レンダーシーケンスを使用する場合は、レンダーシステムとレンダーターゲットの取り扱いはコアに任せることができます。
最後のテーマを描画し終えると、画面が完成していることになります。その様子は、 XCube_PHP4 minahito_sandbox ブランチのサンプルでチェックすることができます。
なお、このエントリは Diff between XC and XCL(X2): Render Sequence の別バージョンになります。 XOOPS2 のレンダリングとの違いについて知りたいなら、 Diff between XC and XCL(X2): Render Sequence も読んでみてください。
0 件のコメント:
コメントを投稿