複数テンプレートの操作
このドキュメントではこれまで、単一テンプレートのアプリケーションについてのみ説明してきましたが、Zen Mojo アプリケーションでは、複数のテンプレート・クラスを使用できます。これにより、アプリケーション・コードをより簡単に管理できる単位に分割することが可能です。
Zen Mojo では、明示的ディスパッチと動的ディスパッチの 2 つの方法で、複数のテンプレートを操作できます。どちらの場合も、このドキュメントのこれまでの章で説明したすべてのツールを、テンプレート内のクラスで使用できます。
明示的ディスパッチ
このセクションでは、以下の項目について説明します。
明示的ディスパッチの概要
明示的ディスパッチ・メカニズムでは、個々のテンプレートがアプリケーションの領域に対応します。領域は、長くてあまり便利ではない名前を持つテンプレートに対する短い論理名としての役割を果たします。
ユーザがページ上で選択を行うと、goToArea() メソッド、または現在の領域を設定し、それに従って使用するテンプレートを決定するその他のメソッドが呼び出されます。ページ・メソッド getContent() および submitData() は、常に (どのテンプレートかに関係なく) 現在のテンプレートを使用します。
このようなページの作成は、簡単なページの作成より少し複雑になるだけです。ページをこのように設定すると、テンプレートを追加して簡単にページを拡張できます。
テンプレートへの領域の関連付け
領域の定義 (および各領域へのテンプレートの関連付け) を行うには、Zen Mojo ページ・クラスに %OnGetTemplateList() メソッドを実装します。このメソッドは、以下のとおりです。
method %OnGetTemplateList(Output pTemplates) as %Status
pTemplates は、以下のノードを含む多次元配列であると予測されます。
ノード | コンテンツ |
---|---|
pTemplate | サブノードのカウント |
pTemplate(i) (i は整数) | 以下の項目が以下の順序で含まれている $LISTBUILD リスト。
|
以下に実装例を示します。
Method %OnGetTemplateList(Output pTemplates) As %Status
{
Set tSC = $$$OK
Try {
Kill pTemplates
set area="area-home"
set template="MyApp.Templates.HomeTemplate"
set ns="http://www.corporate.com/myapp/home"
Set pTemplates($I(pTemplates))=$LB(area,template,ns)
set area="area-second"
set template="MyApp.Templates.SecondaryTemplate"
set ns="http://www.corporate.com/myapp/secondary"
Set pTemplates($I(pTemplates))=$LB(area,template,ns)
}
Catch(ex) {
Set tSC = ex.AsStatus()
}
Quit tSC
}
ページの現在の領域とキーの設定
ページの現在の領域を設定するには、ページ・インスタンスの以下のメソッドを使用します。クライアント・メソッドからこれらのメソッドのいずれかを呼び出すには、構文 zenPage.methodname() を使用します。
ClientMethod gotoArea(area, key1, key2, nohistory) [ Language = javascript ]
現在の領域、現在の key1、および現在の key2 を設定します。nohistory が True の場合は、この変更を履歴スタックにプッシュしません。
ClientMethod gotoArea(evt,area, key1, key2, nohistory) [ Language = javascript ]
キーボード・イベント (evt) が発生したときに、現在の領域、現在の key1、および現在の key2 を設定します。nohistory が True の場合は、この変更を履歴スタックにプッシュしません。
これらのメソッドのいずれかを呼び出した場合は、changeAreaHandler() を定義して、現在の領域とキーが変更されたときに発生するアクションを指定する必要があります。
changeAreaHandler() の実装
gotoArea() または gotoAreaKB() を呼び出す場合は、必ずページ・クラスで changeAreaHandler() を定義してください。このメソッドは、上記のメソッドによって自動的に呼び出され、キーが変更されたときに発生するアクションを指定します。
changeAreaHandler() メソッドには、以下のシグニチャがあります。
ClientMethod changeAreaHandler() [ Language = javascript ]
現在のテンプレートへのアクセス
現在のテンプレートにアクセスするには、ページ・インスタンスの以下のメソッドを使用します。クライアント・メソッドからこれらのメソッドのいずれかを呼び出すには、構文 zenPage.methodname() を使用します。
ClientMethod getTemplate() [ Language = javascript ]
現在のテンプレートへの参照を返します。このメソッドは、例えば、テンプレートのメソッドを実行できるようにする場合に使用します。
ClientMethod getTemplateForArea(area) [ Language = javascript ]
指定された領域に関連付けられているテンプレート・クラスの名前を返します。
動的ディスパッチ
このセクションでは、以下の項目について説明します。
動的ディスパッチの概要
動的ディスパッチ・メカニズムでは、明示的ディスパッチに比べて、小さいテンプレートが大量に使用されます。各テンプレートはキー固有のものであり、ページ・ロジックの一部しか提供しません。例えば、あるテンプレートは特定のキーのコンテンツ・オブジェクトを返すだけです。別のテンプレートは同じキーの選択イベントを処理するだけです。
(templateDispatchMode プロパティを使用して) 動的ディスパッチ・メカニズムを有効にすると、Zen Mojo はページ・ロジック内のいくつかの特定の時点でキー固有のテンプレートをチェックし、テンプレートをロードし、それを指定された目的に使用します。具体的には、動的ディスパッチを有効にすると、以下のようになります。
-
クライアントがページの getContent() メソッドを呼び出すと、Zen Mojo は適切なテンプレートをロードし、そのテンプレート・クラスの getContent() メソッドを呼び出します。
以下のサブセクションでは、このシナリオおよび以下のシナリオで Zen Mojo が適切なテンプレートを見つける方法について説明します。
-
ページ上で選択イベントが発生すると、Zen Mojo は適切なテンプレートをロードし、そのテンプレート・クラスの onselect() メソッドを呼び出します。
-
ページ上で変更イベントが発生すると、Zen Mojo は適切なテンプレートをロードし、そのテンプレート・クラスの onchange() メソッドを呼び出します。
-
ページ上で他のタイプのイベントが発生すると、Zen Mojo は適切なテンプレートをロードし、そのテンプレート・クラスの onevent() メソッドを呼び出します。
動的ディスパッチで Zen Mojo がテンプレートを見つける方法
動的ディスパッチでは、Zen Mojo は次のようにしてロードするテンプレートを見つけます。
-
Zen Mojo は、以下の XML ネームスペースでテンプレートを検索します。
templateDispatchBaseNamespace/scenario
templateDispatchBaseNamespace はその名前のページ・プロパティの値であり、scenario はシナリオを示しています。
データ・オブジェクトが要求された場合、scenario は data です。レイアウト・グラフが要求された場合、scenario は layout です。(何らかの) イベントが発生した場合、scenario は events です。
-
このネームスペースで、Zen Mojo は短いクラス名が key であるテンプレートをロードします (key は現在のキー)。
この説明では、データ・オブジェクトを取得するときにプロバイダ名として data を使用し、レイアウト・グラフを取得するときにプロバイダ名として layout を使用することを前提にしています。
動的ディスパッチを使用するためのページの変更
動的ディスパッチを使用するようにページ・クラスを変更するには、以下の手順を実行します。
-
クラスの templateDispatchMode プロパティをオーバーライドし、その InitialExpression キーワードを 1 に設定します。
Property templateDispatchMode As %ZEN.Datatype.boolean [ InitialExpression=1] ;
-
クラスの templateDispatchBaseNamespace プロパティをオーバーライドし、その InitialExpression キーワードを設定します。このキーワードの値として、テンプレートが使用する XML ネームスペースのベース部分を指定します。
例えば、Zen Mojo プラグイン・リファレンス・ドキュメント・アプリケーションでは、以下の値が使用されます。
Property templateDispatchBaseNamespace As %ZEN.Datatype.string [ InitialExpression="http://www.intersystems.com/zen/mojo/documentation"] ;
テンプレートの定義
動的ディスパッチを有効にするには、一連のテンプレートを 3 つのグループで定義します。
-
1 つのグループは、データ・オブジェクトを返します。これらのテンプレートは、XML ネームスペース templateDispatchBaseNamespace/data に存在する必要があります。(つまり、これらのテンプレートの NAMESPACE パラメータはそれぞれ templateDispatchBaseNamespace/data である必要があります。ここで、templateDispatchBaseNamespace はその名前のページ・クラス・プロパティの値です。)
異なるプロバイダ名 (data 以外の名前) を使用して、データ・オブジェクトを取得する場合は、data をご使用のプロバイダ名に置き換えてください。
これらのテンプレートは、onGetContent() と %OnGetJSONContent() (適切な場合) を実装する必要があります。
-
1 つのグループは、レイアウト・グラフを返します。これらのテンプレートは、XML ネームスペース templateDispatchBaseNamespace/layout に存在する必要があります。
異なるプロバイダ名 (layout 以外の名前) を使用してレイアウト・グラフを取得する場合は、layout をご使用のプロバイダ名に置き換えてください。
これらのテンプレートは onGetContent() を実装する必要があります。
-
1 つのグループは、すべてのイベント処理を定義します。これらのテンプレートは、XML ネームスペース templateDispatchBaseNamespace/events に存在する必要があります。
これらのテンプレートは、必要に応じて onselect()、onchange()、または onevent() を実装する必要があります。
わかりやすさとメンテナンスのしやすさを考慮して、これらのテンプレート・クラス・グループを Data、Layout、Events という名前のサブパッケージにそれぞれ配置することもできます。使用例は、プラグイン・リファレンス・ドキュメント・アプリケーションの一部である %ZEN.Mojo.PluginDocumentation.Templates パッケージを参照してください。