首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在application.cfm中包含UDF_library?

如何在application.cfm中包含UDF_library?
EN

Stack Overflow用户
提问于 2012-02-01 06:45:56
回答 3查看 431关注 0票数 0

我使用的是ColdFusion 8.0.1

我正在处理一个有数千页的现有应用程序。我正在尝试在我的application.cfm文件中包含一个新的UDF库。

我在application.cfm中添加了这一行:

代码语言:javascript
复制
<!--- UDF library include --->
<cfinclude template="UDF/udf_library.cfm">

UDF库包括其他包含UDF的文件,如下所示:

代码语言:javascript
复制
<cfinclude template="udf_powerreview.cfm">

我在udf_powerreview.cfm文件中有一些函数,例如:

代码语言:javascript
复制
// 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。它们总是工作得很好。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-01 23:10:54

这是一个页面范围的问题。不要把Application.cfm看作是所有页面上的include,只要知道它首先运行即可。它初始化的一些东西会带到你现有的页面作用域中,而另一些东西则不会。用Application.cfc代替application.cfm可以解决很多歧义。

要使您的UDF对整个应用程序可用,我建议使用"Singleton“设计模式。首先,将您的UDF放入CFC格式。这将使它们更加便携。

在您的application.cfm中,您可以放入以下行:

代码语言:javascript
复制
<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中,您应该能够在任何页面上看到您的函数。

代码语言:javascript
复制
<cfdump var="#session.udf_powerreview#">
票数 1
EN

Stack Overflow用户

发布于 2012-02-01 07:26:52

这是我使用的一种策略。这基本上将UDF称为"on demand“。如果UDF已经存在,它不会重新导入UDF。但是,您必须具有命名参数,否则您必须将UDFName从参数集合中剔除。然而,我担心的是,论点的顺序可能不会被保留,我还没有调查过。

application.cfm

代码语言:javascript
复制
<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

代码语言:javascript
复制
<cfoutput>
#udf(udfname='testUDF',firstname='John',lastname='Smith')#<br/>
#udf(udfname='testUDF',firstname='Betty',lastname='Ford')#<br/>
</cfoutput>

/udfs/testudf.cfm

代码语言:javascript
复制
<cfscript>
function testUDF() {
    return 'Hello ' & arguments.firstname & ' #arguments.lastname#';
}
</cfscript>
票数 1
EN

Stack Overflow用户

发布于 2012-02-01 10:20:44

我怀疑相对路径有问题。

你能让"UDF“成为一个映射吗?然后你可以这样做

代码语言:javascript
复制
<cfinclude template="/UDF/udf_library.cfm">
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9088170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档