ColdFusion - Custom Tag 自定义标签
目录
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.cfm、modules/abc.cfm - 注意
template参数不支持绝对路径 - 注意name和template参数不能同时使用
自定义参数
-
在被调用的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> -
注意参数前面的Scope为ATTRIBUTES,这个CFM就将参数进行了输出
-
调用方法
-
在自定义标签的CFM中使用了
<cfparam>所以如果没有赋值就出输出默认值 -
或者使用isDefine()函数来进行查看
<cfmodule template="CustomTags/tagtest.cfm" message="this is test msg" message2="this is test msg"> -
需要注意设置哪些属性是可选的,哪些是必须的
关于CT里面的变量的域控制
- 使用 ATTRIBUTES 域,则对应的变量 SCOPE 仅仅是在这个 CT 里面
- 使用 CALLER 域,在 CT 里面定义的变量甚至可以在 CT 之外调用,但是在 CT 之外调用的时候不需要添加 CALLER 的前缀
- 如果多层调用 CT,那么就可能需要使用 CALLER.CALLER 甚至更多次层叠的前缀,这时候可以考虑使用 REQUEST 的域来使得对应的变量进行共享
关于成对出现的自定义Tag标签
如果标签没有成对出现,一定要在标签末尾加上斜杠, 否则报错
实际上有两种使用CT的方法
<cf_tagtest>
...
</cf_tagtest>
<cf_tagtest var="xxx"/>
实际上第一种方法执行了两次
CT的运行阶段
在CT中存在三个阶段
- Start
- 遇到开始标签之后立即执行,并触发CT的第一次执行
- 适合用于初步逻辑处理和输出
- 无法看到和修改Tag之间的内容
- Inactive
- 开始和结束之间的空闲期
- 将内容累积到一个ThisTag.GeneratedContent中并用作处理
- 通过对内置变量ThisTag.ExecutionMode来进行阶段判断
- 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
- 首先运行到Start,将123缓存
- 然后运行到Inactive,将aaa保存到ThisTag.GeneratedContent并且预先放置到123缓存的后面
- 然后运行到End,将789缓存,并将ThisTag.GeneratedContent里面的aaa改为456
- 因此输出顺序就是 123 456(aaa) 789