CustomTag 实际上是一种动态 header,例如可以在 header 中同时使用数据库数据(这个是 bootstrap.header 做不到的) 有以下几种使用方法:

cf_customTag

  • 服务器的 CustomTag 文件夹中放置对应的自定义标签 cfm 文件

  • 被访问的 cfm 目录放置对应的自定义标签 cfm 文件, 这里直接访问了当前目录下面的 abc.cfm 这个自定义标签,并且没有设置参数:

    <cf_abc>
    

cfmodule

实际上是自定义标签的另一种访问方法

这种方法可以指定特殊的路径

示例

<cfmodule
 name="XXX"
/>
<cfmodule
 template="XXX.cfm"
/>

参数

  • name
    • 表示自定义标签的名称
    • 如果是 abc.cfm 直接写成 abc 即可。
    • 如果是在子文件夹中,就使用 subFolderName.abc 的形式
    • 注意 name 和 template 参数不能同时使用
    • 使用 name 参数首先会在当前文件夹搜索标签,然后再是 CustomTags 文件夹
    • 使用 name 的时候总是无效?和服务器有关?
  • template
    • 表示对应自定义表单的文件名,需要写上扩展名
    • 如果在子文件夹,可以使用典型相对路径 ……/modules/abc.cfmmodules/abc.cfm
    • 注意template参数不支持绝对路径
    • 注意 name 和 template 参数不能同时使用

自定义参数

  1. 在被调用的 CustomTag 中初始化参数(必须)

    <cfparam name="ATTRIBUTES.message" type="string" default="this is msg">
    <cfparam name="ATTRIBUTES.anothermsg" type="string" default="this is another msg">
    <br>
    custom tag begins
    <br>
    <cfoutput>
        #ATTRIBUTES.message#
        <br>
        #ATTRIBUTES.anothermsg#
    </cfoutput>
    <br>
    custom tag ends
    <br>
    
  2. 注意参数前面的 Scope 为 ATTRIBUTES,这个 CFM 就将参数进行了输出

  3. 调用方法

  4. 在自定义标签的 CFM 中使用了<cfparam>所以如果没有赋值就出输出默认值

  5. 或者使用 isDefine()函数来进行查看

    <cfmodule template="CustomTags/tagtest.cfm"
        message="this is test msg"
        message2="this is test msg">
    
  6. 需要注意设置哪些属性是可选的,哪些是必须的

关于 CT 里面的变量的域控制

  1. 使用 ATTRIBUTES 域,则对应的变量 SCOPE 仅仅是在这个 CT 里面
  2. 使用 CALLER 域,在 CT 里面定义的变量甚至可以在 CT 之外调用,但是在 CT 之外调用的时候不需要添加 CALLER 的前缀
  3. 如果多层调用 CT,那么就可能需要使用 CALLER.CALLER 甚至更多次层叠的前缀,这时候可以考虑使用 REQUEST 的域来使得对应的变量进行共享

关于成对出现的自定义 Tag 标签

如果标签没有成对出现,一定要在标签末尾加上斜杠, 否则报错

实际上有两种使用 CT 的方法

<cf_tagtest>
……
</cf_tagtest>
<cf_tagtest var="xxx"/>

实际上第一种方法执行了两次

CT 的运行阶段

在 CT 中存在三个阶段

  1. Start
    • 遇到开始标签之后立即执行,并触发 CT 的第一次执行
    • 适合用于初步逻辑处理和输出
    • 无法看到和修改 Tag 之间的内容
  2. Inactive
    • 开始和结束之间的空闲期
    • 将内容累积到一个 ThisTag.GeneratedContent 中并用作处理
    • 通过对内置变量 ThisTag.ExecutionMode 来进行阶段判断
  3. End
    • 在借宿标签之后立即执行,并触发 CT 的第二次执行
    • 适合用于主要业务逻辑
    • 可以看到也可以修改 Tag 之间的内容

关于运行阶段的处理顺序

<cf_tagtest var="xxx">
    aaa
</cf_tagtest>
……
<cfif ThisTag.ExecutionMode EQ "START">
    123
<cfelse>
    789
    <cfset ThisTag.GeneratedContent="456">
</cfif>

可以看见 789 在 456 之前,但是输出依然为 123 456 789

  1. 首先运行到 Start,将 123 缓存
  2. 然后运行到 Inactive,将 aaa 保存到 ThisTag.GeneratedContent 并且预先放置到 123 缓存的后面
  3. 然后运行到 End,将 789 缓存,并将 ThisTag.GeneratedContent 里面的 aaa 改为 456
  4. 因此输出顺序就是 123 456(aaa) 789