如何在application.cfm中包含UDF_library?

时间:2012-01-31 22:45:56

标签: coldfusion coldfusion-8 application.cfm

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

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

3 个答案:

答案 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">