这是一个自定义标签的示例实现...
如果这是您第一次使用自定义标签,最简单的方法是将其放在调用它的页面相同的文件夹中。如果要将其放在不同的目录中,有几个选项可供选择,但我们先从简单的开始。
EmailMembers.cfm
<cfquery name="GetUIDs">
select userid from users
</cfquery>
<cfoutput query="GetUIDs">
<cf_maileach uid="#userID#">
</cfoutput>
请注意我如何称呼我的标签 cf_maileach?
在同一个目录中,放置 maileach.cfm 文件,看看它们的名称是否匹配?
maileach.cfm
<cfif StructKeyExists(attributes,"uid") and val(attributes.uid) gt 0>
<cfquery name="getinfo">
select fname,lname,email
from users
where userID = <cfqueryparam cfsqltype="cf_sql_integer" value="#attributes.uid#">
</cfquery>
<cfmail to="#getinfo.email#" subject="Hi #getinfo.fname#">...</cfmail>
</cfif>
注意事项:
- 根据你使用的cf版本以及是否使用application.cfc文件,有几种方法可以将自定义标签放置在外部目录中。还有
<cfmodule>
- 这只是一个示例,这样基本的东西已经过时,我只是在模仿提问者所述的内容。在此示例中,我调用了一个可以获取所有数据的查询,仅使用它来逐行查询。
- 如果你不熟悉
<cfqueryparam>
,请查找它、使用它并喜欢它。
编辑:虽然CFHTTP方法可以实现此目的,但它存在一些问题
- 不会自动传递会话(即使请求服务器和目标服务器相同)。
- 页面像浏览器请求一样访问。 应用程序/OnRequestEnd正在处理(由于会话信息也已传递,这可能导致尝试访问受保护区域中的文件时出现问题。
- 由于上面的原因,该页面需要位于具有自己的Application文件的文件夹中,以消除目录层次结构中其上方的任何应用程序文件。
- 为了解决1、2和3,您需要编写一层安全性,类似于您应用程序的自身安全性,以使文件不会在找到url时变得容易受攻击。
- 每次通过cfhttp调用文件都需要调用一些额外的安全检查。
- 它速度明显慢。 在一个没有内容的application.cfc上进行非常简单的测试中,自定义标记方法的执行时间真正达到了小于1/100。随着将实际功能添加到该方法中,结果的差异将发生变化。
以下是一些用于测试的示例代码。
文件夹“safe”的内容:
Application.cfc
[ blank file, to negate my testing site's actual application.cfc ]
Testrun.cfm
<cfoutput><cfset starttick = GetTickCount()>
<cfloop from="1" to="20" index="i">
<cfhttp url="http://mysamesite.com/safe/http.cfm?u=#i#" method="get" result="test">
#test.filecontent#<br>
</cfloop>
CFHTTP Execution Time: #(GetTickCount() - starttick)#<br><br>
<cfset starttick = GetTickCount()>
<cfloop from="1" to="20" index="i">
<cf_testtag u="#i#"><br>
</cfloop>
CustomTag Execution Time: #(GetTickCount() - starttick)#<br><br>
</cfoutput>
testtag.cfm
<cfoutput>The ID entered was
http.cfm
<cfoutput>The ID entered was #url.u#</cfoutput>
结果(毫秒)
每个测试包括20次HTTP和20次自定义标记的通过。
CFHTTP Tag
661ms 6ms
1624 5
616 5
460 4
522 6
816 4
<cf_email_output Attributes.id="#rsIDs.ID">
这样吗?一个具体的例子将会非常感激。 - Joe Lowery