• 第五十章 开发自定义标签 - 使用Rule类


    第五十章 开发自定义标签 - 使用Rule类

    使用Rule类

    规则编译器为每个被编译的规则定义生成一个类。
    匹配规则时执行的正是这段代码。
    这意味着

    1. 规则可以更强大
    2. 可以直接将规则创建为类,并且
    3. 可以在Studio中查看和编辑规则类。

    生成的规则类的结构

    当从.csr文件编译规则时,创建的规则类包含一个RenderStartTag方法,如果在规则定义中指定了编译时代码,则包含一个或多个CompilerMethod方法。
    如果标记在规则定义中,RenderEndTag方法也会被添加到类中。
    虽然CompilerMethod方法包含要在编译时执行的代码,但RenderStartTagRenderEndTag方法都由一系列Write方法组成,用于直接写入CSP页面类的代码表达式。
    所使用的Write方法的类型取决于表达式。
    写方法在。
    %CSP.AbstractAtom中定义,并将在本章后面讨论。

    下面是一个属于规则的规则类。
    它包含一个RenderStartTagRenderEndTag方法,并有CompilerMethod的两个实例。
    下面将进一步详细解释每一种方法。

    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
    }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    RenderStartTag方法

    RenderStartTag方法在呈现CSP页面中的开始标记时被调用。
    RenderStartTag将代码写入呈现该元素的例程构建器对象中。
    的主体中,出现在标记之前的文本将使用一系列不同的写方法写入例程构建器对象,具体取决于要写入的文本类型。

    例如,以下代码:

    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结果是在编译时在创建的规则类中生成以下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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    RenderStartTag方法可以包含其他语句,这取决于规则定义的结构。
    如果在操作中指定了