6 July 2009
ページ ツール |
初級
(※1)このZIPファイルを解凍すると、以下のフォルダが生成されます。
[lab]フォルダ :このチュートリアルで使用するファイルが格納されています。
[solution]フォルダ:このチュートリアルの完成例です(ただし、実際の完成例よりも若干作り込んでいます)。
本稿は、LiveCycle ESにおけるフォーム開発環境であるLiveCycle Designer ES(以下、Designer)を使用して、ユーザー操作などによってフォームレイアウトが変化するダイナミックフォームを作成するための基礎と要点をチュートリアル形式で紹介します。
繰り返しになりますが、LiveCycle ES サーバーのプロセスで使用するインタラクティブなダイナミックフォームを作成することを目的としています。しかし、LiveCycle サーバープロセスで使用しない、純粋にメールで送受信されるだけのフォームを作る方にとっても役立つ内容です。
Designerのファーストステップとしては様々な要素がありますが、この手のツールの話でよくある一つ一つの描画ツールの意味や基本操作といったところは省きます(※0)。今後 Designer でフォームを開発するにあたり、「肝」となる以下の3点にフォーカスしてご紹介します。
(※0)その他の項目に関しては、Designerのヘルプ(特にチュートリアル)や、各種ドキュメント、トレーニングなどをご活用ください。
まず、Designer で作成できるフォームの種類を紹介します。
Designerで作成できるフォームは、その動作やレイアウトの変化に関する事項で以下の表の4つの要素で分類されます。表1の列はフォームのインタラクティブ性を表し、行はフォームのレイアウトが動的に変化するか否かを表します。
表1 Designer で作成できるフォームの分類
| インタラクティブなフォーム | 非インタラクティブなフォーム | |
|---|---|---|
| スタティックなフォーム | オンラインの応募書類 | ダウンロードして、印刷後記入してから郵送する紙の口座開設申込書など |
| ダイナミックなフォーム | 行が追加可能な表をもつ発注書など | 差し込み印刷する発送ラベルや送付状など |
以下、表の列と行の説明です。
このチュートリアルでは、「インタラクティブでダイナミックなフォーム」を作成します。
次に、フォームファイルの種類について紹介します。作成したフォームを保存する場合、フォームの動作や用途に合わせて以下のいずれかの形式で保存します。(※2)
(※2)一度保存したファイルでも、Designer で違うファイル形式に保存し直すことができます。
簡単に Designer のユーザーインターフェースについて説明します。Designer をインストールされている場合は、実際に起動してください。
中央付近の編集領域を「レイアウトエディタ」、左右に見えるのが「パレット」です。デフォルトでは、表示されていないパレットもありますが、メニューの[ウィンドウ]で、開くパレットを指定することができます。
また、上部と下部に見える「小さな矢印」が付いた部分は、マウスで広げたり閉じたりできます。
新規にフォームオブジェクトを配置する場合は、右側の「オブジェクトライブラリ」パレットから「レイアウトエディタ」へドラック&ドロップします。そして、必要に応じて、右下の「オブジェクト」パレットなどでそのプロパティを変更します。
いくつかフォームオブジェクトを配置した状態で、画面左側の「階層」パレットに注目します。
フォームに配置したオブジェクトが階層構造で表現されています。これは、フォームオブジェクトの親子関係(ネストの状態)と、フォームオブジェクトが手前に見えるか背面に見えるかという前後関係を示します。(※3)
また、それぞれの要素に付いている名前に注目してください。インスタンス名のようなものですが、普通に「名前」と呼びます。デフォルトの名前は「テキスト フィールド」のようにフォームオブジェクトを指す名前が自動的に付与されます。また、それぞれの要素で [F2]を押下するか、名前部分をクリックすることで変更できます。
(※3)LiveCycle のフォームは、XFA(XML Form Architecture)と呼ばれる DOM の仕様に則っています。XFA の詳細に関しては、以下をご参照ください。
フォームデザインは、オブジェクトライブラリから直接レイアウトエディタにドラック&ドロップして配置する、といった方法もありますが、次に説明する「フォームのデータ構造を元にしてフォームデザインを行う」ことも可能です。ここでは、XMLスキーマ(W3C XML Schema)をベースにして、フォームデザインを行う方法をご紹介します。
フォームに外部のデータソースのデータを取り込んで表示したり、あるいは、その逆で、フォームのデータを外部に送信したりすることがあるかと思います。というより、電子フォームを作る目的を考慮すると、多くの場合そのようなことを行うはずです。とりわけ、LiveCycleプロセスでフォームを使用する場合には、その処理で使用するデータをフォームから取得したり、あるいは、処理したデータをフォームに挿入する(※4)といったようなことが必要になります。
そのような目的で使用するデータソースとフォームを関連付けすることを「データ接続」といいます。
LiveCycle Designerでは、XMLスキーマ(W3C XML Schema)、OLEDBデータベース、サンプルXMLデータ、WSDLファイルの4種類のデータソースとのデータ接続が可能になっています。
(※4) LiveCycle では、「データをフォームにマージする」といいます。
データ接続をしてから、そのデータソースの要素と個々のフォームオブジェクトに関連付けすることを「データ連結」といいます。
得られる結果は同じですが、データ連結を行う方法は2つあります。今回は、後者の方法で行います。
今回はW3C XML Schemaを読み込んで、それを元にしてフォームデザインを行います。
W3C XML Schema におけるデータ接続の意味合いは、表示するデータそのものを読み込むということではなく、フォームに保持するデータ構造を決定する、ということです。これにより、前述のように、LiveCycleプロセスでフォームを使用する場合、その処理で使用するデータをフォームから取得したり、あるいは、処理したデータをフォームに挿入するといったことができるようになります。
まず、予めW3C XML Schema でフォームのデータ構造を定義しておきます(※5)。ここでは、W3C XML Schema と LiveCycleとの関係の解説は行いませんが、W3C XML Schema の規約に則り作成しておけば、Designer でデータ接続を行った際、スキーマの構造の解析を自動的に行い、要素や属性も一部のフォームオブジェクトに自動的に反映してくれるものもあります。自動的に認識しない要素や属性の値は、Designer 側で手作業によりプロパティを設定する必要があります。
(※5)XML にはなじんでいる方は多いと思いますが、XML スキーマにはなじみがない方もいらっしゃると思います。XMLデータをXML スキーマに変換するツールや、XML スキーマ の作成を支援するXML エディタがあるようですので、そちらを利用するのもよろしいかと思います。また、以下のページで、作成したフォームからXML Schemaを生成する裏技を紹介しておりますのでご参考ください(ただし、完全なXMLスキーマにはならないようです)。
ブログ LiveCycle Doc Team・How to generate an XML schema for an existing form
「データ表示」パレットの右側の小さなボタンをクリックし、表示されるメニューから[新規データ接続...]を選択します。
表2 「新規データ接続」ダイアログの設定
| 設定項目名 | 設定値 | 説明 |
|---|---|---|
| 新規データ接続の名前: | 「DataConnection」と入力(デフォルトのまま) | 任意の名前をつけることができます。 |
| データ記述の取得先: | [XML スキーマ]を選択 | データ接続するデータの形式を選択します。 |
(※6)サイズ変更に関しては、以下のヘルプを参照ください。
[LiveCycle Designer ESの使用] – [オブジェクトの使用] –[オブジェクトのサイズと調整]
[LiveCycle Designer ESの使用] – [オブジェクトの使用] –[キャプションの形式設定]
以上の操作で、データ接続したデータソースの要素とフィールドオブジェクトとのデータ連結が済んだ状態になります。
「データ表示」パレットを確認してください。データ要素名の隣にアイコンがついているものと、そうでないものがあります。アイコンがついているものが、フィールドオブジェクトと連結されているという意味です。
また、データ連結されている様子は、パレットからも確認できます。
データ連結されているフィールドオブジェクトを選択して、画面右下「オブジェクト/連結」パレットを確認します。「デフォルトの連結(開く、保存、送信):」が、データ連結の設定にあたります。
また、「デフォルトの連結(開く、保存、送信):」の隣の小さなボタンをクリックすると、データ連結を変更することができます。
それでは、フォームのできばえをプレビューして確認してみましょう。そのままプレビューしてもよいのですが、今回は、予め用意しておいたテスト用のXMLデータをマージして表示してみます。
テスト用のデータをマージして、プレビューしました。今回のテスト用のデータは、予め用意しておいたものを使用しましたが、「フォームのプロパティ」ダイアログ ー [プレビュー]タブの[プレビューデータの生成]をクリックすると、テスト用のXMLデータを自動生成することもできます。
(※7)テキストフィールドオブジェクト「郵便番号」、「電話番号」、「FAX番号」で期待されない表示なっています。これは、フィールドオブジェクトの種類とテキストフィールドオブジェクトの表示パターン設定によるものです。この点に関しては、今回の説明では省略します。詳細は、以下のヘルプを参照ください。
[LiveCycle Designer ES の使用]― [オブジェクトの使用]―[フィールド値の形式設定]
[LiveCycle Designer ES の使用]―[オブジェクトの使用]―[オブジェクトについて]―[オブジェクトのカテゴリ]
JavaScript でフォームにロジックを加えていきます。フォームに記述するスクリプトのことを「フォームスクリプト」といいます。
Designer で使用できるスクリプト言語は、以下の2種類です。それぞれに特徴があり、目的に合わせて使い分けることができます。
今回は、JavaScriptによる記述で行います。
フォームスクリプトを記述する場所であるスクリプトエディタを紹介します。
前述しましたが、スクリプトエディタは画面上部に位置します。フォームスクリプトを指定したいフォームオブジェクトを選択すると、記述ができるようになります。スクリプトエディタ上部の選択項目について、以下に説明します。
表3 スクリプトエディタ上部の設定
| 項目名 | 説明 |
|---|---|
| 表示: | イベント名を選択します。選択すると、スクリプトエディタ編集領域にイベントが追加され、そのイベントに対応したスクリプトを記述することができます。なお、一つのフォームオブジェクトに対して、複数のイベントを追加することができます。 |
| 言語: | FormCalc または JavaScript で記述するかを設定します。 |
| 実行場所: | フォームスクリプトの実行場所を指定します。通常はクライアント側のAdobe Reader などで実行することになりますので[クライアント]となります。LiveCycle ES サーバー上で実行する必要もある場合は、[サーバ]または[クライアント/サーバ]を選択します。 |
フォーム中の「発送先と同じ」チェックボックスをチェックすると、「発注元」に入力した文字列がそのまま「配送先」にコピーされる、という処理を入れてみましょう。
| 設定項目 | 値 |
|---|---|
| 表示: | [click] を選択 |
| 言語: | [JavaScript] を選択 |
| 実行場所: | [クライアント]を選択 |
if(this.rawValue){
deliverTo.companyName.rawValue = orderdBy.companyName.rawValue;
deliverTo.postalCode.rawValue = orderdBy.postalCode.rawValue;
deliverTo.prefectures.rawValue = orderdBy.prefectures.rawValue;
deliverTo.address.rawValue = orderdBy.address.rawValue;
deliverTo.telNo.rawValue = orderdBy.telNo.rawValue;
deliverTo.faxNo.rawValue = orderdBy.faxNo.rawValue;
deliverTo.name.rawValue = orderdBy.name.rawValue;
}else{
deliverTo.companyName.rawValue = "";
deliverTo.postalCode.rawValue = "";
deliverTo.prefectures.rawValue = "";
deliverTo.address.rawValue = "";
deliverTo.telNo.rawValue = "";
deliverTo.faxNo.rawValue = "";
deliverTo.name.rawValue = "";
}
このスクリプトに解説は必要ないでしょう。なぜならば、なじみ深いJavaScriptそのままだからです。このように既知のJavaScriptのスキルで、フォームスクリプトを記述することができます。
次に計算イベントの処理を記述してみましょう。
今回のような発注書や見積書などで、「単価と数量を入力すると小計が計算される」というものと、「小計列の合計値が計算される」というものは、フォームに限らず一般的な表計算でもよく行われる話ですが、これを実装してみたいと思います。
まずは、対象の表(テーブル)を追加し、いくつかの変更を加えておいてから、フォームスクリプトを記述します。
(※8)セルの背景色は、「境界線」パレットの[背景の塗りつぶし]で変更します。フォント関連の設定は、「フォント」パレットで変更します。なお、非表示のパレットを表示するには、メニュー[ウインドウ]から表示したいパレット名を選択します。
| 設定項目 | 値 |
|---|---|
| 表示: | [calculate] を選択 |
| 言語: | [JavaScript] を選択 |
| 実行場所: | [クライアント]を選択 |
this.rawValue = itemPrice.rawValue * quantity.rawValue
| 設定項目 | 値 |
|---|---|
| 表示: | [calculate] を選択 |
| 言語: | [JavaScript] を選択 |
| 実行場所: | [クライアント]を選択 |
var row = xfa.resolveNodes("shipRequest.Main.orders.order[*].subtotal");
var total = 0;
for(var i = 0; i < row.length; i++){
total += row.item(i).rawValue;
}
this.rawValue = total;
ここで注目したいのは、フィールドオブジェクトの「絶対参照」と「相対参照」についてです。
「階層」パレットを見ながら考えてみましょう。
たとえば、上記の図で[sameAsOrderBy]を基準(つまり、スクリプトを記述するところ)とすると、それが thisになります。そこから、[orderBy] 配下の[companyName]を参照すると以下のようになります。
this.orderBy.companeyName
parent キーワードを使用すると、親階層を指定することができます。
xfa.form.shipRequest.Main.orderBy.companyName
先頭が必ず xfa.form となります。そして、「階層」パレットの階層をルートからたどる参照となります。
上記が基本ですが、手順⑲では少し特殊です。
var row = xfa.resolveNodes("shipRequest.orders.order[*].subtotal");
まず、テーブル行のような「繰り返し」のオブジェクトを参照するときは、order[0], order[1], order[2] ・・・のようにインデックス番号を使用してアクセスします([*] は、全ての行の参照になります)。また、JavaScript の場合、このような「繰り返し」オブジェクトを参照する場合は、
shipRequest.Main.orders.order[*].subtotal
のように、単純に参照のみ記述をしてはダメで、
xfa.resolveNodes("shipRequest.Main.orders.order[*].subtotal");
とメソッドを使用して参照する必要があります。
「JavaScriptで、繰り返しのオブジェクトを参照するとき」の特殊ケースとして覚えておいてください。
それでは、ダイナミックフォームに欠かせない要素である 「サブフォーム」 についてご紹介します。
まずは、これまでのチュートリアルで作成してきた発注書フォームから離れて、サブフォームの基本原理への理解を深めるための簡単なサンプルを作りながら進めていきます。
サブフォームは、フォームオブジェクトのまとまりをつくるものです。
サブフォームの作り方は、2つの方法があります。
さて、これからダイナミックフォームにおけるサブフォームの取り扱いに関して、重要な2つのポイントを示します。
サブフォームを選択して、「オブジェクト/サブフォーム」パレットの「コンテンツ:」で設定します。
デフォルトでは、[配置済み]となっており、これは、サブフォーム内に配置したオブジェクトの絶対位置を保つという設定です。
これを[フローレイアウト]に設定することで、サブフォーム中のフォームオブジェクトの増減に合わせて動的にレイアウトが変化します。さらに、サブフォーム中のフォームオブジェクトが配置される方向を「フローの方向」で設定できます。
たとえば、同じ要素名で繰り返されているXMLのような「配列状態のデータ」をサブフォームに連結すると、そのデータの分だけサブフォームは繰り返されます。
それでは、先程のフォームファイルの続きで、フローレイアウトの確認をしてみましょう。
サブフォームに対して、予め用意しておいたXMLデータ(XMLスキーマではありません)を連結してみましょう。
XMLには繰り返し要素が5つありましたが、サブフォームがその分だけ繰り返されます。
手順②でデータ接続したsubFormText.xmlは、<order>要素で「繰り返し」になっています。この「繰り返し要素」を「サブフォームにデータ連結」すると、「繰り返し要素の数だけ、サブフォームを繰り返し」ます。
なお、今回は、単純に上記の原理を確認するだけにしたかったので、XML要素の値をデータ連結し、表示することを行いませんでした。しかし、もちろんこれは可能です。
先の手順で作成した発注書フォームに話を戻します。ユーザーが[行を追加]というボタンをクリックすると行が増えていき、動的にテーブルのレイアウトが変更するようにします。
恐らくこの「ダイナミックレイアウトのテーブルの作成」が、はじめてのフォーム作成で悩みがちなところだと思います。しかし、以下の点を把握すれば大丈夫です。
つまり、前述の考え方をそのままテーブル行に適用しながら進めていけばよいのです。
this.parent.orders.order.instanceManager.addInstance();
(※9)この時点で、Mainサブフォームのサイズを少し変更することで見た目が良くなるかもしれません。
今回のチュートリアルでは、「XMLスキーマベースのフォーム作成」、「JavaScriptによるフォームスクリプト」、「サブフォームの取り扱い」にフォーカスして、LiveCycle ES プロセスで利用するダイナミックフォーム作成の基礎を紹介しました。