マクロ

マクロ

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>