マクロ

マクロ

Platform 4.2+ が必要

マクロでのパラメータの使用

マクロを使用すると、Nexaweb Platform によりメモリにロードされて随時実行される有効なNexaweb ページの命令(XModify、MCO、データなど) のグループに名前を関連付けることができます。

Nexaweb 4.2.x では、java.text.MessageFormat シンタックス(Nexaweb Java アプリケーション向け) を使用して、ロジックを実行するマクロでパラメータを指定できるので、マクロで引数を受け取ることができます。MessageFormat シンタックスでは、引数の引き渡し先と引数のフォーマット(カンマ区切りやドル記号などを含む数値フォーマットなど) を指定できます。マクロでパラメータを使用すると、各マクロを再利用してさまざまなコンポーネントを操作できるので、各マクロの柔軟性が向上します。たとえば、2 つの別なウィンドウを閉じる場合に、パラメータを使用せずに2 つのマクロを個別に記述して閉じることもできますが、パラメータを使用すると1 つのマクロ記述で閉じることができます。

クライアントサイドのロジックの開発にマクロを使用すると、次のような利点があります。

  • クライアントUI の開発に使用するものと同じXML ベースのツールを使用できます。
  • サーバーへの往復伝搬が必要ありません。Nexaweb クライアント環境へのポータビリティがあります。
  • 将来の

次の例では、パラメータを使用しないマクロの使用方法を示します。

マクロ:

 

<modifications document="ui">
<remove select="id(‘‘MyWindow’’)">
</modifications>

 

このマクロの呼び出し:
onCommand=”macro:mymacro.execute()"

次の例では、パラメータを使用するマクロの使用方法を示します。
マクロ:

<xm:modifications xmlns:xm="http://openxal.com/core/xmodify">
<remove select="id(''{0}'')">
< /xm:modifications>


このマクロの呼び出し:
onCommand=”macro:mymacro.execute (‘Window1’)

マクロの定義の概要

次に、マクロの定義の基本フォーマットを示します。
<macro xmlns:macro="http://openxal.org/core/macro">
name = name-attribute-type
(パラメータに置き換わるとNexaweb ページ要素になる、任意の有効なNexaweb 要素または文字列)
< /macro>

name-attribute-typeには、このマクロを一意に識別する名前を指定します。
マクロを定義する際は、次の点に注意してください。

  • マクロ名は、一意である必要があります。新しいマクロを既存のマクロと同じ名前で作成すると、新しいマクロによって古いマクロが上書きされます。では、マクロに含まれるNexaweb ページの命令はすべて文字列に変換され、java.text.message フォーマットを使用してフォーマット設定されるので、マクロ内のNexaweb ページの命令は、java.text.message フォーマットシンタックスに準拠している必要があります。たとえば、java.text.message フォーマットシンタックスに準拠するには、Nexaweb ページの命令の一重引用符や中かっこをエスケープする必要があります。
  • Nexaweb

パラメータを使用しないマクロのXModify コマンドの定義

次の例では、XModify コマンドを使用するマクロを含むページを示します。このマクロでは、パラメータは使用しません。

この例では、ページに、mymacroというマクロが含まれています。このマクロの本文には、XModify コマンド(set-attribute) が1 つだけ含まれており、ラベル("mylabel") のテキストを変更します。ユーザーがボタン"Execute Macro" を押すと、このマクロが実行されて、ラベルの名前がOld Text からNew Text に変更されます。

 

<xal xmlns="http://openxal.org/ui">
<macro:macro name="mymacro" xmlns:macro="http://openxal.org/core/macro">
<xm:modifications xmlns:xm="http://openxal.com/core/xmodify">
<xm:set-attribute select="id(''mylabel'')">
<xm:attribute name="text" value="New Text" />
</xm:set-attribute>
</xm:modifications>
</macro:macro>

<horizontalFlowPane align="center">
<label text="Old Text" id="mylabel" backgroundColor="green"/>
<button text="Execute Macro" onCommand="macro:mymacro.execute()"/>
</horizontalFlowPane>
</xal>

 

パラメータを使用するマクロのXModify コマンドの定義

次の例では、同じマクロのパラメータを使用する場合と使用しない場合を示します。

<xal xmlns="http://openxal.org/ui">
<macro:macro name="mydialog" xmlns:macro="http://openxal.org/core/macro">
<xm:modifications xmlns:xm=http://openxal.com/core/xmodify>
<xm:append select="/xal/rootPane">
<dialog title="My Dialog" closeable="false" focused="true" centered="true">
<label text="My dialog is your dialog, from California, to the New York islands"/>
</dialog>
</xm:append>
</xm:modifications>
</macro:macro>
<macro:macro name="generic-dialog" xmlns:macro="http://openxal.org/core/macro">
<xm:modifications document="ui" xmlns:xm="http://openxal.com/core/xmodify">
<xm:append select="/xal/rootPane">
<dialog title="{0}" closeable="{1}" focused="{2}" centered="{3}">
<label text="{4}"/>
</dialog>
</xm:append>
</xm:modifications>
</macro:macro>
</xal>


次に、パラメータを使用するマクロへのマクロ呼び出しを示します。

<macro:macroCall name="generic-dialog" xmlns:macro="http://openxal.org/core/macro">
<macro:parameter>ThisIt</macro:parameter>
<macro:parameter>true</macro:parameter>
<macro:parameter>true</macro:parameter>
<macro:parameter>false</macro:parameter>
<macro:parameter>Answer</macro:parameter>
< /macro:macroCall>

次に、パラメータを使用するマクロへのイベントハンドラ呼び出しを示します。
<button onCommand="macro:generic-dialog.execute( 'ThisIt', 'true', 'true', 'false', 'Answer' )" />

マクロ内のパラメータの指定

java.text.MessageFormatを使用して、属性値に対するNexaweb 命令のマクロパラメータを指定します(Java MessageFormat シンタックスの詳細については、http://java.sun.com/j2se/1.4.2/docs/api/ を参照してください)。

メモ: JVM (Java 仮想マシン) 1.4 またはそれ以前のバージョンでは、マクロで使用できるプレースホルダの数に制限があります。それより後のJVM では、プレースホルダを無制限に指定できます。この制限の詳細については、java.sun.com を参照してください。

MessageFormat シンタックスでは、一重引用符( ' ) 文字は特殊文字であり、
MessageFormat で無視される文字列リテラルの指定に使用します。したがって、このフォーマットでは、一重引用符を使用する場合、代わりに一重引用符を2 つ( '' ) 使用する必要があります。

メモ: 一重引用符 ' を2 つ使う必要があります。二重引用符 " では機能しません。
そのため、マクロで使用しないNexaweb 命令は、次の例の最初の文字列のようになりますが、マクロで使用するNexaweb の同じ命令は、この例の2 番目の文字列のようになります。

id('mywindow')
id(''mywindow'')

マクロ呼び出しまたはイベントハンドラ呼び出しで、Nexaweb 命令の実行時に、パラメータを置き換える実際の値を指定します。

マクロでは、次の2 つのタイプのパラメータを指定できます。

  • リテラルとして指定する静的な値。XPath 文として指定する動的な値。
  • ドキュメントに対して

イベントハンドラ内のパラメータの指定

<button onCommand="macro:generic-dialog( {id('myDialogTitleField')/@text}, 'true', 'true', 'false', {MyDataDocument:id('myTextField')/@text} )" />

プログラム的なマクロの定義と呼び出し

次の例では、プログラム的なマクロの定義を示します。

MacroContainer macroContainer = ClientSession.getMacroContainer();
Macro macro = macroContainer.createMacro
("<xm:modifications xmlns:xm=http://openxal.com/core/xmodify"> +
" <xm:append select=\"/xal/rootPane[1]\">" +
" <dialog>" +
" <label text=\"Call me Ishmael. Some years ago- never mind how long precisely...\" />" +
" </dialog>" +
" </xm:append>" +
"</xm:modifications>" );
macroContainer.putMacro("nexaweb-examples-herman-melville-dialog", macro);

次の例では、プログラム的なマクロ呼び出しを示します。

 

MacroContainer macroContainer = clientSession.getMacroContainer();
Macro melvilleMacro = macroContainer.getMacro( "nexaweb-examples-herman-melville-dialog" );
melvilleMacro.execute();

Macro genericXModifyMacro = macroContainer.getMacro( "nexaweb-examples-generic-xmodify" );
genericXModifyMacro.execute( new Object [] { "remove-element", "id('anElementId')", "" } );
genericXModifyMacro.execute( new Object [] { "append", "/xal/rootPane[1]", "<dialog><label text=\"Mylabel\"/></dialog>" } );

 

マクロのデバッグとトラブルシューティング

マクロをデバッグするには、アプリケーションのクライアントコンフィギュレーションファイル(nexaweb-client.xml) で、次のようにマクロのデバッグログを有効にします。

<log-configuration>
<log name="Macro" log-level="debug"/>
< /log-configuration>