ページ プロデューサの連鎖
HTTPProd.OnHTMLTag イベント ハンドラから返される置換用テキストは、HTTP 応答メッセージで使用する最終的な HTML シーケンスである必要はありません。複数のページ プロデューサを使用し、1 つのページ プロデューサの出力を次のページ プロデューサの入力にすることができます。
複数のページ プロデューサを連鎖させる最も簡単な方法は、各ページ プロデューサを別々のアクション項目と関連付ける方法です。その際、すべてのアクション項目の PathInfo と MethodType は同じにします。最初のアクション項目では、自身のコンテンツ プロデューサから Web 応答メッセージのコンテンツを設定しますが、OnAction イベント ハンドラではメッセージが処理済みと見なされないように(Handled パラメータを False に)します。その後のアクション項目では、それぞれに関連付けられたプロデューサの ContentFromString メソッドを使用して、Web 応答メッセージを操作します。2 番目以降のアクション項目では、次のような OnAction イベント ハンドラを使用します。
procedure WebModule1.Action2Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := PageProducer2.ContentFromString(Response.Content); end;
void __fastcall WebModule1::Action2Action(TObject *Sender, TWebRequest *Request, TWebResponse *Response, bool &Handled) { Response->Content = PageProducer2->ContentFromString(Response->Content); }
たとえば、目的のページの年と月を指定した要求メッセージに対して、カレンダー ページを返すアプリケーションがあるとします。各カレンダー ページには、まず画像があり、その下に年と月の名前、その両側に前月と翌月の小さい画像、一番下に実際のカレンダーが含まれます。最終的に表示されるのは次のようなページです。
カレンダーの一般的な形式はテンプレート ファイルに格納されています。次のようなものです。
<HTML> <Head></HEAD> <BODY> <#MonthlyImage> <#TitleLine><#MainBody> </BODY> </HTML>
最初のページ プロデューサの OnHTMLTag イベント ハンドラは、要求メッセージから月と年を探します。その後、その情報とテンプレート ファイルを使用して、次の処理を行います。
- <#MonthlyImage> を <#Image Month=January Year=2000> に置換する
- <#TitleLine> を <#Calendar Month=December Year=1999 Size=Small> January 2000 <#Calendar Month=February Year=2000 Size=Small> に置換する
- <#MainBody> を <#Calendar Month=January Year=2000 Size=Large> に置換する
次のページ プロデューサの OnHTMLTag イベント ハンドラでは、最初のページ プロデューサが作成したコンテンツを使用し、<#Image Month=January Year=2000> タグを適切な HTML <IMG> タグに置換します。さらに別のページ プロデューサが、#Calendar タグを適切な HTML テーブルに置換します。