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