その他の Zen コンポーネント
この章では、このドキュメントの他の章で説明しているどのカテゴリにも該当しないコンポーネントについて説明します。他の章で説明しているカテゴリとは、レイアウト、テーブル、メータ、グラフ、フォーム、コントロール、ナビゲーション支援、およびポップアップです。
-
“<colorPane>” — ユーザが色を選択できる、大きく詳細なパレットです。
-
“<colorWheel>” — ユーザが色を選択できる、連続した色のグラデーションです。
-
“<dynaView>” — コールバック・メソッドで指定されたデータに基づいてビュー・ボックスを表示します。
-
“<fieldSet>” — フォームを見やすくまとめるためのグループ・コンポーネントです。
-
“<finderPane>” — 階層的に体系化されたデータのファインダ形式のブラウザです。
-
“<html>” — 任意の HTML コンテンツのスニペットです。
-
“<iframe>” — フレーム内の静的なイメージまたはその他のコンテンツです。
-
“<repeatingGroup>” — 実行時クエリが返す各項目に対して同じレイアウトを繰り返します。
-
“<schedulePane>” — 各日付のタイム・スロットと共に、日次、週次、月次カレンダーを表示します。
-
“<timer>” — 一定の時間間隔の後にイベントをトリガする、非表示のコンポーネントです。
上に挙げたものも含め、コンポーネントのすべてのラインナップを調べても、必要な機能が見つからない場合は、Zen ライブラリにカスタム・コンポーネントを追加することを検討してください。詳細は、"Zen アプリケーションの開発" の “カスタム・コンポーネント” の章を参照してください。
HTML コンテンツ
Zen <html> コンポーネントを使用することで、Zen ページに任意の HTML コンテンツを配置できます。HTML コンテンツは、指定どおりに Zen ページ内に表示されます。このコンテンツは、他の Zen コンポーネントと同様に、HTML の <div> で囲んで記述します。
<html> 要素によって表示するコンテンツを定義するには、以下の方法があります。
-
<html> コンポーネント内のコンテンツを文字どおりに指定します。
<html id="myContent"> This is some <b>HTML</b>. </html>
コンテンツは適格に記述する必要があります。つまり、このコンテンツに記述するすべての HTML 要素では、対応する終了タグが必要です。また、すべての属性値に正しく引用符を記述する必要があります。<script> タグは使用できません。
このコンテンツから他の Zen コンポーネントを参照することはできません。ただし、Zen #()# 実行時式をコンテンツに記述することは可能です。
-
HTML コンテンツを記述するサーバ側 OnDrawContent コールバック・メソッドを定義します。このようなメソッドを定義し、そのメソッドを <html> 要素から参照すると、このメソッドはその <html> コンポーネントが表示されるたびに呼び出されます。
<html id="myContent" OnDrawContent="GetHTMLContent" />
このメソッドそのものは、以下のようになります。
Method GetHTMLContent(pSeed As %String) As %Status { &html<This is some HTML!> Quit $$$OK }
-
<html> コンポーネントは、HTML 文の文字列である content プロパティを持ちます。content プロパティの初期値は、XData Contents の <html> 要素と </html> 要素の間に目的の HTML タグを記述するか、または OnDrawContent コールバックを参照することで設定できます。
クライアント・コードで content プロパティの値を変更するには、JavaScript でこの値を再設定します。次の例では、JavaScript ユーティリティ関数 zenSetProp() を使用してこの操作を実行します。
// get html content zenSetProp('myContent','content','some new content');
<html> コンポーネントには以下の属性があります。
属性 | 説明 |
---|---|
Zen コンポーネントの属性 |
<html> は、あらゆる Zen コンポーネントと同じ汎用属性を持ちます。詳細は、以下のセクションを参照してください。
|
OnDrawContent |
Zen ページ・クラスのサーバ側コールバック・メソッドの名前。このメソッドは、&html<> 構文または WRITE コマンドを使用して、HTML コンテンツを提供します。 Zen は、<html> コンポーネントを描画するたびに、このメソッドを呼び出して、コンポーネントの seed 値を含む %StringOpens in a new tab を自動的に渡します。このコールバックは、データ型が %StatusOpens in a new tab である値を返す必要があります。以下に、有効なメソッド・シグニチャを示します。Method DrawMe(pSeed As %String) As %Status コールバックとして上のメソッドを使用するには、<html> コンポーネントで OnDrawContent="DrawMe" と設定します。 |
seed | OnDrawContent コールバックに任意の値を渡せるようにします。 |
フレーム付きのコンテンツ
Zen の <iframe> コンポーネントは、HTML の <iframe> 要素のラッパです。イメージまたはその他のコンテンツをフレームの中に表示します。
<iframe> の属性
Zen の <iframe> コンポーネントには、以下の属性があります。
属性 | 説明 |
---|---|
Zen コンポーネントの属性 |
<iframe> は、あらゆる Zen コンポーネントと同じ汎用属性を持ちます。詳細は、以下のセクションを参照してください。
|
longdesc | フレームの詳細説明 (テキスト) にリンクする URI。 |
frameAlign | HTML の <iframe> の align 値。"left"、"right"、または "center"。 |
frameBorder |
HTML の <iframe> の frameborder 値。True の場合、フレームには境界線が付きます。False の場合、境界線は付きません。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。“Zen 属性のデータ型” を参照してください。 |
scrolling | HTML の <iframe> の scrolling 値。"auto"、"yes"、または "no"。 |
src |
フレーム・コンテンツのパス名とファイル名を表します。このパスは、絶対パス名または Caché のインストール先ディレクトリを基準とした相対パスのいずれかです。例えば、以下のようになります。 <iframe id="myFrame" src="/csp/myApp/myPic.png" /> |
フレームのコンテンツをクライアントから変更する場合は、プログラム処理で iframe オブジェクトの src プロパティの値を再設定します。
クライアント側で src プロパティ値を変更する際は、次のようにプロパティを単純に設定しないでください。
var frame=zen('contentFrame');
frame.src='C:\myfile';
代わりに、次のように、setProperty() メソッドを使用します。
var frame=zen('contentFrame');
frame.setProperty('src','C:\myfile');
イメージ・データ・ストリームのレンダリング
イメージ・データ・ストリームをレンダリングする場合、<iframe> は使用しないことをお勧めします。 代わりに、“Zen コントロール” の章で説明のある <image> を使用します。特に、イメージが JPG 形式で、ブラウザが Internet Explorer (IE) の場合は、このようにする必要があります。このトピックで詳細を説明します。
<iframe> を使用して、データ・ストリームを提供する CSP ルーチン経由でデータベースから取得したコンテンツをレンダリングするとします。ストリームには、PDF、GIF、JPG、Doc、RTF などがあります。しかし、イメージが JPG 形式でブラウザが IE の場合、<iframe> 内で JPG データをレンダリングすると、Zen のコア機能が無効になることが判明しました。
この問題の根源は、IE のデータ・ストリームのレンダリング方法にあります。
Firefox などのブラウザでデータ・ストリームが HTML ページでないと確認された場合、ブラウザではダミーの DOM を作成して受信ストリームをラップします。GIF および JPG はHTML <IMG> タグになり、それらのタグの src 属性は指定された URI に設定されます。PDF では、ビューワの起動などを目的とした HTML <EMBED> タグが自動的に生成されます。そのような場合、必ず DOM が作成され、JavaScript の実行に関する標準の範囲設定規則が適用されます。
しかし、IE は異なります。IE では DOM を作成しません。通常のページ処理に代わって、当該コンテンツの専用ビューワが優先されます。通常の Web ページでは、一般的には問題になりません。画像をロードしたり PDFをダウンロードするだけなら、DOM と対話することはないので、DOM があってもなくても問題ありません。
問題は、コンテンツが IE で <iframe> にロードされる場合に発生します。
PDF や RTF などの外部プラグインが必要なコンテンツは、IE で正しく機能すると考えられます。埋め込み GIF ビューワも正しく機能しているようです。しかし、JPG ビューワは機能しません。JPG イメージを直接ストリームとして <iframe> にロードする場合、IE で埋め込みビューワを初期化するときに、IE は <iframe> の JavaScript 実行領域だけでなく、そのページの JavaScript ネームスペース全体を破棄し、クライアント側のグローバル変数および JavaScript 関数の定義も削除してしまいます。ビューワの初期化後は、JavaScript はイベント・コールバック用の <iframe> の外で処理を続けます。そのため、<iframe> のロード前に初期化されたクライアント側データはすべて NULL にリセットされている可能性は十分あります。
このような問題に対処するための最も良いクロスプラットフォーム・ソリューションは、以下のように Zen コンポーネント <iframe>および <image> を使用することです。
-
<iframe>。外部プラグイン (PDF など) を要する HTML ドキュメントまたはデータ・ストリームの場合。
-
<image>。GIF、JPG、または PNG タイプのデータ・ストリームをレンダリングする場合。
このソリューションの唯一の欠点は、ストリームをデータベースから取得する場合、2 つのクエリが必要になることです。1 つ目は送信データのタイプを判別するクエリ、2 つ目は実際のデータを送信するクエリです。この場合のオーバーヘッドは、データ量が小さいので、ほとんどがネットワークのオーバーヘッドになります。そのため、データベースから取得するデータ・ストリームをレンダリングするための最善の手段は、以下のようになります。
-
<iframe> と <image> の両方を含むテンプレート表示ページを定義します。両方のコンポーネントとも、最初は非表示です (hidden='true')。
-
レンダリングするデータのタイプを確認するクエリを発行します。
-
このクエリに基づき、<iframe> または <image> のいずれかの src 属性をデータ・ストリームの URI に設定して、対応するコンポーネントを表示するよう設定します (hidden='false')。
-
ページを閉じるときに、そのページで次のデータ・ストリームの準備ができるように、表示されているコンポーネントを非表示にリセットします (hidden='true')。
他の組み合わせも可能ですが、これは基本的な考え方です。Web ページにイメージ・データを表示するために、必ずしも <iframe> を使用する必要はありません。IE で JPG を扱うときにこれを使用すると Zen が破損するので、そのような場合は <iframe> を使用せず、代わりに <image> を使用します。
タイマ
<timer> コンポーネントは視覚的には表示されません。指定の時間が経過すると、クライアント側イベントをトリガします。以下のように、XData Contents 内の Zen ページに <timer> を配置できます。
XData Contents [XMLNamespace="http://www.intersystems.com/zen"]
{
<page>
<timer ontimeout="zenPage.timeout(zenThis);" timeout="10000" />
</page>
}
<timer> には以下の属性があります。
属性 | 説明 |
---|---|
ontimeout |
タイマの ontimeout イベント・ハンドラ。タイマが時間切れになるたびに、Zen によってこのハンドラが呼び出されます。このメソッドでは、このタイマ・オブジェクトを表す引数 timer をとる必要があります。<timer> 要素は、組み込み変数 zenThis を使用してタイマ・オブジェクトをメソッドに渡すことができます。“Zen コンポーネントのイベント・ハンドラ” を参照してください。 |
timeout |
タイマのミリ秒数。ページを最初にロードしたときに、タイマが自動的に開始されます。timeout 時間の経過後、ontimeout 式がトリガされます。 上記の例では、timeout 値を 10,000 ミリ秒に設定しています。これにより、タイムアウト値は 10 秒に指定されます。 |
クライアント側 ontimeout メソッドは、以下のようになります。<timer> は、その ontimeout イベントを 1 回だけトリガするので、JavaScript メソッドは終了する前に (startTimer メソッドを呼び出して) タイマを再起動する必要があります。以下の例では、これを実行します。
ClientMethod timeout(timer) [ Language = javascript ]
{
// ...do something
// restart the timer
timer.startTimer();
}
フィールド・セット
<fieldSet> は、子コンポーネントの外側を取り囲むボックスを描画し、このボックス内にタイトルを表示するグループ・コンポーネントです。これにより、ページの整理に役立つ見やすいパネルが作成されます。SAMPLES ネームスペースのクラス ZENApp.HelpDeskOpens in a new tab の以下の例では、さまざまなコントロールを持つフォームで構成した “Details” というパネルを定義します。
上記の例の <fieldSet> は、以下のようになります。
<fieldSet id="detailGroup" legend="Details">
<form id="detailForm" layout="vertical" labelPosition="top"
cellStyle="padding: 2px; padding-left: 5px; padding-right: 5px;"
onchange="zenPage.detailFormChange(zenThis);" >
<hgroup>
<text id="ID" name="ID" label="ID" readOnly="true" size="5"/>
<spacer width="15"/>
<text id="CreateDate" name="CreateDate" label="Date"
readOnly="true" size="8"/>
<spacer width="15"/>
<dataCombo id="Priority" name="Priority" label="Priority" size="12"
dropdownHeight="150px" editable="false" unrestricted="true"
sql="SELECT Name FROM ZENApp_Data.Priority ORDER BY Name"/>
<spacer width="15"/>
<dataCombo id="Customer" name="Customer" label="Customer" size="24"
dropdownHeight="150px" editable="false" unrestricted="true"
sql="SELECT ID,Name FROM ZENApp_Data.Customer ORDER BY Name"/>
<spacer width="15"/>
<dataCombo id="AssignedTo" name="AssignedTo" label="Assigned To" size="24"
dropdownHeight="150px" editable="false" unrestricted="true"
sql="SELECT ID,Name FROM ZENApp_Data.Employee ORDER BY Name"/>
</hgroup>
<textarea id="Comments" name="Comments"
label="Comments" rows="3" cols="60"/>
<button id="btnSave" caption="Save" disabled="true"
onclick="zenPage.detailFormSave();" />
</form>
</fieldSet>
上記のように、<fieldSet> グループには <form> を記述でき、<form> には <fieldSet> を記述できます。<fieldSet> は、視覚上のグループのみを提供します。また、検証や送信などのフォーム動作を実行しないため、Zen フォームではありません。<fieldSet> には以下の属性があります。
属性 | 説明 |
---|---|
Zen グループの属性 | <fieldSet> は、あらゆる Zen グループと同じスタイル属性およびレイアウト属性を持ちます。詳細は、"Zen の使用法" の “Zen のレイアウト” の章にある “グループのレイアウトとスタイルの属性” を参照してください。 |
legend |
この <fieldSet> に表示するキャプションを指定するテキスト。 legend には、リテラル文字列のほか、Zen #()# 実行時式を指定できます。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen 属性のデータ型” を参照してください。 |
title |
この <fieldSet> に表示するポップアップ・メッセージを指定するテキスト。 title には、リテラル文字列のほか、Zen #()# 実行時式を指定できます。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen 属性のデータ型” を参照してください。 |
カラー・セレクタ
<colorPane> コンポーネントを使用すると、ユーザは大きなカラー・パレットの中で、表示された色を選択するか RGB 値を入力できます。このパレットは、利用可能な色を表す 3 次元の立方体から切り出したスライスを視覚化したグリッドです。<colorPane> では、この立方体の 3 面 (赤、緑、青) からユーザが選択した面の情報を受け取り、その面に平行な任意の彩度 (明暗) で立方体を切り出して色のグリッドを生成することにより、立方体のスライスを取得します。
ユーザ側から見て、<colorPane> には以下の機能があります。
-
ユーザは、パレットの正方形をクリックすることで、色を選択します。
-
ユーザは、左、下、および右にある赤、緑、または青のカラー・バーをクリックすることで、色の立方体の面とそのスライス位置を何度も切り替えることができます。左にある区切り付きのバーを使用すると、色の組み合わせを明暗の範囲で指定してスライスを選択できます。
-
右上のバーには、現在選択している色と、それに対応する HTML 16 進値が表示されます。ユーザは、このカラー・バーからテキスト値をコピーできます (編集はできません)。
-
左上では、テキスト入力フィールド [R]、[G]、および [B] を 0 ~ 255 の任意の数字に変更できます。変更した後、右上のカラー・バーをクリックすると、これらの変更が適用され、結果が表示されます。テキスト・フィールド [R]、[G]、および [B] には、ユーザがパレットから選択した色の値も反映されます。
色を選択した <colorPane> は、以下のようになります。
<colorPane> には以下の属性があります。より単純な色選択コンポーネントは、“<colorPicker>” を参照してください。
属性 | 説明 |
---|---|
Zen コンポーネントの属性 |
<colorPane> は、あらゆる Zen コンポーネントと同じ汎用属性を持ちます。詳細は、以下のセクションを参照してください。
<colorPane> は本格的なコントロール・コンポーネントではありませんが、これを使用することでユーザは値を選択でき、その値を Zen フォーム内で使用できます。このテーブルに挙げられていないコントロール属性は、<colorPane> では使用できません。 |
currCol | カラー・パレットで現在選択されているセルの列番号 (先頭番号は 0)。既定値は 0 です。0 ~ 15 の範囲で設定します。 |
currRow | カラー・パレットで現在選択されているセルの行番号 (先頭番号は 0)。既定値は 0 です。0 ~ 15 の範囲で設定します。 |
currSlice | 3 次元の色の立方体で現在選択されているスライスの番号 (先頭番号は 0)。既定値は 0 です。0 ~ 15 の範囲で設定します。 |
face | 3 次元の色の立方体で現在選択されている面の番号 (1、2、または 3)。既定値は 1 です。 |
onchange |
<colorPane> の onchange イベント・ハンドラ。<colorPane> コンポーネントの value が変更されると、Zen によってこのハンドラが呼び出されます。“Zen コンポーネントのイベント・ハンドラ” を参照してください。 |
ondblclick | ユーザが <colorPane> コンポーネントをダブルクリックすると Zen から呼び出されるクライアント側 JavaScript 式。 |
value |
最後に選択した HTML 16 進値を表す文字列。既定値は以下のとおりです。 #FFFFFF |
カラー・ホイール
<colorWheel> コンポーネントを使用すると、ユーザは連続した色のグラデーションを表示してそこから色を選択できます。実際には、カラー・ホイールには、2 つのコントロールのグループがあります。カラー・ホイールと彩度のスライダを使用してホイールからシェーディングを選択するか、個別の RGB スライダを使用して特定のカラーを配合します。
ディスクと彩度のスライダを使用する場合は、暗いトーンを表示するにはスライダを左に動かし、明るいトーンを表示するにはスライダを右に動かします。ディスクの表示により、リアルタイムで現在の設定に関するフィードバックを得ることができます。正しい範囲の色が表示されたら、ディスクの目的の領域をクリックします。クリックした場所に十字が表示され、ウィジェット下部にあるプレビュー・ボックスの背景が選択を反映して更新されます。RGB スライダも選択されたカラーを反映して更新されます。
RGB スライダを使用する場合は、スライダをドラッグして各 RGB カラー・スプレーの割合を調整します。現在の各スプレーの割合は、ボックスのスライダの左に表示されます。コントロールの下部にあるプレビュー・ボックスの背景に、3 つのスプレーすべてによって作成された色が表示されます。彩度スライダ、カラー・ディスク、および十字の場所も現在の色を反映して更新されます。
色を選択した <colorWheel> は、以下のようになります。
<colorWheel> には以下の属性があります。カラー・パレットから選択できる色選択コンポーネントについては、“<colorPane>” を参照してください。限られた色のセットから選択できる簡単な色選択コンポーネントについては、“<colorPicker>” を参照してください。
属性 | 説明 |
---|---|
Zen コンポーネントの属性 |
<colorWheel> は、あらゆる Zen コンポーネントと同じ汎用属性を持ちます。詳細は、以下のセクションを参照してください。
|
showPreview | 現在選択した色で塗りつぶされ、16 進数の HTML 色仕様が表示されたプレビュー・ボックスを表示します。 |
showRGBPanel | ユーザーが RGB カラー・スプレーの値を選択できる 3 つのスライダが配置されたパネルを表示します。 |
value |
<colorWheel> が表示されるときに自動的に初期化される値。このプロパティは、ユーザに選択された値を保持できません。現在のコントロールの値を取得するには、getValueOpens in a new tab メソッドを使用する必要があります。既定値は以下のとおりです。 #7f7f7f |
繰り返しグループ
<repeatingGroup> は、1 つのグループ項目のレイアウトを定義した後、このレイアウトを持つ複数の項目を出力する、特殊なグループ・コンポーネントです。項目の数、および各項目に記述するデータは、実行時クエリで指定します。
<repeatingGroup> には以下の属性があります。
属性 | 説明 |
---|---|
Zen グループの属性 | <repeatingGroup> は、あらゆる Zen グループと同じスタイル属性およびレイアウト属性を持ちます。詳細は、"Zen の使用法" の “Zen のレイアウト” の章にある “グループのレイアウトとスタイルの属性” を参照してください。<repeatingGroup> の layout は、既定では縦長です。 |
データ・ソースの属性 |
<repeatingGroup> には、データ・ソースを指定するための、<tablePane> に似た属性があります。<repeatingGroup> では、maxRows、queryClass、queryName、および sql がサポートされています。詳細と例は、“Zen のテーブル” の章にある以下のセクションを参照してください。
|
onclickitem |
<repeatingGroup> の onclickitem イベント・ハンドラ。繰り返しグループにある項目をユーザがクリックすると、Zen によってこのハンドラが呼び出されます。“Zen コンポーネントのイベント・ハンドラ” を参照してください。 |
selectedIndex | 現在選択されている項目のインデックス番号 (先頭番号は 0)。既定値は -1 で、現在は選択されている項目がないことを示します。 |
繰り返しグループの一般的なレイアウト方針は、個々の項目を記述した横長のグループを囲む <repeatingGroup> 要素についてのものです。<repeatingGroup> の既定のレイアウトは縦長なので、この配置により、各項目は横長にレイアウトされ、項目のセットは上から下へとレイアウトされます。
以下は、XData Contents ブロックからの抜粋で、<repeatingGroup> に対するこのレイアウト方針の例を示しています。これは、SAMPLES ネームスペースのクラス ZENTest.RepeatingGroupTestOpens in a new tab の XData Contents ブロックと類似しています。<hgroup> が個々のエントリを定義していることに注意してください。この <hgroup> には、<button> コンポーネントと <html> コンポーネントが含まれています。
<vgroup>
<repeatingGroup id="repeatingGroup"
maxRows="1000"
sql="SELECT TOP ? Name,Title,SSN,Salary,FavoriteColor
FROM ZENDemo_Data.Employee WHERE Name %STARTSWITH ?">
<parameter value="#(%page.Rows)#" />
<parameter value="#(%page.SearchKey)#" />
<hgroup>
<button caption="#(%query.Name)#"
title="Salary: $ #(%query.Salary)#"
onclick="alert('Salary: $ #(%query.Salary)#\n
Favorite Color: #(%query.FavoriteColor)#\n
ID Number: #(%query.SSN)#')" />
<html>
<b>#(%query.Title)#</b>
</html>
</hgroup>
</repeatingGroup>
<spacer height="25"/>
<form>
<text id="search" label="Key:" value="#(%page.SearchKey)#" size="10"/>
<text id="rows" label="Rows:" value="#(%page.Rows)#" size="5"/>
<button caption="Search" onclick="zenPage.refreshGroup();" />
</form>
</vgroup>
以下の図は、この抜粋のサンプル出力を示しています。この出力では、ユーザはキーとして「C」を入力し、出力行数として 10 行を要求して、[検索] をクリックしています。これにより、C の文字で始まるエントリのうち、先頭の 10 件を使用して繰り返しグループが表示されます。次に、ユーザがグループの従業員名をクリックすると、警告ウィンドウが表示されます。このウィンドウには、クエリでサーバから取得されたデータが表示されています。
出力側では、繰り返しグループの子ごとにオブジェクトが 1 つだけ作成されますが、このオブジェクトの中には複数の HTML が記述されています。記述されたこの HTML では、それぞれで生成した id の値として現在の項目番号を使用し、該当のページにある HTML 要素を特定します。
<repeatingGroups> の使用は、妥当な範囲で簡素化することをお勧めします。繰り返しグループの中に別の繰り返しグループを作成することはできません。
動的なビュー
<dynaView> コンポーネントは、ビュー・ボックス内に一連のユーザ定義項目を表示します。これらの項目は、ファイル・ダイアログ・ボックスに一連のファイルやディレクトリが表示されるのと同じように表示されます。<dynaView> の項目は、以下の 2 つのモードのいずれかで表示できます。
-
"list" — すべての項目が、グリッド内にコンパクトに表示されます。データの最初の列のみが表示されます。
-
"details" — 各項目が、テーブル内の 1 つの行として表示されます。各行が、いくつかの列のデータを表すことがあります。
“details” モードの <dynaView> は SAMPLES ネームスペースのクラス ZENTest.DynaViewTestOpens in a new tab に基づいており、以下の例のようになります。
<dynaView> の OnGetViewContents コールバック・メソッド
<dynaView> では、Zen ページ・クラスで定義されたサーバ側コールバック・メソッドを呼び出すことにより、そのデータを取得できます。そのメソッド名は、以下の例に示すように、<dynaView> の OnGetViewContents 属性を使用して指定します。この例では、そのメソッド名は GetViewContents です。
<dynaView id="view" viewType="details"
OnGetViewContents="GetViewContents"
onchange="zenPage.viewChange(zenThis);" >
<parameter paramName="label" value="Draft" />
</dynaView>
<dynaView> には、ゼロ個以上の <parameter> 要素を記述できます。各 <parameter> は、OnGetViewContents コールバック・メソッドの入力パラメータを指定します。各 <parameter> には以下の属性があります。
属性 | 説明 |
---|---|
id |
クライアント側のユーザ・アクションに応じて、パラメータにアクセスしてその値を実行時に変更できるようにするには、<parameter> 要素に id を指定し、次のようにパラメータを定義します。<parameter id="parmLabel" paramName="label" value="Draft" /> 同じ Zen ページ・クラスのクライアント側 JavaScript メソッドは、以下のようにこのパラメータ値を “Final” に変更できます。var parm = zen(parmLabel); parm.value = "Final"; |
paramName | paramName は <dynaView> 内で一意であることが必要です。コールバック・メソッドに渡されるパラメータの配列の添え字となります。 |
value | <parameter> に指定する value には、リテラル文字列のほか、Zen #()# 実行時式も使用できます。 |
OnGetViewContents コールバック・メソッドには、以下のようなシグニチャが必要です。
Method GetViewContents(
ByRef pParms As %String,
Output pContents As %String,
Output pHeaders As %String) As %Status
以下はその説明です。
-
このメソッドは、%StatusOpens in a new tab 値を返し、成功または失敗を示します。
-
pParms は、<dynaView> で定義されたすべての<parameter> 要素を表します。pParms は配列です。この配列の各メンバは、paramName を添え字として使用し、value を値として使用します。
-
pContents は多次元配列で、ビュー・ボックスに表示する項目のセットを記述します。この配列には項目番号を表す添え字が付きます (先頭は 1)。各配列要素は、以下の情報を持つ $List 構造体になります。コールバック・メソッド内で以下のような文を使用して、ObjectScript 関数 $LISTBUILD ($LB) で pContents の各リスト項目を作成することができます。
Set pContents(n) = $LB(textValue,logicalValue,icon,col2,col3)
以下はその説明です。
-
textValue は、項目に表示される値です。
-
logicalValue は、項目に関連付けられた論理値です。
-
icon は、項目と共に表示されるイメージの URI です (存在する場合)。
-
これらに続いて記述する値 (col2、col3 など) には、dynaView が “details” モードであるときに追加列に表示する値を定義します。
-
-
pHeaders は、列番号を添え字とする列ヘッダのセットを指定する多次元配列です。dynaView が “details” モードの場合、このプロパティを使用して、表示するデータ列の数およびその列ヘッダを定義します。以下はその例です。
// define 3 column headers Set pHeaders(1) = "Name" Set pHeaders(2) = "Size" Set pHeaders(3) = "Date"
スケジュール・カレンダー
<schedulePane> は、各日付のタイム・スロットと共に、日次、週次、月次カレンダーを表示します。ユーザはアポイントメントを定義して、それを適切なタイム・スロットに配置できます。以下に、週次モードの <schedulePane> でいくつかのアポイントメントが定義された例を示します。この例は、SAMPLES ネームスペースのクラス ZENTest.SchedulePaneTestOpens in a new tab と似ています。
<schedulePane> はコントロールではないので、値を返しません。ユーザがフォームで日付を値として入力できる単純な日付選択コントロールは、“Zen コントロール” の章の “日付” を参照してください。
<schedulePane> の OnGetScheduleInfo コールバック・メソッド
<schedulePane> では、Zen ページ・クラスで定義されたサーバ側コールバック・メソッドを呼び出すことにより、そのデータを取得できます。そのメソッド名は、以下の例に示すように、<schedulePane> の OnGetScheduleInfo 属性を使用して指定します。この例では、そのメソッド名は GetScheduleInfo です。
<schedulePane id="schedule" caption="Schedule for Bob"
dateFormat="5" interval="30" startTime="540" endTime="1020"
dropEnabled="true" ondrop="zenPage.scheduleDataDrop(dragData);"
onselectitem="zenPage.selectItem(id,time);"
OnGetScheduleInfo="GetScheduleInfo">
<parameter id="parmPerson" paramName="Person" value="Bob" />
</schedulePane>
<schedulePane> には、ゼロ個以上の <parameter> 要素を記述できます。各 <parameter> は、OnGetScheduleInfo コールバック・メソッドの入力パラメータを指定します。各 <parameter> には以下の属性があります。
属性 | 説明 |
---|---|
id |
クライアント側のユーザ・アクションに応じて、パラメータにアクセスしてその値を実行時に変更できるようにするには、<parameter> 要素に id を指定し、次のようにパラメータを定義します。<parameter id="parmPerson" paramName="Person" value="Bob" /> 同じ Zen ページ・クラスのクライアント側 JavaScript メソッドは、以下のようにこのパラメータ値を “Sally” に変更できます。 var parm = zen('parmPerson'); parm.value = "Sally"; |
paramName | paramName は <schedulePane> 内で一意であることが必要です。コールバック・メソッドに渡されるパラメータの配列の添え字となります。 |
value | <parameter> に指定する value には、リテラル文字列のほか、Zen #()# 実行時式も使用できます。 |
OnGetScheduleInfo コールバック・メソッドには、以下のようなシグニチャが必要です。
ClassMethod GetScheduleInfo
(ByRef pParms As %String,
pStartDate As %Date,
pEndDate As %Date,
ByRef pInfo As %List) As %Boolean
以下はその説明です。
-
このメソッドは、%BooleanOpens in a new tab 値を返します。成功した場合は True、それ以外は False となります。
-
pParms は、<schedulePane> で定義されたすべての <parameter> 要素を表します。pParms は配列です。この配列の各メンバは、paramName を添え字として使用し、value を値として使用します。
-
pStartDate は開始日時を示します。これは、Caché の日付の内部格納形式である $HOROLOG ($H) 形式で指定します。"Caché ObjectScript リファレンス" で説明があるように、この形式では、1840 年 12 月 31 日からの経過日数、コンマ、午前 0 時からの経過秒数の順に指定します。つまり、以下のようになります。
date,time
date と time は整数です。
-
pInfo は、スケジュール・カレンダーに表示するタイム・スロットを記述する多次元配列です。配列の添え字は、以下のように指定します。
-
time は、このタイム・スロットの開始時刻を、午前 0 時からの経過時間 (分) で示す整数です。この値を 60 の倍数として記述すると、コードは読みやすくなります。例えば、午前 9 時の場合、リテラル値として単に 540 と指定する代わりに 9*60 と指定できます。いずれも、正しく処理されます。
-
n は、同じ day および time 値を持つ複数のタイム・スロットを区別する場合に使用できる整数です (先頭は 1。通常は 1 です)。
各 pInfo 配列要素は、以下の情報を持つ $List 構造体になります。コールバック・メソッド内で以下のような文を使用して、ObjectScript 関数 $LISTBUILD ($LB) で pInfo の各リスト項目を作成することができます。
Set pInfo(day,time,n) = $LISTBUILD(duration,id,text,type,style)
以下はその説明です。
-
duration は、スケジュールのこのタイム・スロットで予約する時間 (分) を示す整数です。
-
id は、スケジュールでこのタイム・スロットが選択されたときに、これを一意に識別するために onselectitem イベント・ハンドラが使用する整数です。
-
text は、スケジュールのこのタイム・スロットに表示する説明テキストです。
-
type は 0 または 1 です。
-
0 は使用できないタイム・スロットです。
-
1 はスケジュール済みのタイム・スロットです。
-
-
style は、スケジュールのこのタイム・スロットに適用される CSS スタイルです。この値は、このタイム・スロットに適用可能な他のすべての競合するスタイルより優先されます。
以下の例では、指定された開始日付の午前 9 時から 60 分間のスタッフ・ミーティングを設定し、それを予約済みタイム・スロットに設定して、スケジュールのカレンダー表示の背景色を緑に変更しています。
ClassMethod GetScheduleInfo(ByRef pParms As %String,
pStartDate As %Date,
pEndDate As %Date,
ByRef pInfo As %List)
As %Boolean
{
Set pInfo(pStartDate,9*60,1)
= $LB(60,1,"Staff Meeting",1,"background: green;")
Quit 1
}
また、pInfo 配列の最上位ノードに CSS スタイル値を設定すると、特定の日付のすべてのタイム・スロットに適用するスタイルを指定できます。次に例を示します。
Set pInfo(day) = "background: yellow;"
<schedulePane> の属性
このトピックでは、OnGetScheduleInfo 属性については既に詳しく説明しました。以下のテーブルは、<schedulePane> の属性の一覧を示しています。
属性 | 説明 |
---|---|
Zen コンポーネントの属性 |
<schedulePane> は、あらゆる Zen コンポーネントと同じ汎用属性を持ちます。詳細は、以下のセクションを参照してください。
|
caption |
スケジュールの上部にキャプションとして表示するテキスト。このテキストは、HTML エスケープが行われないため、マークアップを含めることができます。caption の値には、リテラル文字列のほか、Zen #()# 実行時式を指定できます。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen 属性のデータ型” を参照してください。 |
cellHeight | スケジュール・カレンダーのタイム・スロットの高さ (ピクセル単位) を指定する整数。既定は 30 です。これは、dateFormat の図で示されているとおりです。cellHeight には単位を指定しないでください。 |
date |
表示する日付 (YYYY-MM-DD 形式)。既定は、現在の日付です。スケジュール・カレンダーは、この日付の値を含めた日付の範囲を表示します。実際の範囲は、view 属性の現在の値 ("day"、"week"、または "month") により異なります。 date の値には、リテラル文字列のほか、Zen #()# 実行時式を指定できます。 |
dateFormat |
スケジュール・カレンダーのヘッダに使用する日付形式を示す整数。<schedulePane> により、自動的に曜日名の下にこの日付が表示されます。 dateFormat の既定値は -1 です。この既定値では、次の図に示すように、“Feb 18, 2009” という形式の日付が生成されます。図に示されている、スケジュール・カレンダー表示のこの部分の headerHeight および cellHeight 属性も構成することができます。 dateFormat の値として使用できる整数の一覧については、"Caché ObjectScript リファレンス" の $ZDATETIME ($ZDT) 関数の “パラメータ” セクションにある dformat の説明を参照してください。dateFormat では、dformat とほぼ同じ範囲の値を使用できます。dateFormat では、–1 および 1 ~ 13 の値を使用できます。 |
dayList |
完全な曜日名のコンマ区切りリスト。 dayList の既定値は、英語の値 (Sunday ~ Saturday) を含む $$$Text マクロを使用します。このマクロを使用すると、メッセージ・ディクショナリからエクスポートしたときに、そのアプリケーションで翻訳する文字列のリストに dayList 値が自動的に格納されるようになります。ただし、そのためには Zen クラスの DOMAIN パラメータを設定している必要があります。詳細は、"Zen アプリケーションの開発" の “Zen のローカライズ” の章にある “$$$Text マクロ” を参照してください。 ZENLOCALIZE データ型パラメータは 1 (True) に設定されているので、dayList で $$$Text を使用できます。あらゆる dayList 文字列は、ローカライズした場合でも、7 個の項目をコンマ区切りリストの状態で維持する必要があります。dayList を変更したら、必ず shortDayList および firstDayOfWeek も調整してください。 |
endTime |
スケジュール・カレンダーに表示する日次タイム・スロットの終了時刻。これは、午前 0 時からの経過時間 (分) を表す整数値です。endTime の既定値は 1080 (午後 6 時) です。endTime の範囲は 0 ~ 1440 です。これで 1 日 24 時間すべてに対応できます。 エンド・ユーザが startTime から endTime の範囲外にアポイントメントをスケジュールした場合、カレンダーはそのタイム・スロットを表示できるように拡張されます。 endTime の値には、リテラル文字列のほか、Zen #()# 実行時式を指定できます。 |
firstDayOfWeek |
スケジュール・カレンダーの週の最初の日として表示する曜日を示す整数。 0 は日曜日、1 は月曜日 ... 6 は土曜日となります。既定の firstDayOfWeek は 0 です。 firstDayOfWeek 属性の目的は、さまざまなロケールに合わせてスケジュール・カレンダーをカスタマイズできるようにすることです。firstDayOfWeek を変更したら、必ず dayList および shortDayList も調整してください。 |
headerHeight | スケジュール・カレンダーの上部のヘッダ行の高さ (ピクセル単位) を指定する整数。このヘッダ行には、曜日名とその日付が表示されます。既定は 40 です。これは、dateFormat の例で示されているとおりです。headerHeight には単位を指定しないでください。 |
interval | カレンダーの各タイム・スロットの時間 (分) を指定する整数。interval の既定値は 30 で、最小値は 5 です。interval の値には、リテラル文字列のほか、Zen #()# 実行時式を指定できます。 |
monthList |
完全な月名のコンマ区切りリスト。monthList の既定値は、英語の値 (January ~ December) を含む $$$Text マクロを使用します。 ZENLOCALIZE データ型パラメータは 1 (True) に設定されているので、monthList で $$$Text を使用できます。あらゆる monthList 文字列は、ローカライズした場合でも、12 個の項目をコンマ区切りリストの状態で維持する必要があります。 |
OnGetScheduleInfo |
Zen ページ・クラスのサーバ側コールバック・メソッドの名前。このメソッドは、スケジュールの表示に必要な情報を取得します。 詳細は、“<schedulePane> の OnGetScheduleInfo コールバック・メソッド” を参照してください。 |
onselectitem |
<schedulePane> の onselectitem イベント・ハンドラ。スケジュール・カレンダーにある項目をユーザがクリックすると、Zen によってこのハンドラが呼び出されます。“Zen コンポーネントのイベント・ハンドラ” を参照してください。 onselectitem 定義は、一般的には以下のようになります。<schedulePane onselectitem="zenPage.selectItem(id,time);" ... > 一方、Zen ページ・クラスの onselectitem ハンドラ・メソッドのシグニチャは、以下のようになります。ClientMethod selectItem(id, time)[ Language = javascript ] このハンドラは、引数として次の 2 つの特殊変数を使用します。
|
shortDayList |
曜日の省略名のコンマ区切りリスト。shortDayList の既定値は、次の文字列を含む $$$Text マクロを使用します。 Sun,Mon,Tue,Wed,Thu,Fri,Sat ZENLOCALIZE データ型パラメータは 1 (True) に設定されているので、shortDayList で $$$Text を使用できます。あらゆる shortDayList 文字列は、ローカライズした場合でも、7 個の項目をコンマ区切りリストの状態で維持する必要があります。shortDayList を変更したら、必ず dayList および firstDayOfWeek も調整してください。 |
shortMonthList |
月の省略名のコンマ区切りリスト。shortMonthList の既定値は、次の文字列を含む $$$Text マクロを使用します。 Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec ZENLOCALIZE データ型パラメータは 1 (True) に設定されているので、shortMonthList で $$$Text を使用できます。あらゆる shortMonthList 文字列は、ローカライズした場合でも、12 個の項目をコンマ区切りリストの状態で維持する必要があります。 |
startTime |
スケジュール・カレンダーに表示する日次タイム・スロットの開始時刻。これは、午前 0 時からの経過時間 (分) を表す整数値です。startTime の既定値は 480 (午前 8 時) です。startTime の範囲は 0 ~ 1440 です。これで 1 日 24 時間すべてに対応できます。 エンド・ユーザが startTime から endTime の範囲外にアポイントメントをスケジュールした場合、カレンダーはそのタイム・スロットを表示できるように拡張されます。 startTime の値には、リテラル文字列のほか、Zen #()# 実行時式を指定できます。 |
view | 表示するスケジュールのタイプを指定します。指定可能な値は、"day"、"week"、または "month" です。既定は "day" です。view の値には、リテラル文字列のほか、Zen #()# 実行時式を指定できます。 |
プログラムを使用して %ZEN.ComponentEx.schedulePaneOpens in a new tab を扱う際は、schedulePane クラスの以下のプロパティについても知っておく必要があります。
-
XData Contents の元の <schedulePane> 定義で指定されている各 <parameter> 要素は、%ZEN.Auxiliary.parameterOpens in a new tab オブジェクトのリスト・コレクションである、schedulePane の parameters プロパティのメンバとなります。各 <parameter> は、parameters コレクション内の通常の位置 (1、2、3 など) を取得します。
-
読み取り専用の selectedTime プロパティは、スケジュール・カレンダーで現在選択されているタイム・スロットの開始時刻を保持します。selectedTime は、午前 0 時からの経過時間 (秒) を表す整数値です。
-
読み取り専用の selectedInterval プロパティは、スケジュール・カレンダーで現在選択されているタイム・スロットの長さ (分) を保持します。selectedInterval を selectedTime に加算して、終了時刻を計算します。
ファインダ・ペイン
<finderPane> コンポーネントは、階層的に体系化されたデータの単純なブラウザを実装します。データは、JavaScript Object Notation (JSON) で提供される必要があります。Zen コンポーネントの <altJSONProvider> は、この形式でデータを提供します。"Zen アプリケーションの開発" の “Zen の JSON コンポーネント” セクションを参照してください。("Caché での JSON の使用" も参照してください。)
SAMPLES ネームスペースのサンプル・クラス ZENTest.FinderPaneTestOpens in a new tab では、<finderPane> を <altJSONProvider> と組み合わせて使用する例を示しています。また、以下の例では、JSON コンポーネントを作成するコードを示し、OnGetArray コールバックを、このクラスで定義されている GetFinderArray メソッドに設定します。
<altJSONProvider id="json" OnGetArray="GetFinderArray"/>
次の例では、ファインダ・ペインを作成するコードを示します。このコードは、<finderPane> の ongetdata プロパティを <altJSONProvider> コンポーネントの getContentObject メソッドに設定します。このメソッドは、<altJSONProvider> によって提供されるデータのクライアント側バージョンを返します。onselectitem、ondrawdetails、および ondrawempty の各プロパティは、このクラスで定義されているメソッドに設定されます。
<finderPane id="finder"
ongetdata="return zen('json').getContentObject();"
onselectitem="return zenPage.itemSelected(item);"
ondrawdetails="return zenPage.drawDetails(item);"
ondrawempty="return zenPage.drawEmptyFinder();" />
<finderPane> には以下の属性があります。
属性 | 説明 |
---|---|
Zen コンポーネントの属性 |
<finderPane> は、あらゆる Zen コンポーネントと同じ汎用属性を持ちます。詳細は、以下のセクションを参照してください。
|
animate |
True の場合、ファインダが表示されます。既定値は True です。 |
caption |
ファインダの上部にキャプションとして表示するテキスト。このテキストは、HTML エスケープが行われないため、マークアップを含めることができます。caption の値には、リテラル文字列のほか、Zen #()# 実行時式を指定できます。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen 属性のデータ型” を参照してください。 |
columnWidth |
"columns" モード時のファインダ内の列の幅。既定値は 200 ピクセルです。viewType 属性を使用して、“columns” モードを選択します。 |
folderIcon |
フォルダ項目が “icons” モードの場合に表示する既定のアイコン。viewType 属性を使用して、“icons” モードを選択します。既定値は、システムから提供されたイメージ・ファイルのファイル名です。この属性を使用して、別の既定イメージを設定することもできます。ファイル名には、Caché インストール・ディレクトリの下にある csp/broker ディレクトリからのパスを指定します。 ongeticon イベント・ハンドラで、ファインダ内に表示される項目の異なるイメージ・ファイルを返すことができます。 |
hilightTop |
True の場合、"list" モードの最上位行にハイライト・カラーを適用します。既定値は False です。 |
itemIcon |
項目が “icons” モードの場合に表示する既定のアイコン。viewType 属性を使用して、“icons” モードを選択します。既定値は、システムから提供されたイメージ・ファイルのファイル名です。この属性を使用して、別の既定イメージを設定することもできます。ファイル名には、Caché インストール・ディレクトリの下にある csp/broker ディレクトリからのパスを指定します。 ongeticon イベント・ハンドラで、ファインダ内に表示される項目の異なるイメージ・ファイルを返すことができます。 |
listColumns |
定義すると、"list" モードで列値を指定するプロパティのリストになります。 |
oncancel |
oncancel イベント・ハンドラ : 定義されている場合、ユーザがファインダ内で Esc キーを押すと発生するイベントを処理します。 |
ondblclick |
ondblclick イベント・ハンドラ : 定義されている場合、ユーザがファインダ内で項目をダブルクリックすると発生するイベントを処理します。 |
ondrawdetails |
ondrawdetails イベント・ハンドラ : 定義されている場合、子を持たない項目が選択されると発生するイベントを処理します。このイベント・ハンドラが値を返す場合、この値は項目の詳細を記述する DHTML として使用されます。 |
ondrawempty |
ondrawempty イベント・ハンドラ : 定義されている場合、ファインダ内に表示できるデータがないときに発生するイベントを処理します。このイベント・ハンドラが値を返す場合、この値はその空のファインダにコンテンツを提供する DHTML として使用されます。 |
ondrawitem |
ondrawitem イベント・ハンドラ : 定義されている場合、ファインダ内の項目が描画されるときに発生するイベントを処理します。このイベント・ハンドラが値を返す場合、この値は項目のコンテンツを記述する DHTML として使用されます。 |
ongetdata |
ongetdata イベント・ハンドラ : ファインダのコンテンツを提供するために使用される JavaScript オブジェクトのグラフを返すクライアント側コードを定義します。 |
ongeticon |
ongeticon イベント・ハンドラ : 定義されている場合、ファインダが "icons" 表示で、現在の項目に使用するアイコンの URL を返すときに発生するイベントを処理します。"" (空文字列) を返す場合、既定のアイコンが使用されます。現在の項目は、項目としてイベント・ハンドラに渡されます。 |
onlazyload |
onlazyload イベント・ハンドラ : ファインダにデータを部分的にロードするために使用します。このイベント・ハンドラは、現在のノードの子として使用される JavaScript オブジェクトのグラフを返すクライアント側コードを定義します。 |
onselectitem |
onselectitem イベント・ハンドラ : 定義されている場合、ユーザがファインダ内で項目をクリックすると発生するイベントを処理します。 |
parameters |
ユーザ定義のパラメータのセット。これらのパラメータは現在ファインダでは使用されていません。 |
selectedList |
現在選択されている項目を示す、0 から始まる数値のリスト。最初の数値は項目の最上位のリストに含まれているインデックス、2 番目の数値は最上位の項目の子に含まれているインデックスというようになります。 |
upIcon |
ファインダが “icons” モードのときにユーザがレベルを上に移動することができるボタンに表示する既定のアイコン。viewType 属性を使用して、“icons” モードを選択します。既定値は、システムから提供されたイメージ・ファイルのファイル名です。この属性を使用して、別の既定イメージを設定することもできます。ファイル名には、Caché インストール・ディレクトリの下にある csp/broker ディレクトリからのパスを指定します。 |
viewType |
ファインダ・コンポーネントのコンテンツの表示方法。可能な値は以下のとおりです。
既定値は “columns” です。 |