Zen のフォーム
フォームを使用することで、ユーザがデータを入力できます。Zen コントロールとは、アプリケーション・データを表示し、そのデータをユーザが編集できるようにするコンポーネントです。Zen フォームとは、コントロール・コンポーネントを収めることを目的として設計された特殊なグループ・コンポーネントです。Zen フォームは、あらゆる Zen グループ同様にスタイル属性およびレイアウト属性を持ちます。また、フォームはグループであるため、その他の任意のタイプの Zen コンポーネントを収めることができます。
すべての Zen コンポーネントと同様に、Zen フォームは Zen ページ・オブジェクトの子である必要があります。これは、Zen アプリケーションにフォームを指定する場合は、<page> コンテナにフォーム・コンポーネントを収めた Zen ページ・クラスを作成する必要があるということです。次の 2 つのコンポーネントを使用できます。
-
“<form>” — コントロール・コンポーネントの特定のリストを含む Zen グループ。これらのコントロールは、その値をデータ・コントローラから取得するかどうかは自由ですが、そのレイアウトはすべて XData Contents の <form> 定義によって決まります。
-
“<dynaForm>” — コントロール・コンポーネントを Zen ページのグループ (複数可) に直接挿入する、<form> の拡張。コントロールのリストは、関連付けられたデータ・コントローラのプロパティ、またはコントロールのリストを生成するコールバック・メソッドによって指定できます。レイアウトは自動的に、<dynaForm> 内部のコードによって決まります。
Zen ウィザードを使用して簡単なアプリケーション向けにフォーム・ベースのユーザ・インタフェースを作成するスタジオ・チュートリアルがあります。"スタジオの使用法" ドキュメントの “スタジオを使用した簡単なアプリケーションの構築” の章を参照してください。
データ・コントローラの詳細は、“モデル・ビュー・コントローラ” の章を参照してください。
章のトピックには、以下が含まれます。
-
“フォームとコントロール”
-
“ユーザ対話”
-
“フォームの定義”
-
“フォームの値の指定”
-
“フォームの変更の検出”
-
“フォームの検証”
-
“エラーと無効な値”
-
“ユーザ・ログインのフォーム”
-
“動的なフォーム”
フォームとコントロール
Zen ライブラリには、フォームで使用するコントロールが多数用意されています。これらのコントロールの多くは、標準的な HTML コントロールのラッパですが、それらにはない機能を持つものもあります。以下の図は、テキスト・フィールドやラジオ・ボタンなど、多数のコントロールを持つフォームを示します。これは、SAMPLES ネームスペースのクラス ZENDemo.FormDemoOpens in a new tab で生成したサンプル・フォームです。
以下の図は、Zen に用意されているフォーム・コンポーネントおよびコントロール・コンポーネントのリストです。図に挙げられているクラスのほとんどはコントロールです。 図に示されているすべてのクラス、例えば %ZEN.Component.formOpens in a new tab や %ZEN.Component.controlOpens in a new tab などは、パッケージ %ZEN.Component にあります。図は、これらのクラスの継承関係を表し、このドキュメントで最も頻繁に取り上げるベース・クラスに焦点を当てます。
個々のコントロールの詳細は、“Zen コントロール” の章を参照してください。
ユーザ対話
Zen アプリケーション・ユーザと Zen フォームの間の基本的な対話は以下のとおりです。
-
ユーザはフォーム上のコントロールと対話します。
-
Zen ではデータの入力時にそのデータを検証できます。
-
ユーザ・アクションにより、フォームの送信を指示します。
-
Zen では、送信する前にデータを検証できます。
-
Zen ではユーザと対話して、検出されたエラーを処理します。
-
すべてのエラーが解消されると、Zen ではフォームのデータを送信します。
-
以下のいずれかが実行されることがあります。
-
フォームのデータがサーバに書き込まれます。
-
同じ Zen ページが再表示されます。
-
別の Zen ページが表示されます。
-
同じ Zen ページが、コンポーネントを追加または変更して表示されます。
-
フォームの定義
Zen コンポーネント “<form>” および “<dynaForm>” はそれぞれ、フォームの特性を定義する以下の属性をサポートします。
属性 | 説明 |
---|---|
Zen グループの属性 | フォームは、あらゆる Zen グループと同じスタイル属性およびレイアウト属性を持ちます。詳細は、"Zen の使用法" の “Zen のレイアウト” の章にある “グループのレイアウトとスタイルの属性” を参照してください。 |
action |
フォームの HTML action を指定します。action 属性を設定すると、Zen フォームの既定の動作がオーバーライドされて、Zen は通常の送信ロジックを実行しなくなります。 インターシステムズでは、HTML action 属性を直接制御する必要がある特殊なケースを除いて、action 属性を使用しないことをお勧めします。これに該当する可能性があるのは、特定のカスタム・ログイン・フォームのケースです。 |
autocomplete | このフォーム内のコントロールの値が既定でブラウザによって自動的に入力されるかどうかを示します。このフォームに属する要素は、autocomplete 属性を設定することによって、この設定をオーバーライドできます。 |
autoValidate |
True の場合 (既定)、このフォームを送信すると、このフォームの validate メソッドが自動的に呼び出されます。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。“Zen 属性のデータ型” を参照してください。 |
controllerId | このフォームがデータ・コントローラに関連付けられている場合、controllerId 属性は、このフォームのデータを提供するコントローラを表します。controllerId の値は、その <dataController> に指定した id 値と一致している必要があります。“モデル・ビュー・コントローラ” の章を参照してください。 |
enctype | フォームの HTML enctype を指定します ("multipart/form-data" など)。 |
invalidMessage |
このフォームの内容が無効な場合に、フォーム検証メソッドにより警告ボックスに表示されるメッセージ・テキスト。既定値は以下のとおりです。 このフォームは、無効な値を含んでいます。以下のフィールドを修正して、再度実行してください。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。“Zen 属性のデータ型” を参照してください。 |
key |
このフォームに関連付けられたデータ・モデル・オブジェクトの特定のインスタンスを表す文字列。これはモデル ID です。モデル ID の形式と指定可能な値は、そのデータ・モデル・クラスの開発者が決定します。詳細は、“モデル・ビュー・コントローラ” の章の “データ・モデル・クラスのプロパティ” を参照してください。 <form> または <dynaForm> で key を指定する場合、OnLoadForm コールバックはこのモデル ID を使用して初期値をフォームにロードします。ただし、このフォームが <dataController> に接続されている場合、key 値は無視されます。 key には、リテラル文字列のほか、Zen #()# 実行時式を指定できます。 |
method |
フォームの HTML method を指定します。method 属性を設定すると、Zen フォームの既定の動作がオーバーライドされて、Zen は通常の送信ロジックを実行しなくなります。 インターシステムズでは、HTML method 属性を直接制御する必要がある特殊なケースを除いて、method 属性を使用しないことをお勧めします。これに該当する可能性があるのは、特定のカスタム・ログイン・フォームのケースです。 |
nextPage | このフォームが正常に送信された後に表示するページの URI。この URI は、フォームにある特定の <submit> ボタンでオーバーライドできます。 |
onchange |
フォームの onchange イベント・ハンドラ。このフォームのコントロールの値をユーザが変更したとき、またはフォームの clearModified メソッドへの呼び出しにより、変更されたフラグがクリアされたときに、Zen によってこのハンドラが呼び出されます。コントロールに対して実行する onchange 式では、control という引数を使用して、変更されたコントロールを参照できます。“Zen コンポーネントのイベント・ハンドラ” を参照してください。 |
ondefault | フォームの既定のアクションをトリガする動作をユーザが実行したときに Zen で呼び出すクライアント側 JavaScript 式。通常、これはユーザがフォーム内のコントロールで Enter キーを押したときの動作を指します。 |
oninvalid | このフォームの validate メソッドにより、このフォームの内容が無効であると識別されたときに、Zen で呼び出すクライアント側 JavaScript 式。これによって、アプリケーションでカスタム・メッセージを表示するタイミングを把握できます。 |
OnLoadForm |
Zen ページ・クラスのサーバ側コールバック・メソッドの名前。詳細は、このテーブルの後に記載されています。 |
onnotifyView |
フォームの onnotifyView イベント・ハンドラ。このフォームに接続されたデータ・コントローラがイベントを発生するたびに、Zen によってこのハンドラが呼び出されます。“Zen コンポーネントのイベント・ハンドラ” を参照してください。この属性は、フォームがデータ・コントローラに関連付けられている場合に適用されます。“モデル・ビュー・コントローラ” の章を参照してください。 |
onreset | このフォームがリセットされるときに Zen で呼び出すクライアント側 JavaScript 式。通常、この式は、クライアント側 JavaScript メソッドを呼び出します。 |
OnSubmitForm |
Zen ページ・クラスのサーバ側コールバック・メソッドの名前。このメソッドは、フォームの送信時に適切な一連のアクションを実行します。OnSubmitForm は、フォームが変更の検出、値の検証、およびフォームの送信を実行するために提供する組み込みメカニズムの代わりとなるメカニズムを提供する場合にのみ使用できます。他のタイプの汎用処理の実行には使用しないでください。以下のいくつかのセクションで、フォーム送信によって提供される組み込みメカニズムについて説明します。 ユーザがフォームを送信すると、Zen はこのメソッドを呼び出して、%ZEN.Submit 型の入力パラメータを自動的に渡します。フォームに OnSubmitForm の値が指定されていない場合、ページの %OnSubmit メソッドが代わりに呼び出されます。この手順を確認するには、“フォームの送信処理” を参照してください。 このコールバックは、データ型が %StatusOpens in a new tab である値を返す必要があります。以下に、このコールバックの有効なシグニチャを示します。 ClassMethod SubmitForm(pSubmit As %ZEN.Submit) As %Status コールバックとして上のメソッドを使用するには、<form> または <dynaForm> で OnSubmitForm="SubmitForm" と設定します。 |
onsubmit | このフォームが送信されるときに Zen で呼び出すクライアント側 JavaScript 式。通常、この式は、ブーリアン値を返すクライアント側 JavaScript メソッドを呼び出します。このメソッドを呼び出すことにより、Zen ではクライアント側でフォーム内の値を検証できます。このメソッドが False を返すと、送信操作の保留操作は発生しません。HTML の onsubmit イベントとは異なり、この onsubmit コールバックは、フォームを送信するたびに必ず呼び出されます。 |
onvalidate | このフォームの validate メソッドが呼び出されるときに Zen で呼び出すクライアント側 JavaScript 式。通常、この式は、検証を実行するクライアント側 JavaScript メソッドを呼び出します。 |
readOnlyMessage |
ユーザが読み取り専用データ・モデルに結合されたフォームを保存しようとすると、フォーム検証メソッドにより警告ボックスに表示されるメッセージ・テキスト。既定の readOnlyMessage テキストは、以下のとおりです。 This data is read only. この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。“Zen 属性のデータ型” を参照してください。 |
OnLoadForm メソッドは、最初に開いたときにフォームに表示される値を取得します。これは、モデル ID がフォームの key 属性で指定されるオブジェクトから値を取得することも、リテラル値を割り当てることもできます。またこのメソッドでは、それらの値を入力配列に配置する必要があります (配列は、フォームの対応するコントロールの name 属性が添え字になります)。コントロールと値を関連付ける属性は、この name であって、id ではありません。Zen は、初めてフォームを描画するときに、このメソッドを呼び出して、自動的に以下のパラメータを渡します。
-
%StringOpens in a new tab — フォームの key 値。
-
参照渡しの %StringOpens in a new tab の配列。
このコールバックは、データ型が %StatusOpens in a new tab である値を返す必要があります。以下の例は、有効なメソッド・シグニチャとパラメータの使用法を示しています。
Method LoadForm(pKey As %String,
ByRef pValues As %String) As %Status
{
Set emp = ##class(ZENDemo.Data.Employee).%OpenId(pKey)
If ($IsObject(emp)) {
Set pValues("ID") = emp.%Id()
Set pValues("Name") = emp.Name
Set pValues("SSN") = emp.SSN
}
Quit $$$OK
}
コールバックとして上のメソッドを使用するには、<form> または <dynaForm> で OnLoadForm="LoadForm" と設定します。
フォームの値の指定
初期状態のフォームでは、すべてのフィールドを空白のまま表示できるほか、いくつかのフィールドにデータが入力された状態にしておくこともできます。ユーザに対して表示するフィールドにデータを指定するには、Zen でフォームを表示する前に、そのフィールドに関連付けた Zen コントロール・コンポーネントの value プロパティを設定しておきます。それには以下のような方法があります。
-
XData ontents に各コントロールを追加する際に value 属性を設定します。
<text value="hello"/>
-
XData Contents にフォームを追加する際に onLoadForm 属性を設定します。
<form id="MyForm" OnLoadForm="LoadForm">
-
ページの %OnAfterCreatePage メソッドの value プロパティを設定します。
Do ..%SetValueById("Doctor",$G(^formTest("Doctor")))
-
クライアント側で、各コントロールの setValue メソッドを呼び出します。
ユーザがフォームの編集を開始すると、任意のコントロールの初期値を変更できます。
フォームの変更の検出
Zen フォーム・コンポーネントは、フォーム上のいずれかのコントロールで変更が発生したかどうかを追跡します。%ZEN.Component.formOpens in a new tab および %ZEN.Component.controlOpens in a new tab にはそれぞれ、プログラムによってこれを判定する isModified というクライアント側メソッドがあります。
コントロールの isModified メソッドは、コントロールの現在の論理値 (value プロパティ) が元の論理値 (originalValue プロパティ) と異なる場合、True を返します。送信操作を繰り返すたびに、各コントロールの originalValue はその前の value を取得するので、フォームの現在の状態に関してはこの返り値は必ず最新となります。
フォームの isModified メソッドを呼び出すと、このメソッドにより、フォームの各コントロールの isModified が呼び出されます。いずれかのコントロールが True を返すと、isModified はそのフォームについて True を返します。
<textarea> コントロールは、そこに記述されている文字が 50 文字未満である場合に、正確な isModified のステータスを返します。<textarea> の値が 50 文字以上である場合、このコントロールでは isModified のステータスを計算しません。
フォームの検証
各 Zen フォームには、フォームの各コントロールの値の検証を目的とする validate メソッドがあります。フォームの autoValidate プロパティが True の場合、そのフォームが送信されるたびに validate が自動的に呼び出されます。それ以外の場合は、アプリケーションで明示的に validate を呼び出すことができます。validate は以下を実行します。
-
フォーム固有の onvalidate イベント・ハンドラを定義しておくと、まずこのイベント・ハンドラが呼び出されます。このイベントから False が返された場合、このフォームは無効と判断され、それ以上の検証は行われません。
-
フォームにあるすべてのコントロールの invalid プロパティを False にリセットした後、各コントロールの validationHandler メソッドを呼び出して、そのコントロールをテストします。その結果を受けて、このメソッドは以下を実行します。
-
コントロールの readOnly プロパティまたは disabled プロパティが True の場合は、True を返します。
-
コントロールの required プロパティが True で、このコントロールが値を持たない (値が "") 場合は、False を返します。
-
コントロールで onvalidate イベントを定義しておくと、そのイベントが実行され、値が返されます。それ以外の場合、コントロールの isValid メソッドが呼び出されます。isValid メソッドは、組み込みの検証機能の提供を目的とするサブクラスでオーバーライドできます (dateText コントロールなど)。
-
-
validate メソッドによる各コントロールの検証が進むに従って、このフォームにより、無効なコントロールのローカル配列が構築されます。
-
validate メソッドによるコントロールの検証が完了し、フォームが有効だった場合は True が返されます。
-
無効な値を持つ 1 つ以上のコントロールがフォームに存在する場合、そのフォームは無効です。このケースに対処するために、validate は以下の追加手順のいずれかを実行します。
-
フォームで oninvalid イベント・ハンドラが定義されている場合は、以下のとおりです。
そのハンドラを実行します。これによってフォームでエラーの状況を処理できます。その後、oninvalid イベントからの返り値が、フォームの validate メソッドから返されます。 oninvalid ハンドラには、無効なコントロールのリストが記述された JavaScript 配列を受け取る invalidList という引数があります。 以下はその例です。
<form oninvalid="return zenPage.formInvalid(zenThis,invalidList);" />
この formInvalid メソッドは以下のようになります。
ClientMethod formInvalid(form,list) [ Language = javascript ] { return false; }
-
フォームに oninvalid イベント・ハンドラがない場合は、以下のとおりです。
validate により、無効な各コントロールの invalid プロパティが True に設定され、そのコントロールのスタイルが zenInvalid に変更されます。次に、最初の無効なコントロールにフォーカスが移り、警告ボックスにエラー・メッセージが表示されます。警告ボックスに表示されるメッセージは、フォームの invalidMessage プロパティと、無効な各コントロールの getInvalidReason メソッドから返された値を組み合わせて生成されます。
-
NULL 値に対しては検証ロジックを呼び出さないのが標準的なやり方です。
エラーと無効な値
フォームの送信中にエラーが発生した場合、またはフォームの検証に失敗した場合、Zen ではそのフォームを持つページを再表示します。これにより、ユーザは、誤った値を入力し直し、そのページを再度送信できます。Zen ページに <form> コンポーネントまたは <dynaForm> コンポーネントを追加すると、これらすべてを極めて容易に設定できます。
SAMPLES ネームスペースのクラス ZENTest.FormTestOpens in a new tab を使用すると、Zen フォームでのエラー処理を次のように体験できます。
-
ブラウザを起動します。
-
次の URI を入力します。
http://localhost:57772/csp/samples/ZENTest.FormTest.clsOpens in a new tab
ここで、57772 は、Caché に割り当てた Web サーバのポート番号です。
-
[名前] フィールドが空白であることを確認します。
-
[状態] チェック・ボックスのチェックを外します。
-
[実行] をクリックします。
-
フォームの validate メソッドにより無効なフィールドが検出され、そのフィールドがピンク色でハイライト表示されます。
-
以下の警告メッセージがブラウザに表示されます。
このメッセージを生成するために、フォームには以下のテキストの断片がまとめられています。Zen には、これらのアイテムの既定値が用意されているので、特に何か実行しなくても、既定のメッセージが表示されます。ただし、必要に応じて、メッセージを希望に合わせてカスタマイズできます。
-
メッセージは、フォームの invalidMessage テキストから始まります。
-
required 属性が True に設定されていて、エントリを持たないコントロールごとに、コントロールの label に続いて、requiredMessage テキストがメッセージに表示されます。
-
無効な値を持つコントロールごとに、コントロールの label に続いて、invalidMessage テキストがメッセージに表示されます。
-
-
[OK] をクリックし、警告メッセージ・ボックスを閉じます。
-
無効なコントロールは、ユーザがそのコントロールを編集し、フォームを再送信するまで、ハイライト表示されたままになります。
フォームの送信処理
フォームの内容を送信する要求は、次の 2 つのうちいずれかの方法でトリガできます。
-
ユーザがフォーム内の “<submit>” ボタンをクリックします。
-
アプリケーションが、以下のユーザ・イベントに応答してフォーム・オブジェクトの submit メソッドを呼び出します。
%form.submit
フォームを送信すると、そのフォーム内のコントロールの値がサーバに送信され、そのフォームを持つページの %OnSubmit コールバック・メソッドが呼び出されます。ここで呼び出される %OnSubmit コールバック・メソッドは、フォームそのものやフォームにあるコンポーネントのものではなく、フォームを持つページのものです。
%OnSubmit は、送信されたすべての値を含む特別な %ZEN.SubmitOpens in a new tab オブジェクトのインスタンスを受信します。送信処理中は、ページ・オブジェクトは使用できなくなることに注意してください。Zen では、サーバ・コールバックの呼び出しやエラー処理など、送信操作の詳細をすべて自動的に処理します。すべてのフォームは、HTTP POST 送信メソッドを使用して送信されます。
設定 ENCODED=2 を使用すると、<form> コンポーネントが無効となります。それは、ENCODED=2 になっていると、暗号化されていないパラメータがすべて URL から削除されるためです。
以下のテーブルは、Zen で送信操作がどのように実行されているかを詳しく説明するために、内部イベントをユーザの観点、ブラウザベースの実行、およびサーバ側の実行の順に示したものです。通信の詳細部分のほとんどは、CSP テクノロジを基盤とする Zen が処理します。背景情報は、"Zen の使用法" の “Zen のクライアントおよびサーバ” の章を参照してください。
ユーザの観点 | ブラウザ | サーバ | |
---|---|---|---|
1 | ユーザがボタンをクリックして、フォームの送信を開始します。 | ||
2 | HTTP POST メカニズムによりコントロールの値がサーバに送信されます。 | ||
3 | クライアントからのデータを非シリアル化します。 | ||
4 | 新しいコントロール値に基づいて DOM を再構築します。 | ||
5 | ページのサーバ側コードを実行します。 | ||
6 | サーバ側 DOM を更新します。 | ||
7 | 新しい HTML ページを生成します。 | ||
8 | HTTP POST への応答として、新しい HTML ページを送信します。 | ||
9 | HTTP POST に応答して受信した HTML を表示します。 | ||
10 | サーバでの変更を反映して、クライアント側 DOM を更新します。 | ||
11 | ユーザに新しいページが表示されます。 |
ユーザ・ログインのフォーム
アプリケーション・ログイン・ページは、Zen フォームの特殊なケースです。アプリケーションのログイン・ページとログアウト・ページを作成するには、"Zen アプリケーションの開発" の “Zen のセキュリティ” の章の “アプリケーションへのアクセスの制御” のセクションを参照してください。
動的なフォーム
<dynaForm> は、Zen ページのグループ (複数可) にコントロール・コンポーネントを動的に挿入する、特殊なタイプのフォームです。レイアウトは自動的に、<dynaForm> 内部のコードによって決まります。コントロールのリストは、関連付けられたデータ・コントローラのプロパティ、またはコントロールのリストを生成するコールバック・メソッドによって指定できます。
<dynaForm> には以下の属性があります。
属性 | 説明 |
---|---|
フォーム・コンポーネントの属性 | <dynaForm> は、あらゆる Zen フォームと同じ汎用属性を持ちます。詳細は、“フォームの定義” を参照してください。フォームの汎用属性には、データ・コントローラの使用に必要な controllerId 属性や onnotifyView 属性があります。 |
controllerId |
このフォームをデータ・コントローラに関連付けている場合、controllerId 属性は、このフォームのデータを指定する <dataController> コンポーネントを表します。controllerId の値は、この <dataController> の id 値と一致している必要があります。 データ・コントローラを使用する <dynaForm> の作成の詳細は、“モデル・ビュー・コントローラ” の章を参照してください。 |
defaultGroupId | この <dynaForm> で生成したコントロールの配置先とするグループの id。これで、レイアウトの制御が可能になります。<dynaForm> 内のいずれかの場所で、defaultGroupId と一致する id を持つグループ・コンポーネント (<vgroup>、<hgroup> など) を指定する必要があります。defaultGroupId を指定していない場合、コントロールはグループに収められず、<dynaForm> に直接追加されます。 |
injectControls |
既定では、<dynaForm> に手動で挿入されたコントロールの後 (つまり、下または右) に、自動的に挿入されたコントロールが配置されます。 自動的に挿入されたコントロールを手動で挿入されたコントロールの前 (つまり上または左) に配置したい場合は、以下の例のように injectControls 属性を "before" に設定します。このコードにより、データ・コントローラで指定されたコントロールが、手動で挿入された [保存] ボタンの "前" に配置されます。 injectControls に指定可能な値は、"before" と "after" です。既定は "after" です。 |
OnGetPropertyInfo |
Zen ページ・クラスのサーバ側コールバック・メソッドの名前。このメソッドは、フォームが表示されたときに挿入する追加コントロールを準備します。Zen は、初めてフォームを描画するときに、このメソッドを呼び出します。このテーブルの後に示す説明を参照してください。 |
onnotifyView |
フォームの onnotifyView イベント・ハンドラ。この属性は、フォームがデータ・コントローラに関連付けられている場合に適用されます。このフォームに接続されたデータ・コントローラがイベントを発生するたびに、Zen によってこのハンドラが呼び出されます。“Zen コンポーネントのイベント・ハンドラ” を参照してください。データ・コントローラを使用する <dynaForm> の作成の詳細は、“モデル・ビュー・コントローラ” の章を参照してください。 |
OnGetPropertyInfo 属性で指定されたコールバック・メソッドは、フォームが表示されたときに挿入する追加コントロールを準備します。ページ・クラスでこのメソッドが定義されている場合、Zen は、初めてフォームを描画するときに、このメソッドを呼び出して自動的に以下のパラメータを渡します。
-
%IntegerOpens in a new tab — 生成されたフォームにコントロールを適用する、次のインデックス番号。コールバック・メソッドはフォームに追加コントロールを挿入するごとに、次の例に示すように、このインデックス値をインクリメントする必要があります。
-
参照渡しの %StringOpens in a new tab の配列。
-
%StringOpens in a new tab — 現在のデータ・モデル ID (動的フォームのコンテンツが、データ・モデル・オブジェクトのインスタンスごとに異なる場合)。メソッドは、このオブジェクトから値を取得することも、リテラル値を割り当てることもできます。
追加コントロールを定義するには、以下のように、メソッドで 2 つの部分の添え字を使用して、値を入力配列に配置する必要があります。
-
最初の添え字は、フォームの対応するコントロールに割り当てられた name 属性の値です。コントロールを識別し、コントロールと値を関連付ける属性は、この name であって、id ではありません。例えば、以下の配列の位置には、フォームのコントロールの位置の順序を表すインデックス (先頭インデックスは 1) を格納します。
pInfo(name)
-
2 番目の添え字は、コントロール・オブジェクトのプロパティの名前です。%type は、その値でコントロールの種類を識別するコントロール・プロパティです。他のプロパティの名前は、“Zen コントロール” の章の、“コントロールの属性” のセクションまたは当該のコントロールのトピックに一覧があります。例えば、以下の配列の位置には name コントロールの attr 属性の値を格納します。
pInfo(name,attr)
このコールバックは、データ型が %StatusOpens in a new tab である値を返す必要があります。以下の例は、有効なメソッド・シグニチャおよび、パラメータと配列の添え字の使用法を示しています。
Method GetInfo(pIndex As %Integer,
ByRef pInfo As %String,
pModelId As %String) As %Status
{
Set pInfo("Field1") = pIndex
Set pInfo("Field1","%type") = "textarea"
Set pInfo("Field2") = pIndex + 1
Set pInfo("Field2","label") = "Field 2"
Quit $$$OK
}
コールバックとして上のメソッドを使用するには、<dynaForm> で OnGetPropertyInfo="GetInfo" と設定します。
生成したフォームの最後のコントロールが n 個のフィールドを持つ埋め込みプロパティから取得された場合、コールバックはインデックスをコントロールに割り当てる前に、メソッドの開始時に n をインデックス番号に加算して、過去に生成されたコントロールをインクリメントする必要があります。この規則は、フォームに最後に生成されたコントロールが %StringOpens in a new tab、%BooleanOpens in a new tab、%NumericOpens in a new tab などの単純なデータ型から取得された場合は不要です。前の例は単純なケースを示しており、メソッドは提供されたインデックスを使用し、インクリメントしています。