我正在使用ColdFusion 8.0.1
我正在处理一个有数千页的现有应用程序。我试图在我的application.cfm文件中包含一个新的UDF库。
我将此行添加到application.cfm:
<!--- UDF library include --->
<cfinclude template="UDF/udf_library.cfm">
UDF库包含其他包含UDF的文件,如下所示:
<cfinclude template="udf_powerreview.cfm">
我在udf_powerreview.cfm文件中有函数,例如:
// CREATE POWER REVIEWS SNIPPET
function createPRSnippet(Page_ID) {
LOCAL.Page_ID = ARGUMENTS.Page_ID;
if (isNumeric(LOCAL.Page_ID) && LOCAL.Page_ID > 0) {
LOCAL.Snippet = "<div class='pr_snippet_product'><script type='text/javascript'>var pr_snippet_min_reviews = 0; POWERREVIEWS.display.snippet(document, { pr_page_id : '#LOCAL.Page_ID#' });</script></div>";
} else {
LOCAL.Snippet = "";
}
return LOCAL.Snippet;
}
调试工具说成功包含了UDF / udf_library.cfm和udf_powerreview.cfm。
问题是当我在另一个页面中调用该函数时,我收到一个错误,指出该函数不存在。当我可以复制该功能并将其直接放入它所使用的页面时,它可以正常工作。并且,我没有得到错误“例程不能被声明两次”。
在我构建的每个站点中,我都以完全相同的方式创建了一个udf_library.cfm或udf_library.cfc。他们总是很好。
什么可能阻止功能可用和访问?是否有需要设置的应用程序设置?
答案 0 :(得分:1)
这是我使用的一种策略。这基本上是“按需”调用UDF。如果UDF已经存在,它将不会重新导入UDF。但是,您必须拥有命名参数,否则您必须从参数集合中删除UDFName。我很担心,争论的顺序可能不会保留,我没有调查过。
application.cfm
<cfapplication
name="udftest_001" />
<cffunction name="udf">
<cfargument name="udfname" type="string" required="true">
<cfif NOT isDefined(udfname)>
<cfinclude template='./udfs/#udfname#.cfm'>
</cfif>
<cfset tempfunc = variables[udfname]>
<cfreturn tempfunc(argumentCollection=arguments)>
</cffunction>
index.cfm
<cfoutput>
#udf(udfname='testUDF',firstname='John',lastname='Smith')#<br/>
#udf(udfname='testUDF',firstname='Betty',lastname='Ford')#<br/>
</cfoutput>
/udfs/testudf.cfm
<cfscript>
function testUDF() {
return 'Hello ' & arguments.firstname & ' #arguments.lastname#';
}
</cfscript>
答案 1 :(得分:1)
这是页面范围问题。不要将Application.cfm视为所有页面上的包含,只要知道它首先运行。它初始化的东西会延续到你现有的页面范围,有些东西则不会。使用Application.cfc而不是application.cfm可以解决很多模糊问题。
为了使您的UDF可用于整个应用程序,我建议使用“Singleton”设计模式。首先使用您的UDF并将它们放入CFC格式。这将使它们更具便携性。
你可以在application.cfm中输入以下几行:<cfif NOT isdefined('session.udf_powerreview') or isdefined('url.resetudf')>
<cfset session.udf_powerreview = createobject('Component','udf.udf_powerreview')/>
<!--- this 'udf.udf_powerreview' represents the physical path udf/udf_powerreview.cfc --->
</cfif>
我将它填入会话范围而不是应用程序范围,因为如果修改UDF,你将无法重置应用程序范围。
无论哪种方式,一旦在你的application.cfm中,你应该可以在任何页面上看到你的功能。
<cfdump var="#session.udf_powerreview#">
答案 2 :(得分:0)
我怀疑某些事情与相对路径有关。
你能让“UDF”成为一种映射吗?然后就可以了
<cfinclude template="/UDF/udf_library.cfm">