サンプルフォームのXFormsコード
OpenOfficeでは、ユーザーがXFormドキュメントを保存すると、XForm内のデータが外部XMLとして保存されます。フォーム要素はBinding 1に基づいて、どのフォームをどこに出力するかを追跡します。下記の例には、送信アクションのWindows固有のファイルURIが含まれています。これはLinuxシステムならfile:///home/user/xforms/example3.xmlとなります。
<xforms:model id="Model 1"> <xforms:instance id="Instance 1"> <instanceData> <AddressPostal>Hello World</AddressPostal> </instanceData> </xforms:instance> <xforms:bind id="Binding 1" nodeset="AddressPostal"/> <xforms:submission id="submitthis" action="file:///c:/xforms/example3.xml" method="put" indent="false" omit-xml-declaration="false" standalone="false" replace="none"/> <xsd:schema/> </xforms:model>
表1に、XFormsの送信オプションを示します。
プロトコル/URIスキーム | 送信オプション |
HTTP | form-data-post |
urlencoded-post | |
multipart-port | |
Post | |
Put | |
Get | |
HTTPS | form-data-post |
urlencoded-post | |
multipart-port | |
Post | |
Put | |
Get | |
FTP | Put |
MailTo | form-data-post |
Post | |
File | Put |
本稿の例では、HTTPサーバを構成しなくてもサンプルXMLを受信できるように、ファイルURIスキームを使用してパスを定義しています。しかし、筆者の経験からすると、ファイルURIスキームはOpenOfficeの実際の運用環境には適しません。なぜなら、ファイルURIスキームでは絶対パスが必要ですし、ファイルが編集用にロックされているときに整然としたエラー処理を行えないからです。
前掲のXFormバインディングを使用するフォーム要素は、リスト1のようになります。リスト1の重要な部分は、form:text
要素のform:id
属性とxforms:bind
属性です。前者はテキストフィールドが格納するフォーム入力の型を判断するために使用する識別子です。後者は、StreetName
というIDを持つxforms:bind
に基づいて、このフォーム要素をXFormsインスタンス内のXML要素にバインドすることを宣言します。
<form:form form:name="Standard" form:apply-filter="true" form:command-type="table" form:control-implementation="ooo:com.sun.star.form.component.Form" office:target-frame="" xlink:href=""> <form:properties> ... form properties relevant to whole form removed for sake of clarity. </form:properties> <form:button form:name="PushButton" form:control-implementation= "ooo:com.sun.star.form.component.CommandButton" form:id="control1" form:label="Button" form:button-type="submit" office:target-frame="" xlink:href="" form:image-data="" form:xforms-submission="submitthis" form:delay-for-repeat="PT0.50S" form:image-position="center"> <form:properties> <form:property form:property-name="DefaultControl" office:value-type="string" office:string-value="com.sun.star.form.control.CommandButton"/> </form:properties> </form:button> <form:text form:name="TextBox" form:control-implementation= "ooo:com.sun.star.form.component.TextField" form:id="control2" form:convert-empty-to-null="true" xforms:bind="Binding 1"> <form:properties> <form:property form:property-name="DefaultControl" office:value-type="string" office:string-value="com.sun.star.form.control.TextField"/> </form:properties> </form:text> </form:form>
最後に、このコードはフォームフィールドの表示を定義したプレゼンテーションマークアップを使用して入力フィールドを描画します。実際のフォーム要素はdrawという名前空間を使用して表現されます。
<text:p text:style-name="Standard"> <draw:control text:anchor-type="paragraph" draw:z-index="0" draw:style-name="gr1" draw:text-style-name="P2" svg:width="2.943cm" svg:height="1.165cm" svg:x="12.217cm" svg:y="4.258cm" draw:control="control1"/> <draw:control text:anchor-type="paragraph" draw:z-index="1" draw:style-name="gr2" draw:text-style-name="P3" svg:width="6.584cm" svg:height="0.763cm" svg:x="4.597cm" svg:y="1.951cm" draw:control="control2"/> </text:p>
コントロールはdraw:control
属性の中で使用されているid
参照によってフォーム入力にバインドされます。OpenOfficeはx座標とy座標による絶対位置を使用してコントロールを描画します。OpenOfficeがドキュメントフローの中にフィールドを自動的に配置してくれると思ってはいけません。明示的な座標が必要です。
さまざまなフォーム要素の関係を理解するには、描画される要素のことをいったん忘れ、フォームコントロールを通じたXForms要素との結び付きに注目するとよいでしょう(図8)。
図8で左から右に見ていくと、描画されるコントロールはdraw:control
属性によってフォーム内の抽象コントロールにバインドされます。例えば、最初のコントロールのdraw:control
属性の値はcontrol1
です。このcontrol1
はフォーム上のボタンのform:id
であることに注目してください。
この関係情報を用いれば、エンドユーザーとしてデザイナを操作しなくても、マークアップを直接書くだけでOpenOffice XFormを作成できます。