ページダイナミックレイアウト実装スキームについて(3)

2867 ワード

1.カスタムページの保存に関する説明
前(一)と(二)を通してカスタマイズページの基本概念とERモデルを紹介した.
バックグラウンドにユーザーが選択したレイアウト、モジュールを記録するのは非常に簡単だと信じています.例えば、jQueryスクリプトを使用してユーザーの毎回の操作を傍受し、ユーザーが追加したレイアウト、モジュールをバックグラウンドテーブルに挿入すればいいです.重要なシーケンス番号、および各レイアウトとモジュールに対応するhtmlテンプレートファイルを記録すればいいです.
 
2.ユーザー定義ページのロードについて
前述したように、各レイアウト、モジュールはhtmlファイルに対応していますが、htmlファイルはダイナミックページを出力するのに適していません.
ここではhtmlファイルの代わりにFreeMarkerのftlファイルを使用します.FreeMarkerのコンセプトは
テンプレート+データ=出力
前に述べたhtmlファイルは実はテンプレートで、ftlファイルを使って代わって、更にダイナミックなページを出力するのに適しています
バックグラウンドに保存されているレイアウト、モジュール情報はデータなので、[テンプレート]+[データ]はページ全体を出力できます.
 
次に、FreeMarkerと組み合わせてユーザー定義ページをロードする方法について説明します.
(1)FreeMarkerの<#include/>タグの使用
includeラベルの強みは、「動的にテンプレートファイルを導入する」(ダイナミックなテンプレートファイルを導入しないことに注意)ことです.
ダイナミックな導入ファイルとは、ユーザーのレイアウトとテンプレートを保存するときに、バックグラウンドにこのように情報が記録されます.
 
たとえば、ユーザーは1ページに4つのレイアウトを追加しました.1つの通欄、2つの左欄、1つの右欄です.
ページID
レイアウトID
レイアウト開始テンプレート
レイアウト終了テンプレート
レイアウト順序
100001
100001
left_begin.ftl
left_right.ftl
1
100001
100002
full_begin.ftl
full_right.ftl
2
100001
100003
left_begin.ftl
left_right.ftl
3
100001
100004
right_begin.ftl
right_right.ftl
4
 
 
例えば、左の欄レイアウトに2つのモジュールを追加しました.1つの公告情報、1つのマルチキャスト広告です.
レイアウトID
モジュールID
モジュール対応テンプレート
モジュール番号
100001
100001
info.ftl
1
100001
100002
adv.ftl
2
 
ページIDによってレイアウトリストlayoutListと各レイアウトに含まれるモジュールリストmoduleListを問い合わせることができます.
FreeMarkerのincludeを使用して、pageに対応するftlテンプレートページにこのように書くことができます.
<#list layoutList as layout>

   <#include layout.       />

<#/list>

 
これにより、すべてのレイアウトが動的に導入され、各レイアウトに対応するftlテンプレートページにこのように書くことができます.
FreeMarkerの強みは、includeで導入されたサブページでは、親ページの変数を使用することができ、このようなlayoutよりも
<#--    layout          -->
<#list layout.moduleList as module>

   <#include module.        />

</#list>

<#--                 -->
<#include layout.       />

このようにして、ユーザーがカスタマイズしたページをロードすることができ、処理が便利で、開発者があまり判断する必要はありません.
しかし、この場合、レイアウトやモジュールの「長さ」をロードするだけで、各モジュールに対応する業務内容はまだ出ていません!!!
例えば、公告情報モジュールでは、ユーザーが2つ追加しましたが、この2つのモジュールに対応するftlテンプレートファイルは同じ「1つ」に違いありません.
「1つの」テンプレートファイルである以上、1つのモジュールの内容を出力するのに自然に適しているだけで、「同じモジュール」を複数追加した場合、出力しにくくなります!!!
 
この場合、データとテンプレートをバインドしたくない場合は、ページのロードが完了した後、ajaxを使用して、各モジュールに対応するビジネスコンテンツを要求します.
もちろん、FreeMarkerのTemplateModelインタフェースを実現することもできます.各モジュールに対して、モジュールIDを入力します.モジュールIDに基づいて対応するビジネス内容を検索すればいいです.