Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

カスタム・タグの開発

この章では、カスタム・タグの開発および使用について説明します。項目は以下のとおりです。

CSP では、CSP ファイル内で使用するカスタム HTML タグを開発することができます。CSP マークアップ言語自体が、このカスタム・タグのメカニズムを使用して実装されます。カスタム・タグでは、以下を実行できます。

  • HTML 制作者は、一般的な構文を使用して、高い機能性を得ることができます。

  • Web アプリケーション用の再使用可能なコンポーネントを開発できます。

ルールとアクション

CSP コンパイラはマークアップ HTML ドキュメントを Caché クラスに変換します (“CSP コンパイラ” を参照)。CSP コンパイラの機能の例として、以下のものがあります。

  1. CSP ドキュメントに埋め込まれた #( )# 式を認識します。

  2. HTML/XML ドキュメントにある特定のタグまたはタグの組み合わせを認識し、開発者が指定したアクションに置き換えます。これはタグ・マッチングと呼ばれ、この章で説明します。

XML の XSL テクノロジに精通していれば、CSP とは、アプリケーション用の HTML を生成する機能を追加した XSL であることがわかります。

例えば次の CSP ページには、HTML ページに会社名を表示するカスタム・タグ <my:COMPANY> が記述されています。

<html>
<body>
<my:COMPANY>
</body>
</html>

このページが処理されるときに、<my:COMPANY> タグが適切な HTML テキストに置き換えられるようにする必要があります。以下はその例です。

<html>
<body>
<b>Octoglomerate</b>
</body>
</html>

<my:COMPANY> タグに対して CSP コンパイラで実行するアクションは、<csr:action> タグを持つルール・ファイルで定義します。ルール・ファイルは、.csr (Caché Server Rule) ファイル拡張子を持つ XML ドキュメントで、タグを認識するルールを定義し、これらのタグが見つかったときに実行するアクションを定義します。ルールの説明などの追加情報を指定することもできます。

<my:COMPANY> タグのルール・ファイルは以下のようになり、company.csr という名前が付けられます。

<csr:rule name="myCOMPANY" match="my:COMPANY" empty>
<csr:action>
<b>Octoglomerate</b>
</csr:action>
</csr:rule>

このルール・ファイルは以下を指定します。

<csr:rule> タグを使用して、このファイルは myCOMPANY というルールを定義します。属性 empty は、<my:COMPANY> タグが終了タグを持たないことを指定します。

ルール名をつけるときには、Caché クラスの名付けと同様の制限があります (Caché 名前付けルールの詳細は、"Caché オブジェクトの使用法" の “名前付け規約” および "Caché ObjectScript の使用法" の “構文規則” を参照してください)。各ルールは、それが定義された Caché ネームスペースの範囲でのみ有効です。ただし、% で始まる名前を持つルールは例外で、これらは %SYS ネームスペースで定義し、他のすべてのネームスペースから認識できます。

<csr:action> タグは実行するアクションを指定します。<csr:action> タグの内容は HTML とする必要があり、以下のいずれかになります。

  • #()#

  • ##()##

  • <script> タグ

  • 追加の <csr:> タグ (後述します)。

  • <csr:action> タグの中で CSP タグを使用することはできません。つまり CSP コンパイラでは、アクションの内容に関してはタグが変換されません。

company.csr ルール・ファイルをロードするには、ファイルを /cachesys/csp/user ディレクトリに移動し、ターミナルを使用して Caché セッションを開始し、以下のコマンドを実行します。

 Do $System.CSP.LoadRuleFile("company.csr")

これにより、指定されたファイルのルール定義を、実行中のネームスペースにロードします。スタジオで [ファイル]→[新規作成]→[Caché Server Page] を選択し、ルール・ファイルをロードしてコンパイルすることもできます。このファイルを csp/user ディレクトリに保存します。CSP サンプル内の rulemgr.csp ページにより、どのルールが有効であるかがわかります。

多くの CSP がルール・ファイルを使用して実装されます。スタジオでシステム・ルール・ファイルを、%SYS ネームスペースの [ワークスペース] ウィンドウ→[ネームスペース] タブ→[CSP ファイル] の下に表示できます。

タグ・マッチング — match 属性

タグの属性値は、タグ名の後に角括弧 [ ] で囲んで記述することで指定します。

<csr:rule> タグの match 属性は、CSP コンパイラで何をルールとして認識し、指定されたアクションを実行するかを定義します。match 属性は、1 つ以上のタグ名を / (スラッシュ) 文字で区切って記述した文字列です。複数のタグ名を指定した場合、それらのタグは入れ子になっていると見なされます。その場合、左から右に向かって、最上位のタグから最下位のタグの順番で記述します。* (アスタリスク) 文字は、あらゆるタグと一致するワイルドカードです。

以下のテーブルの match 値の例で、これをわかりやすく説明します。

ルールは、MATCH の一番内側にあるタグに対して適用されます。同じタグに複数のルール定義が存在する場合、CSP コンパイラはどの match 値が最も具体的であるかを判断することで、使用するルールを決定します。例えば、BBB に対するルールよりも、AAA/BBB に対するルールの方が具体的です。同様に、属性の値を指定するルール (BBB[CCC]) の方が、そうでないもの (BBB) より具体的です。

タグ・マッチングの例
match の値 ルールの適用例
AAA <AAA> タグが見つかった場合に必ず適用 : <AAA></AAA>
AAA/BBB <AAA> タグと直接入れ子になっている <BBB> タグが見つかった場合に必ず適用 : <AAA> <BBB></BBB> </AAA>
AAA/*/BBB <AAA> タグの任意の位置で入れ子になっている <BBB> タグが見つかった場合に適用 : <AAA><FFF> <BBB></BBB> </FFF></AAA>
AAA[CCC] 任意の値が設定された CCC 属性を持つ <AAA> タグが見つかった場合に適用 : <AAA CCC=”10” ></AAA>
AAA[CCC=22] 値 “22” が設定された CCC 属性を持つ <AAA> タグが見つかった場合に適用 : <AAA CCC=”22”><AAA>
AAA[CCC=22]/*/BBB 値 “22” が設定された CCC 属性を持つ <AAA> タグの中の任意の位置で入れ子になっている <BBB> タグが見つかった場合に適用 : <AAA CCC=”22” ><FFF> <BBB></BBB> </FFF></AAA>

ルール・アクション内のサーバ側の式とコード

ルールに定義されているアクションでは、ページの実行時またはコンパイル時のいずれかで実行する式とコードを指定します。

アクションの実行時式

実行時の式をアクションで指定するには、CSP ページで使用できるものと同じ #(expr)# 構文を使用します。例えば、以下は Caché の $ZDATE コマンドを使用して現在の時刻を表示する <TODAY> タグを定義するルール定義です。

<csr:rule name="TODAY" match="TODAY" empty>
<csr:action>
Today is: <b>#($ZDATE($H))#</b>
</csr:action>
</csr:rule>

このルールをロードすると、以下のように CSP ページの本文に配置できます。

<TODAY>

そして、そのページが要求されたとき、現在の日付が表示されます。

コンパイル時の式とアクション

コンパイル時式をアクションで指定するには、##(expr)## 構文を使用します。例えば、以下は、CSP ページが最後にコンパイルされた日付を表示するタグ <LASTMOD> を定義するルールです。##( )## 式は、ページをコンパイルするときに評価されます。式の評価結果は、生成された CSP ページの静的な部分になります。

<csr:rule name="LASTMOD" match="LASTMOD" empty>
<csr:action>
This page was last compiled on: <b>##($ZDATE($H))##</b>
</csr:action>
</csr:rule>

コンパイル時式は、実行時の式にも使用できます。この場合、最初の $H は実行時に評価され、現在の日付が返されます。2 番目の $H はページがコンパイルされるときに評価され、ページがコンパイルされた日付を返します。

This page is #(+$H - ##(+$H)##)# days old.

アクション内の <script> タグ

同様に、タグを使用して、アクション内に複数行のコードを記述できます。実行時コードには <script language=cache runat=server> タグを使用し、コンパイル時コードには <script language=cache runat=compiler> タグを使用します。例えば以下は、100 項目の箇条書きリストを作成するルールです。

<csr:rule name="BIGLIST" match="BIGLIST" empty>
<csr:action>
<ul>
<script language="Cache" runat=server>
For i = 1:1:100 {
    Write "<li>Item " _ i _ $C(13,10)
}
</script>
</ul>
</csr:action>
</csr:rule>

このルールをロードすると、以下のように CSP ページの本文にそのルールを配置できます。

<BIGLIST>

そして、そのページが要求されたとき、100 項目の箇条書きリストが表示されます。

サーバ・ドキュメント・オブジェクト・モデル

CSP コンパイラが CSP ドキュメントを処理するとき、最初にルール・マッチングにかかわるすべてのタグを検索します。ドキュメントをスキャンするコンパイラによって、CSP ドキュメントに記述されたタグの構造と一致するオブジェクト・ツリーが生成されます。このツリー構造は、サーバ側のドキュメント・オブジェクト・モデル と呼ばれます。これは、HTML ページが表示されるときにブラウザに存在するドキュメント・オブジェクト・モデルに似ています。

サーバ側のドキュメント・オブジェクト・モデルは、%CSP.AbstractAtomOpens in a new tab クラスのサブクラスのインスタンスから構成され、HTML ドキュメントの単位を表しています。HTML ドキュメントは、RuleTextAtom という 2 種類のアトム・オブジェクトで構成されています。これらは、それぞれのクラスである %CSP.RuleOpens in a new tab%CSP.TextAtomOpens in a new tab で表されます。%CSP.RuleOpens in a new tab のサブクラスのインスタンスで表される Element は、HTML タグ、その属性値、内部 HTML、そしてこれに含まれる任意の内部タグに相当します。TextAtom は、Element 以外のすべてを表します。効率を上げるため、CSP コンパイラはルール・マッチングに関係するタグの Element オブジェクトのみを生成します。その他 (例えば <B><I> タグ) は TextAtom オブジェクトに含まれます。

例えば、<MYTAG> タグのルールを記述した次の CSP ドキュメントを考えます。

<html>
<body>
Hello!
<MYTAG MSG="Welcome">
</body>
</html>

これによって、以下のサーバ側のドキュメント・オブジェクトが構成されます。

  • TagNameHTMLElement (子を含む)

    • TagNamebody Element (子を含む)

      • TextHello!. の TextAtom

      • TagNameMYTAG で、MSG 属性が WelcomeElement

(効率を上げるために) サーバ側のドキュメント・オブジェクト・モデルは、ページ・コンパイル中にのみ生成され実行時には存在しません。コンパイル時に実行する式やコードをアクションで指定してサーバ側のドキュメント・オブジェクト・モデルを活用するのは、主にこのためです。

CSP コンパイラはドキュメント・オブジェクト・モデルを構成した後、ドキュメントを以下の方法で処理します。まず、ツリー構造の最下層から上位に向かってオブジェクトを検索し、ツリー中のそれぞれの %CSP.RuleOpens in a new tab オブジェクトにかかわるルールを適用し、その結果を実行可能なコードに記述します。 %CSP.TextAtomOpens in a new tab オブジェクトは、定義によりルールを持たないので、実行可能なコードに直接記述されます。

ルール属性値へのアクセス

ルールを実行するとき、そのルールに関連付けられた %CSP.Rule オブジェクトへの参照を、現在のオブジェクトを介して利用できます。

例えば、VALUE 属性を使用して指定したメッセージを、太字のイタリック体テキストとして表示するカスタム <MESSAGE> タグを定義するとします。

<MESSAGE VALUE="Yo!">

このルールの定義は、以下のとおりです。

<csr:rule name="MESSAGE" match="MESSAGE" empty>
<csr:action>
<B><I>##(..GetAttribute("VALUE"))##</I></B>
</csr:action>
</csr:rule>

<MESSAGE> タグが検出されると、必ず MESSAGE ルールが実行 (RenderStartTag が呼び出されるなど) されます。そのアクションは以下のとおりです。

  1. <B> タグと <I> タグを記述します。

  2. タグ・オブジェクトの値を書き出します。

  3. <B> タグと <I> タグを閉じます。

アクション内での <csr> タグの使用

ルールのアクション定義内で、以下のようなタグが使用できます。ここでは以下について説明します。

<csr:default> タグ

<csr:default> タグは、このルールに関連付けられたタグの内容を直接記述します。例えば、以下のルールは <ECHO> タグ、およびその属性と子を記述します。

<csr:rule name="ECHO" match="ECHO" >
<csr:action>
<csr:default>
</csr:action>
</csr:rule>

このタグは主に、タグの属性の一部を変更し、それ以外は変更しないときに使用されます。例えば、CSP ページのすべてのテーブルの背景を赤にするには、次のように <table> タグに対するルールを定義します。

<csr:rule name="REDTABLE" match="TABLE" >
<csr:action>
<script language="Cache" runat="COMPILER">
    // set the bgcolor attribute for this element
    Do ##this.SetAttribute("BGCOLOR","red")
</script>
<csr:default>
</csr:action>
</csr:rule>

このルールが適用されると、(コンパイル時のスクリプトを使用して) すべての <TABLE> タグの BGCOLOR 属性の値は red に変更されますが、テーブル・タグ (その子も含め) の他の特性は変更されません。

<csr:children> タグ

<csr:children> タグは、タグが持つ子タグをすべて記述します。これは、<csr:default> タグと違い、このルールに関連付けられたタグ自体は対象としません。このタグは、囲んでいるタグがどのように表されるかを完全に把握する必要があるが、その子についてはどのように表されるかを気にしない場合に使用します。

<csr:section> タグ

<csr:section> タグは、生成された HTML ページ内で、目的の内容を記述する位置を指定します。既定では、実行時の HTML ページ内で、CSP ドキュメント内のルール・タグが記述されている位置に相当する位置に、テキストが記述されます。<csr:section> タグを使用すれば、これを変更できます。例えば、HTML ページの本文にボタンを作成し、それに対応する JavaScript をページの冒頭に作成するルールを定義するとします。そのために、以下のルールを定義します。

<csr:rule name="MYBUTTON" match="FORM/*/MYBUTTON" empty>
<csr:action>
<csr:section NAME=HEAD>
<script language="JavaScript">
function MyButton()
{
 alert('MyButton pressed!');
 return true;
}
</script>
</csr:section>

<input type="button" value='##(##this.GetAttribute("VALUE"))##'
onclick="MyButton();"></input>
</csr:action>
</csr:rule>

アクション外での <csr> タグの使用

ルール定義でアクションの外部で使用できる <csr> タグが用意されています。ここでは以下のタグについて説明します。

<csr:class> タグ

<csr:class> タグでは IMPORTSUPER、または INCLUDES の各属性を使用できるので、生成されたルール・クラスは他のクラス・メソッドにアクセスできます。

この例は、<csp:else> タグのルール定義の中で見ることができます。その定義では、%CSP.RuleBlockOpens in a new tab がスーパークラスとして指定されています (既定では、CSR ページの DOM (ドキュメント・オブジェクト・モデル) モデル内の要素を表す、すべてのクラスのスーパークラスは %CSP.RuleElementOpens in a new tab です)。

<csr:rule name="%ELSE" match="CSP:IF/CSP:ELSE" empty>
<csr:class super=%CSP.RuleBlock>
<csr:action>
<SCRIPT LANGUAGE=Cache RUNAT=COMPILER>
    New ifblock
    Set ifblock=..GetCurrentBlock()
    If ifblock'="" {
        If ifblock.EndLabel="" Set ifblock.EndLabel=..GetNewLabel()
        Do ..WriteServer(" Goto "_ifblock.EndLabel_" ;}")
        Do ..WriteServer(ifblock.NextLabel_" ;{")
        Set ifblock.NextLabel=""
    }
</SCRIPT>
</csr:action>
</csr:rule>

<csr:property> タグ

<csr:property> タグは、ルール・クラス内のプロパティを定義します。このタグを使用すると、生成した csr クラスのプロパティを指定できます。<csr:property> の使用法として、開始タグを記述するときにプロパティを設定し、終了タグを記述するときにそのプロパティをチェックするというものがあります。name 属性は、プロパティ名を指定します。指定したプロパティの以下の属性がサポートされます。

  • name

  • description

  • final

  • initial

  • multidimensional

  • private

  • transient

  • type

<csr:description> タグ

<csr:description> タグには、カスタム・ルールの説明のほか、必要に応じてその例を記述します。

以下は、%SQLCURSOR ルールから抜粋した、このタグの例です。

<csr:description>
    The <b>SCRIPT LANGUAGE=SQL</b> creates embedded SQL for a
    DECLARE CURSOR statement in the class generated by the CSP page.  The
    declared cursor will be opened using an SQL OPEN statement and the
    SQLCODE will be returned.  It is the programmers responsibility to
    display any error indicated by the SQLCODE value.<p>
    The mode of the query is determined by the MODE attribute.  The mode is
    taken to be a runtime mode by default.  If the COMPILERMODE attribute
    is specified, then the mode is taken to be a compile time mode that
    is defined by a generated #SQLCOMPILE statement.
    <p>For example:
    <EXAMPLE>
    <SCRIPT LANGUAGE=SQL CURSOR=prsn>
      select name,ssn from sample.person where ssn %STARTSWITH '2' order by ssn
    </script>
    <CSP:WHILE CURSOR=prsn INTO='Name,ssn' counter=x condition=(x<3)>
      Name: #(Name)#<br>
      SSN: #(ssn)#<br>
    </CSP:WHILE>
    </EXAMPLE>
    <p>Will display all people whose ssn begins with 1:
    <OUTPUT>
    Name: Smith, Joe<br>
     SSN: 111-11-1111<br>
    Name: Jones, Harry<br>
     SSN: 111-11-1122<br>
    and so on..<br>
    and so on..<br>
    </OUTPUT>
</csr:description>

<csr:attribute> タグ

<csr:attribute> タグには、カスタム・タグの属性のリストと各タグの簡単な説明を記述します。

以下は、<csp:content> タグから抜粋した例です。

<csr:attribute
        name=Type
        description="Specify the default Content-Type"
        type="contentType:STRING"
        >
<csr:attribute
        name=Charset
        description="Specifies the default charset"
        type="charSet:STRING"
        >
<csr:attribute
        name=NoCharSetConvert
        description="Turns off the charset conversion"
        type="noCharSetConvert:STRING"
        >

ルール・クラスの使用

ルール・コンパイラは、コンパイルされる各ルール定義のクラスを生成します。ルールが該当した時に、このコードが実行されます。これによって以下の利点が得られます。

  1. 高い機能を持つルールが実現します。

  2. ルールをクラスとして直接作成できます。

  3. ルール・クラスをスタジオで表示、編集できます。

生成されたルール・クラスの構造

.csr ファイルからルールをコンパイルすると、生成されるルール・クラスは RenderStartTag メソッドのほか、ルール定義でコンパイル時コードを指定している場合は、1 つ以上の CompilerMethod メソッド () で構成されます。<csr:children> タグまたは <csr:default> タグがルール定義で定義されている場合は、RenderEndTag メソッドもこのクラスに追加されます。CompilerMethod メソッドはコンパイル時に実行されるコードを含みますが、RenderStartTag メソッドおよび RenderEndTag メソッドはそれぞれ、CSP ページ・クラスに直接記述されるコード式用の一連の Write メソッドから構成されます。使用される Write メソッドは式によって異なります。Write メソッドは、%CSP.AbstractAtomOpens in a new tab クラスで定義されます。これについては、この章の後で説明します。

以下は、<csr:if> ルールに属するルール・クラスです。このクラスには RenderStartTag メソッドと RenderEndTag メソッドが含まれており、CompilerMethod の 2 つのインスタンスがあります。これらの各メソッドの詳細を、以下で説明します。

Import User

Class %csr.csp.IF Extends %CSP.RuleBlock
{

Parameter CSRURL = "w:/csp/rules/Control.csr";

Method CompilerMethod1() [ Language = cache ]
{
 Do ..NewBlock()
 Set ..NextLabel=..GetNewLabel()
 Do ..WriteServer(
   " If '("
     _ $$UnEscapeHTML^%cspQuote(..GetAttribute("condition","0"))
     _ ") Goto "
     _ ..NextLabel
     _" ;{"
   )
}

Method CompilerMethod2() [ Language = cache ]
{
 New comment Set comment=" ;}"
 If ..EndLabel'="" Do ..WriteServer(..EndLabel_comment) Set comment=""
 If ..NextLabel'="" Do ..WriteServer(..NextLabel_comment)
 Do ..RemoveBlock()
}

Method RenderEndTag() As %Status
{
 New element Set element=##this
 Set %statuscode=$$$OK Do ..CompilerMethod2()
 Quit:$$$ISERR(%statuscode) %statuscode
 Quit $$$OK
}

Method RenderStartTag() As %Status
{
 New element Set element=##this
 Set %statuscode=$$$OK Do ..CompilerMethod1()
 Quit:$$$ISERR(%statuscode) %statuscode
 Quit $$$PROCESSCHILDREN
}

}

RenderStartTag メソッド

RenderStartTag メソッドは、CSP ページに開始タグを記述するときに呼び出されます。RenderStartTag は、この要素を記述するルーチン・ビルダ・オブジェクトにコードを書き込みます。<csr:action> の本文内の <csr:children> タグの前に置かれるテキストは、一連の異なる write メソッドを使用して、ルーチン・ビルダ・オブジェクトに書き込まれます。メソッドは、書き込まれるテキスト・タイプによって異なります。

以下はコードの例です。

<csr:action>
<script language="Cache" runat=server>
   Set myfile="c:\temp.txt"
   Open myfile:("FR":100)
   Use myfile:()
   Read var1
   Close myfile
</script>
</csr:action>

これにより、コンパイル時に、以下の RenderStartTag メソッドが、作成されたルール・クラスに生成されます。


Method RenderStartTag() As %Status
{
 New element Set element=##this
 Do ..WriteCSPServer(" Set myfile=""c:\temp.txt""",0)
 Do ..WriteCSPServer(" Open myfile:(""FR"":100)",1)
 Do ..WriteCSPServer(" Use myfile:() ",1)
 Do ..WriteCSPServer(" Read var1",1)
 Do ..WriteCSPServer(" Close myfile",1)
 Quit $$$SKIPCHILDREN
}

RenderStartTag メソッドには、ルール定義の構造に応じて、他の文を指定できます。アクションに <script runat=compiler> タグを指定していると、CompilerMethod メソッドが作成されます。これらの CompilerMethod メソッドは、以下のコマンドを使用して RenderStartTag メソッドの開始時に呼び出されます (CompilerMethod1 のインスタンスの例として示しています)。


Set %statuscode=$$$OK Do ..CompilerMethod1()
Quit:$$$ISERR(%statuscode) %statuscode
 

さまざまな Write メソッドと CompilerMethod メソッドの呼び出しに加え、RenderStartTag メソッドには、<csr:action> 定義で 1 つ以上の csr タグを使用しているかどうかにより、その他のコマンドも記述できます。

<csr:children> に対する Quit 文

.csr ファイルに <csr:children> タグを使用している場合、RenderStartTag メソッドの最終行は以下のようになります。

Quit $$$PROCESSCHILDREN

これは、子が RenderStartTag メソッドの完了時に処理されることを示します。RenderEndTag メソッドは、明示的にクラスにも記述され、<csr:children> タグを呼び出した後に発生する文を書き込みます (既定では、RenderEndTag メソッドは何も行いません)。

<csr:default> に対する Quit 文

アクション定義で <csr:default> タグを使用すると、生成される RenderStartTag メソッドには以下のコマンドが記述されます。

Do ..RenderDefaultStartTag()
Quit $$$PROCESSCHILDREN

CompilerMethod[n]() メソッド

1 つ以上の <script> タグに対して runat=compiler が指定されていれば、CompilerMethod メソッドが .csr ファイルから生成されます。これは、<script runat=compiler> 文の位置に応じて、RenderStartTag メソッドのどこからでも呼び出すことができます。コンパイル時コードを持つ <script> タグが複数あると、複数の CompilerMethod メソッド (CompilerMethod1()CompilerMethod2() など) が生成されます。他の 2 つのメソッドとは異なり、.csr ファイルにあるコンパイル時 ObjectScript 文は、このメソッドの本文に 1 行ずつコピーされます。

例えば、.csr ルール・ファイルにある以下のコンパイル時コードを考えます。

<script language="Cache" runat=compiler>
   SET ^client(2,1,1)=..InnerText()
   </script>

この .csr ファイルがコンパイルされると、関連するルール・クラスに以下のメソッドが生成されます。

Method CompilerMethod1() [ Language = cache ]
{
    SET ^client(2,1,1)=..InnerText()
}

RenderEndTag メソッド

<csr:children> タグまたは <csr:default> タグが .csr ファイル・ルール定義にあれば、RenderEndTag メソッドがルール・クラスに生成されます。これは、終了タグの記述時に呼び出されます。<csr:children> タグの後に記述されるあらゆる文は、RenderStartTag メソッドと同様に、このメソッド内でルーチン・ビルダに記述されます。

以下は、CSP サンプル・ページの barchart.csr 例にあるルール定義のサンプルです。テーブル宣言内の <csr:children> タグの配置に注意してください。

<csr:rule name="iscbarchart" match="isc:barchart" language="any">
<csr:action>
<table bgcolor='##(..GetAttribute("BGCOLOR"))##' border=0 cellspacing=0
 style='border: ##(..GetAttribute("BORDER","solid blue"))##;'><tr>
<csr:children>
</tr></table>
</csr:action>
</csr:rule>

コンパイル時に、RenderStartTag メソッドの Quit 文で子を処理するプロセス呼び出しにより、iscbarchart ルール・クラスが生成されます。ルール・ファイル内の <csr:children> タグの後にある HTML は、RenderEndTag メソッドに記述されます。

Import User

Class csr.csp.iscbarchart Extends %CSP.Rule
{

Parameter CSRURL = "w:/csp/samples/barchart.csr";

Method RenderEndTag() As %Status
{
 New element Set element=##this
 Do ..WriteText("",1)
 Do ..WriteCSPText("</tr></table>",0)
 Quit $$$OK
}

Method RenderStartTag() As %Status
{
 New element Set element=##this
 Do ..WriteText("",1)
 Do ..WriteCSPText(
  "<table bgcolor='##(..GetAttribute(""BGCOLOR""))##' border=0 cellspacing=0"
  ,1)
 Do ..WriteCSPText(
  " style='border: ##(..GetAttribute(""BORDER"",""solid blue""))##;'><tr>"
  ,0)
 Quit $$$PROCESSCHILDREN
}

}

%CSP.Rule メソッドの使用

%CSP.RuleOpens in a new tab クラスには、<csr> ルール定義で使用できるインスタンス・メソッドがいくつかあります。これらのメソッドは、次の 2 つのタイプのうちのいずれかです。

  • 読み取り専用で、要素の値を返すメソッド

    GetAttribute

    QuoteAttribute

    GetAttributesOrdered

    IsDefined

  • ドキュメント・オブジェクト・モデルの要素を変更するメソッド

    InnerText

    AddChildElement

    SetAttribute

    OnMatch

GetAttribute メソッド

構文


GetAttribute(name As %String, default As %String = "")

GetAttribute メソッドは、この要素に対する HTML 属性 name の値を取得します。この値には、解決された ##( )## 式および ##''## 式が既に設定されています。

以下は、HTML グリッドの名前とサイズのセットの例です。

    Set tablename=##this.GetAttribute("NAME")
    Set maxcols=##this.GetAttribute("COLS")
    Set maxrows=##this.GetAttribute("ROWS")

QuoteAttribute メソッド

構文


QuoteAttribute(name As %String, default As %String = "")

QuoteAttribute メソッドは、この要素に対する HTML 属性 name の値を取得します。評価された #()# 式、##( )## 式、および ##''## 式で置き換えるために、その値は引用符で囲まれます。

以下では、<csp:loop> タグを例として使用しています。文字列型の属性が 1つ ("counter") と整数型の属性が 3 つ ("FROM""STEP""TO") 含まれています。これは、それらの値を取得し、CSP ページ上に文字列として表示します。

<SCRIPT LANGUAGE=Cache RUNAT=COMPILER>
    New counter,from,step,to
    Set counter=..GetAttribute("counter","counter")
    Set from=..QuoteAttribute("FROM",1)
    Set step=..QuoteAttribute("STEP",1)
    Set to=..QuoteAttribute("TO",1)
    Do ..NewBlock()
    Do ..WriteServer(" For "_counter_"="_from_":"_step_":"_to_" {")
</SCRIPT>

GetAttributesOrdered メソッド

構文


GetAttributesOrdered(ByRef paramsordered)

GetAttributesOrdered メソッドは、すべてのパラメータを順序付けられた配列で返します。

IsDefined メソッド

構文

IsDefined(name As %String)

IsDefined メソッドは、HTML 属性 name が定義されているかどうかを示します。

 If ..IsDefined("CAPTION") {
     Do ..WriteServer(setCmd
                      _ " nvp(""CAPTION"") = "
                      _ ..QuoteAttribute("CAPTION"))
 }

InnerText メソッド

構文

InnerText()

InnerText メソッドは、開始タグと終了タグの間に含まれるテキストを取得します。

このメソッドを使用して、タグのコンテンツを集めて、言語とドメイン属性によって指定されたテキストと置換します。

 Set %text=##class(%CSP.TagLanguage).GetText(##this,..InnerText())

AddChildElement メソッド

構文

AddChildElement(atom As %CSP.AbstractAtom)

AddChildElement メソッドは、この要素に子アトムを追加します。

SetAttribute メソッド

構文

SetAttribute(name As %String, value As %String)

SetAttribute メソッドは、この要素の HTML 属性 namevalue に設定します。

以下の例では、"NAME" 属性が指定されていなければ、"NAME" 属性を既定値 ("FORM") に設定します。

    If ('..IsDefined("NAME")) {
        Do ..SetAttribute("NAME","FORM")
    }

OnMatch メソッド

構文

OnMatch(rule As %CSP.Rule) returns %Status

ルールの既定の OnMatch メソッドは、何も実行しません。OnMatch は、ユーザ・ルールによってオーバーライドされる場合があります。

一般的に、このメソッドの機能について、つまり、ルールが一致するかをメソッドがチェックする方法について説明します。

アプリケーションですべての CSP ページによって継承される共通コードを作成する方法のひとつは、OnMatch メソッドをオーバーライドすることです。

選択されたルールがルール DOM に追加されると、一致するルールごとに OnMatch メソッドが呼び出されます。 ルールが照合され、複数のルールが同じ選択に一致すると、OnMatch がそれぞれ呼び出されます。この順序はコンパイルの順序およびその他の要因に依存しているため、この順序自体に依存することはできません。

OnMatch メソッドに渡されるルール・クラス・インスタンスが、DOM に追加された選択されたルールです。このルールは、(XSLT 選択ルールに非常に類似したルールに従って) 最も明確な照合を実行するルールです。 一致するルール・クラスすべての OnMatch が、この最も選択的なルールを使用して呼び出されます。

OnMatch メソッドは、渡されたルールを使用して DOM を更新できます。同梱の url.csr 内の %URL.FORM ルールおよび添付サンプルを参照してください。 サンプル・ルールは、組み込みシステム・ルールほど選択的ではありませんが、これによって、既定の動作を継続できます。OnMatch コールバックは、これを目的として設計されています。このコールバックは、最も選択的なルールではなくても、ルールが一致したときに呼び出されるためです。 サンプルの代替として、カスタム・ルールを作成し、それを DOM に追加してから、ページ・クラス生成時に DOM が検索されているときに必要な修正を施すことができます。このオプションは可能ですが、より複雑です。

OnMatch メソッドをオーバーライドする代わりに、独自のルールにコードを追加できます。システム・ルールをオーバーライドすることはお勧めしません。

システム・ルール (特に htmlhead、および body) のオーバーライドには、厳密な注意とルール・コンパイラの内部に対する依存が必要です。インターシステムズは、isc:SAMPLE ルールを作成し、各ページにそのルールを追加した、/csp/samples CSP ページに使用した方法を使用することをお勧めします。既存のページにわたってループし、新しいカスタム・タグを追加するルーチンを記述することは簡単です。

<csr> %CSP.AbstractAtom Write メソッドの使用

ルール・クラスの RenderStartTag メソッドおよび RenderEndTag メソッドで使用される write メソッドは、ルール定義により生成されたコードを CSP ページ・クラスに記述します。これにより、CSP ページ・クラスは、そのページが要求された時に、指定された動作を実行するうえで必要な適切なコマンドを含むことができます。%CSP.AbstractAtomOpens in a new tab クラスは、これらの write メソッドの定義を指定します。

  • WriteText

  • WriteCSPText

  • WriteExpression

  • WriteServer

  • WriteCSPServer

WriteText メソッド

構文

WriteText(line As %String, crlf As %Boolean = 0)

WriteText コマンドは、CSP ページ・クラスに Write コマンドを生成し、行のコンテンツを記述します。これには、2 つの引数、つまり記述する文字列と、新しい行を記述するかどうかを示すキャリッジ・リターン/改行ブーリアンが含まれます。

WriteCSPText メソッド

構文

WriteCSPText(line As %String, crlf As %Boolean = 0)

WriteCSPText コマンドは Write コマンドを CSP ページ・クラスに生成し、 ##()## ##''###server, #url、および #()# 式の処理を使用して行の内容を書き込みます。これには、2 つの引数、つまり記述する文字列と、新しい行を記述するかどうかを示すキャリッジ・リターン/改行ブーリアンが含まれます。例えば、.csr ルール・ファイルの <csr:action> タグの本文にある以下の行を考えます。

<B><I>##(##this.GetAttribute("VALUE"))##</I></B>

これは、コンパイル時に以下の文をルール・クラスに生成します。

 Do ..WriteCSPText("<B><I>##(##this.GetAttribute(""VALUE""))##</I></B>",0)

WriteExpressionText メソッド

構文

WriteExpressionText(expr As %String, crlf As %Boolean = 0)

WriteExpressionText コマンドは、CSP ページ・クラスに write コマンドを生成し、ObjectScript 式によって返されるテキストを記述します。返されるテキストは、既に適切に引用符で囲まれています。これには、2 つの引数、つまり記述する文字列と、新しい行を記述するかどうかを示すキャリッジ・リターン/改行ブーリアンが含まれます。

WriteServer メソッド

構文


WriteServer(line As %String, keepTogether As %Boolean = 0)

WriteServer コマンドは、行内にある CSP ページ・クラスに ObjectScript コマンドを生成します。これには、2 つの引数、つまり記述する文字列と、その文字列をその前の文に加えるかどうかを示すブーリアンが含まれます。

WriteCSPServer メソッド

構文

WriteCSPServer(line As %String, keepTogether As %Boolean = 0)

WriteCSPServer コマンドは、評価された ##()###()#、および ##''## に対応する CSP ページ・クラスに ObjectScript コマンドを生成します。これは、2 つの引数、つまり記述する文字列と、その文字列をその前の文に加えるかどうかを示すブーリアンを持ちます。例えば、.csr ルール・ファイル内の以下の ObjectScript コードを考えます。

<script language="Cache" runat=server>
   Set myfile="c:\temp.txt"
   Open myfile:(80:"C":"|")
   Use myfile:()
   Read ^client(3,1,1)
   Close myfile
</script>

これは、コンパイル時に以下の文をルール・クラスに生成します。

 Do ..WriteCSPServer(" Set myfile=""c:\temp.txt""",0)
 Do ..WriteCSPServer(" Open myfile:(80:""C"":""|"") ",1)
 Do ..WriteCSPServer(" Use myfile:()",1)
 Do ..WriteCSPServer(" Read ^client(3,1,1)",1)
 Do ..WriteCSPServer(" Close myfile",1)

<csr> %cspQuote メソッドの使用

%cspQuote ルーチン定義には、2 種類の quoting メソッドに対する定義があります。

  • Quote

  • QuoteCSP

Quote メソッド

構文

$$Quote^%cspQuote(line As %String)
            

出力文字列を、引用符で囲みます。

QuoteCSP メソッド

構文

$$QuoteCSP^%cspQuote(line As %String)
            

入力文字列を引用符で囲み、#()###()####''###server、および #url の各呼び出しを評価します。

テーブルを表示する <grid> タグの作成

ここでは、GridExample というルールの例を示します。このルールは、CSP ページに情報のテーブルを作成する次の 2 つのタグを作成します。

  • <GRID> タグ

  • <GRIDDATA> タグ

Grid ルール定義

<csr:rule name="GridExample" match="GRID">
<csr:action>
<script language =Cache runat=compiler>
    Set maxrows=##this.GetAttribute("COLS")
    Set maxcols=##this.GetAttribute("ROWS")
    Do ..WriteText("<TABLE>",1)
    Set GRIDDATA=""
    ;Get Grid Data
    Set count=##this.Children.Count()
    For i=1:1:count {
         Set el=##this.Children.GetAt(i)
         Set tagname=el.TagName
         If tagname="GRIDDATA" {
             Set value=el.GetAttribute("VALUE")
             Set col=el.GetAttribute("COL")
             Set row=el.GetAttribute("ROW")
             Set GRIDDATA(row,col)=value
         }
    }
    ; Write Grid Elements
    For row=1:1:maxrows {
        Do ..WriteText("<TR>",1)
        For col=1:1:maxcols {
            Set d=$G(GRIDDATA(row,col))
            Do ..WriteCSPText("<TD>"_d_"</TD>",1)
        }
    }
    Do ..WriteText("</TR>",1)
    Do ..WriteText("</TABLE>",1)
</SCRIPT>
</csr:action>
</csr:rule>

<GRIDDATA> 属性は <GRID> のルール定義で扱われますが、<GRIDDATA> タグをインスタンス化するためには空のルールも引き続き必要です。

<csr:rule name="GridDataExample" match="/GRID/GRIDDATA">
<csr:description>
This purpose of this empty rule is to instantiate the GRIDDATA tag
into the Document Object Model.
</csr:description>
<csr:action>
<csr:default>
</csr:action>
</csr:rule>

生成された Grid クラス

上記のルール定義は、以下の 2 つのクラスにコンパイルされます。

  • Grid

  • GridData

Grid クラス

Import User

Class csr.csp.GridExample Extends %CSP.Rule
{

Parameter CSRURL = "/csp/user/GRIDEXAMPLE.CSR";

Method CompilerMethod1() [ Language = cache ]
{
     Set maxrows=##this.GetAttribute("COLS")
     Set maxcols=##this.GetAttribute("ROWS")
     Do ..WriteText("<TABLE>",1)
     Set GRIDDATA=""
     ;Get Grid Data
     Set count=##this.Children.Count()
     For i=1:1:count {
         Set el=##this.Children.GetAt(i)
         Set tagname=el.TagName
         If tagname="GRIDDATA" {
             Set value=el.GetAttribute("VALUE")
             Set col=el.GetAttribute("COL")
             Set row=el.GetAttribute("ROW")
             Set GRIDDATA(row,col)=value
         }
     }
     ; Write Grid Elements
     For row=1:1:maxrows {
         Do ..WriteText("<TR>",1)
         For col=1:1:maxcols {
             Set d=$G(GRIDDATA(row,col))
             Do ..WriteCSPText("<TD>"_d_"</TD>",1)
         }
     }
     Do ..WriteText("</TR>",1)
     Do ..WriteText("</TABLE>",1)
}

Method RenderStartTag() As %Status
{
 New element Set element=##this
 Set %statuscode=$$$OK Do ..CompilerMethod1()
 Quit:$$$ISERR(%statuscode) %statuscode
 Quit $$$SKIPCHILDREN
}

}

GridData クラス

Import User

Class csr.csp.GridDataExample Extends %CSP.Rule
{

Parameter CSRURL = "/csp/user/GRIDEXAMPLE.CSR";

Method RenderEndTag() As %Status
{
 New element Set element=##this
 Do ..RenderDefaultEndTag()
 Quit $$$OK
}

Method RenderStartTag() As %Status
{
 New element Set element=##this
 Do ..RenderDefaultStartTag()
 Quit $$$PROCESSCHILDREN
}

}

グリッド・ルールの使用

グリッド・ルールは、CSP ページの本文内で使用できるようになりました。

<html>
<head>
<title>Grid Example</title>
</head>
<body>
<grid cols="5" rows="5">
<griddata value="Cell-1-1" col="1" row="1">
</griddata>
<griddata value="Cell-2-1" col="2" row="1">
</griddata>
<griddata value="Cell-2-2" col="2" row="2">
</griddata>
<griddata value="Cell-2-3" col="2" row="3">
</griddata>
<griddata value="Cell-2-4" col="2" row="4">
</griddata>
<griddata value="Cell-2-5" col="2" row="5">
</griddata>
<griddata value="Cell-3-1" col="3" row="1">
</griddata>
<griddata value="Cell-4-1" col="4" row="1">
</griddata>
<griddata value="Cell-4-3" col="4" row="3">
</griddata>
<griddata value="Cell-5-1" col="5" row="1">
</griddata>
<griddata value="Cell-5-5" col="5" row="5">
</griddata>
</grid>
</body>
</html>

グリッド・ルール表示ページ

CSP ページは、以下を表示します。

  Cell-1-1 Cell-2-1 Cell-3-1 Cell-4-1 Cell-5-1
           Cell-2-2
           Cell-2-3          Cell-4-3
           Cell-2-4
           Cell-2-5                   Cell-5-5
FeedbackOpens in a new tab