我使用的是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 ary.cfm和udf_powerreview.cfm。
问题是,当我调用另一个页面中的函数时,我得到一个错误,指出该函数不存在。当我可以复制函数并将其直接放到使用它的页面中时,它工作得很好。而且,我没有得到“例程不能声明两次”的错误。
在我构建的每个站点中,我都会以完全相同的方式创建一个udf_library.cfm或udf_library.cfc。它们总是工作得很好。
是什么阻止了这些功能的可用和访问?是否有需要设置的应用程序设置?
发布于 2012-02-01 23:10:54
这是一个页面范围的问题。不要把Application.cfm看作是所有页面上的include,只要知道它首先运行即可。它初始化的一些东西会带到你现有的页面作用域中,而另一些东西则不会。用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#">发布于 2012-02-01 07:26:52
这是我使用的一种策略。这基本上将UDF称为"on demand“。如果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>发布于 2012-02-01 10:20:44
我怀疑相对路径有问题。
你能让"UDF“成为一个映射吗?然后你可以这样做
<cfinclude template="/UDF/udf_library.cfm">https://stackoverflow.com/questions/9088170
复制相似问题