0

我正在使用 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。他们总是工作得很好。

什么可能会阻止这些功能可用和访问?是否有需要设置的应用程序设置?

4

3 回答 3

1

Here is one strategy that I use. This basically calls the UDFs "on demand". It won't reimport the UDFs if it already exists. You do however have to have named arguments however, otherwise you'd have to strip out the UDFName out of the argument collection. I'm worried however that argument order might not be preserved, I haven't investigated that.

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-01-31T23:26:52.490 回答
1

这是一个页面范围问题。不要将 Application.cfm 视为所有页面上的包含,只要知道它首先运行即可。它初始化的东西会延续到您现有的页面范围,而有些东西不会。使用 Application.cfc 而不是 application.cfm 可以消除很多歧义。

为了使您的 UDF 可用于您的整个应用程序,我建议使用“单例”设计模式。首先获取您的 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-01T15:10:53.987 回答
0

我怀疑相对路径有问题。

你能把“UDF”做一个映射吗?然后你可以做

<cfinclude template="/UDF/udf_library.cfm">
于 2012-02-01T02:20:43.813 回答